我有一个像这样的对象(打算用作枚举):
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) {