【问题标题】:What is the purpose of "x = x || 0"? [duplicate]“x = x || 0”的目的是什么? [复制]
【发布时间】:2014-02-11 22:54:08
【问题描述】:

在浏览我在网上找到的一些代码时,我发现了这段特殊的代码行(Javascript):

function values(b) {
    this.b = b || 0;
}

我根本无法弄清楚||0 的用途。如果我没记错的话,因为|| 返回一个布尔值,所以这个值,b 将始终是参数的布尔等效值。如果b 作为true 传递(即1true),那么b 应该为true;否则,使用false 值之一(即NaN0),这应该是错误的。然后我将其解释为:

btrue:

this.b = true || false; // will evaluate to true

bfalse

this.b = false || false; // will evaluate to false

我只是看不到通过添加||0 获得的价值。有人可以向我解释一下吗?

【问题讨论】:

  • ||如果左边是假的,而不是布尔值,则返回右边的表达式,除非布尔表达式恰好在“||”的右边...它将 null、undefined、""、false 等变为零。
  • 在这种情况下,它被用作默认值。当你调用new values()而不带b参数时,它会将b设置为0。相关programmers.stackexchange.com/q/203469/56971
  • 如果b 是一个假值,this.b 将被设置为0

标签: javascript


【解决方案1】:

|| 在变量赋值中是指定默认值的常用方法。这是因为 JavaScript 的虚假值。在 JavaScript 中,undefinednull、空字符串和0 在布尔上下文中都计算为false

例如:

var blah = undefined;
if (blah) {
    console.log('got it!');
}
else {
    console.log('not true!');  // this one outputs
}

在赋值中使用|| 是一种表达“如果已定义,则使用它”的方式。

对于这段代码,

function values(b) {
    this.b = b || 0;
}

我们可以使用真值表:

b          this.b
------------------
5          5
10         10
0          0
undefined  0
null       0
''         0

真正感兴趣的值是undefinednull。所以我们真正想要的是:

if (b !== undefined && b !== null) {
    this.b = b;
}
else {
    this.b = 0;
}

但是this.b = b || 0 写起来要短得多。

【讨论】:

  • 另请注意,即使b0false,也会发生这种情况。
【解决方案2】:

这是一个非常经典的问题,被比较频繁地抛出。

使用 x = x || 0 之类的主要目的是确保 x 将具有 false 布尔值,正如您所描述的,而不是 null 或 @987654324 @,你返回0

使用上述而不是说x = x || false 的原因是您最终将返回 0(更容易操作基于整数或浮点的数据)而不是其他值。

你所建议的一切都是相对正确的。例如:

var x = x || false; // False
var y = x || 0;     // 0
var z = x || null;  // Null
alert(x);
alert(y);
alert(z);

如果您有使用truefalse 值的目的,您的建议将完全足够。

【讨论】:

    【解决方案3】:

    ||只有当它的两个操作数都是布尔值时才返回一个布尔值。否则,它返回(从左到右)第一个不是“虚假”的操作数,如果找不到,则返回最后一个。

    在该函数中,this.b 是一个数字,但该函数的 b 参数是可选的(因此它可以是 undefined)。为了使this.b 始终是一个数字,他们使用了它。所以如果你没有通过b,它看起来像:

    this.b = undefined || 0
    

    this.b 将被设置为零,因为undefined 总是“假”。

    关于真与假的资源:@​​987654321@

    逻辑运算符背后的逻辑:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

    【讨论】:

      【解决方案4】:

      这些都是等价的:

      this.b = b || 0;

      if (b) { this.b=b } else { this.b=0 }

      this.b = b ? b : 0;

      this.b = 0; if (b) this.b=b;

      显然第一个打字少。

      第一个有效的原因在 MDN 上有很好的描述: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

      简而言之:

      &&|| 运算符有一个特殊的功能,即评估值的真实性,但返回的值不仅仅是truefalse

      在您的情况下,expr1 || expr2 将返回 expr1,如果其评估结果为真,否则将返回 expr2

      【讨论】:

        【解决方案5】:

        这是一种定义参数默认值的方法。 如果bundefined,那么this.b 就变成0

        【讨论】:

        • (虽然它也会“意外”捕获像 "" 这样的值,但它通常用于将 undefined 合并为默认值。)
        【解决方案6】:

        它在缺少参数或返回的情况下提供默认值 (undefined)。这对新手来说是惯用的和令人困惑的,但它比让事情顺其自然更好undefined。在|| 0 的情况下,也许您稍后会做一些数学运算,如果没有指定默认值,您将开始到处看到NaN

        【讨论】:

          猜你喜欢
          • 2011-05-04
          • 2014-11-06
          • 2019-03-27
          • 2021-11-18
          • 2023-03-04
          • 1970-01-01
          • 2022-01-26
          • 2015-07-05
          • 2010-09-16
          相关资源
          最近更新 更多