我有一个像这样的对象(打算作为enum工作):
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) {
尝试使用Object.hasOwnProperty()
var CardEnum = function() {
// object
this.card = {D7: 207};
this.myFunction = function(prop) {
// if `this.card` does not have property `prop`,
// passed as argument to `this.myFunction`,
// throw error
if (!this.card.hasOwnProperty(prop)) {
throw new Error(prop + " not found")
// else log `this.card[prop]` to `console`
} else {
console.log(this.card[prop])
}
};
};
// returns object containing `this.card` , `this.myFunction`
var card = new CardEnum();
// call `card.myFunction`
console.log(card.myFunction("D7"), card.myFunction("D123"))
var CardEnum = function() {
this.card = {
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
};
this.myFunction = function(prop) {
if (!this.card.hasOwnProperty(prop)) {
throw new Error(prop + " not found")
} else {
console.log(this.card[prop])
}
};
};
var card = new CardEnum();
console.log(card.myFunction("D7"), card.myFunction("D123"))