Javascript:一种检查value是否为众多常量之一的优雅方式

Javascript: Elegant way to check if value is one of many constants

本文关键字:常量 方式 是否 一种 value 检查 Javascript      更新时间:2023-09-26

我有一个像这样的对象(打算作为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"))