我有一个像这样的对象(打算用作枚举):

var CardEnum =
{
    CA: 101,
    C2: 102,
    C3: 103,
    C4: 104,
    C5: 105,
    C6: 106,
    C7: 107,
    C8: 108,
    C9: 109,
    C10: 110,
    CJ: 111,
    CQ: 112,
    CK: 113,

    DA: 201,
    D2: 202,
    D3: 203,
    D4: 204,
    D5: 205,
    D6: 206,
    D7: 207,
    D8: 208,
    D9: 209,
    D10: 210,
    DJ: 211,
    DQ: 212,
    DK: 213,

    SA: 301,
    S2: 302,
    S3: 303,
    S4: 304,
    S5: 305,
    S6: 306,
    S7: 307,
    S8: 308,
    S9: 309,
    S10: 310,
    SJ: 311,
    SQ: 312,
    SK: 313,

    HA: 401,
    H2: 402,
    H3: 403,
    H4: 404,
    H5: 405,
    H6: 406,
    H7: 407,
    H8: 408,
    H9: 409,
    H10: 410,
    HJ: 411,
    HQ: 412,
    HK: 413
};


我有一个这样的功能:

function myFunc(card)
{
    if (card == null)
    {
        // throw exception
    }

    // do something with card
}


我打算这样使用它:

myFunc(CardEnum.D7);


但是,如果有人这样使用,我如何确保它引发异常:

myFunc(170);
myFunc(103.5);


我必须检查传递的值是CardEnum对象的键值之一。有没有一种优雅的方法可以做到这一点而又无需遍历CardEnum对象的所有键?

只是要清楚,这是可以的:

myFunc(311);

最佳答案

最安全的选择是更改传递给函数的内容。
传递卡名,而不是其值:

function myFunc(card) {
    if (!CardEnum[card]) {
        // throw exception
        throw new Error('Invalid card passed to myFunc!');
    }

    // do something with card
}


代替myFunc(CardEnum.D7);,您调用myFunc('D7');

这样,用户不能只是将任意值传递给函数。相反,您必须将卡名传递给该函数,否则,它将引发错误。

如果必须允许0作为值,则可以使用:

if (!CardEnum[card] != null) {


但是,我建议不要使用!= null,因为它还允许传递其他虚假值,例如:“'',false,NaN。

这将是一个更安全的选择:

if (!CardEnum[card] && CardEnum[card] !== 0) {

09-26 14:20