【问题标题】:Javascript - Replace undefined with 0Javascript - 用 0 替换未定义
【发布时间】:2014-12-05 16:14:14
【问题描述】:

我有一个由用户输入定义的变量。只有当它是undefined 时,我才想替换它的值。但如果是NaN,则不是。我该怎么做?

我尝试做 x || 0 但这也替换了 NaN 值。

【问题讨论】:

  • typeof x === 'undefined'
  • 请出示您的代码。
  • 让我们看看,我将如何检查某些内容是否未定义?听起来我可能会测试一些东西!也许我可以试试if 声明。但条件是什么?也许这将是一个“平等”条件,你知道,它是===。所以只是猜测,但也许x === undefined 会起作用,或者完成if 语句if (x === undefined)。在那里,这并不难。
  • @blgt 实际上即使他不知道严格相等,他也可以做​​到x == undefined,希望他知道这一点,并且它会起作用,除了拾取 null 之外,这将是一个单独的问题,他可以向 SO 发布。 :-)

标签: javascript nullish-coalescing


【解决方案1】:

对于 ES6 用户,您可以这样做:

x ?? 0

??Nullish coalescing operator

一个逻辑运算符,当其左侧操作数为空或未定义时返回其右侧操作数,否则返回其左侧操作数。

【讨论】:

    【解决方案2】:

    您可以与undefined 值进行严格比较。

    if (x === undefined) {
        x = 0;
    }
    

    当然,您需要确保 x 已像往常一样正确声明。

    如果您对undefined 值受到非常糟糕的代码(被新值覆盖)的困扰有任何敏感性,那么您可以使用void 运算符来获得有保证的undefined。您可以严格执行与undefined 值比较。

    if (x === void 0) {
        x = 0;
    }
    

    void 的操作数无关紧要。不管你给它什么,它都会返回undefined

    这些都是等价的:

    if (x === void undefined) {
        x = 0;
    }
    
    if (x === void "foobar") {
        x = 0;
    }
    
    if (x === void x) {
        x = 0;
    }
    

    最终,如果有人在本地压缩了undefined(它不能再全局压缩了),最好修复那个坏代码。


    如果您想同时检查nullundefined,并且只检查这些值,您可以使用== 而不是===

    if (x == null) {
        x = 0;
    }
    

    现在x 将设置为0,如果它是nullundefined,但不是任何其他值。您也可以在测试中使用undefined。完全一样。

    if (x == undefined) {
        x = 0;
    }
    

    从您的问题来看,您似乎是在专门寻找number 元素,甚至是NaN。如果您想将其限制为包括NaN 在内的原始数字,请使用typeof 进行测试。

    if (typeof x !== "number") {
        x = 0;
    }
    

    但是,您会丢失可以成功转换为数字的数字字符串和其他值,因此这取决于您最终需要什么。

    【讨论】:

    • 如果我有这样定义的变量怎么办:var x = parseFloat(self.y());在这种情况下,无论 x 是 undefined 还是 NaN,x 总是变为 NaN。有什么方法可以检查 X 是否未定义?
    • @user3312508:您只需使用if 语句。您是说如果x 不是undefined,那么您想运行parseFloat(self.y()); 部分并将其分配给x,对吧?
    【解决方案3】:

    您可以使用 typeof 进行测试(除其他外):

    if (typeof x == 'undefined') x = y;
    

    另一种方法是针对 undefined 测试严格相等性:

    if (x === void 0) x = y
    

    在这种情况下,我们使用void 0 作为安全措施,因为undefined 实际上可以重新定义。

    【讨论】:

    • “因为 undefined 实际上可以重新定义。” 从 ES5 开始没有。
    • 当然,但实际上,我不建议让那些不知道如何编写 if 语句来比较 undefined 与奥秘的人混淆,例如 void 0 及其与undefined 被重新定义的可能性几乎不存在,这是我在十多年的 JS 编程中从未见过的。
    • @torazaburo: "...这是我在十多年的 JS 编程中从未见过的东西" 你和我都是。让我感到奇怪的是,人们痴迷于重新定义或影响全球 undefined,而不是任何其他全球。
    • 我实际上同意,但我将其包括在内,因为在我看来,它在过去几年中已成为标准做法,至少在许多主要图书馆中,而且我认为提供更有意义常见的实践解决方案比我碰巧喜欢的解决方案。实际上我自己不会这样做。
    • 不想让它听起来像我以为你对它很着迷。我认为几乎必须包含一些“受保护”的版本,否则外面的人会吓坏的。
    【解决方案4】:

    你可以很快做到这一点,只需一个

    x === undefined && (x = 0);
    

    【讨论】:

    • 这是一种糟糕的语法,大多数 linter 都会失败。
    • 我接受 linter 会抱怨意外的分配,但我不明白为什么这是“糟糕的语法”。它利用了逻辑运算符可以短路的事实。
    • 让 minifiers 做这种重写,他们中的大多数人都会这样做。对于普通人来说,把 if 语句写成 if 语句。
    【解决方案5】:

    男孩。也许你可以试试这个,你好,男孩。也许你可以试试这个,你好,男孩。也许你可以试试这个,你好,男孩。也许你可以试试这个,你好,男孩。也许你可以试试这个

    var a;//undefined
    a = ~~a
    console.log(a)//0
    

    【讨论】:

    • 嗨,您可以编辑您的答案以描述 ~~ 运算符是什么,而不是您编写的重复文本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多