我有一个像这样的对象(旨在用作枚举):
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('D7'); 而不是
myFunc(CardEnum.D7);
,
这样,用户就不能将任意值传递给函数。相反,您必须将卡名称传递给函数,否则,它将引发错误。
如果您有允许0
作为值,那么这将起作用:
if (!CardEnum[card] != null) {
但是,我建议不要使用 != null
,因为这也允许传递其他虚假值,例如:`''、false、NaN。
这将是一个更安全的选择:
if (!CardEnum[card] && CardEnum[card] !== 0) {
关于Javascript:检查值是否是多个常量之一的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274707/