Javascript:检查值是否是许多常量之一的优雅方法

Javascript:检查值是否是许多常量之一的优雅方法,javascript,Javascript,我有一个对象(打算用作枚举),如下所示: 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,

我有一个对象(打算用作枚举),如下所示:

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);
我有这样一个函数:

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);
我打算这样使用它:

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);
但是,如果有人这样使用它,我如何确保它抛出异常:

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
,因为这也允许传递其他falsy值,例如:`',false,NaN

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

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

尝试使用
Object.hasOwnProperty()

var CardEnum=function(){
这张卡={
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,
丹麦:213,
SA:301,
S2:302,
S3:303,
S4:304,
S5:305,
中六: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,
总部:412,
香港:413
};
this.myFunction=函数(prop){
如果(!this.card.hasOwnProperty(prop)){
抛出新错误(prop+“未找到”)
}否则{
console.log(此.card[prop])
}
};
};
var card=new CardEnum();

console.log(card.myFunction(“D7”)、card.myFunction(“D123”))
您想在这里实现什么?如果用户可以向该函数发送任何数据,则他们可以删除您可以在该函数中添加的任何检查,以验证数据。使用CardEnum中的
卡作为
0
false
或任何其他false值将在此函数中引发错误case@Tushar:所有有效卡都有真实值。在
中不需要
CardEnum[card]
将只返回卡的号码,或者
未定义的
。现在,是的!但在将来,当OP可能想要添加
0
时,这会抛出错误,是否会向一副完整的牌组添加更多的牌?那是作弊。啊!我不知道那些是卡片。我想OP想检查卡中是否存在
170
值,而不是
from
myFunc(170);myFunc(103.5)示例,你怎么想。试着实际解释那里发生了什么。你改变了很多OP的代码,却没有解释它的功能。