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,
    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/

相关文章:

javascript - 如何使用观察者来检查div是否可见? (也许Azure服务器有问题?)

javascript - 使用dialogflow将多个参数写入firestore数据库

JavaScript 不能在 IE9 上运行,但可以在其他浏览器上运行?怎么了?

javascript - AngularJS 中的动态表单字段

javascript - 状态更改授权组件后, native 渲染 View 不会更新

javascript - JSON - 在 Internet Explorer 8 中不起作用

javascript - 使用jquery避免同一张表中的重复数据

javascript - 使用 Node(和 Django)的服务器端 javascript

javascript - 如何附加到从闭包创建的 JavaScript 命名空间?

javascript - 如何在javascript验证之前 trim 非必填字段