“x = x || 0”的目的是什么?

时间:2014-01-22 03:17:04

标签: javascript

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

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

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

btrue

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

bfalse

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

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

6 个答案:

答案 0 :(得分:13)

变量赋值中的

||是指定默认值的常用方法。这是因为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写得更短。

答案 1 :(得分:3)

这是一个非常经典的问题,相对频繁地被抛弃。

使用x = x || 0等内容的主要目的是确保x具有 false 值布尔值,如您所述,但不是null 1}}或false,您将返回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值,那么您的建议就足够了。

答案 2 :(得分:1)

||仅在其两个操作数均为布尔值时才返回布尔值。否则,它返回(从左到右)第一个不是“falsy”的操作数,或者如果它找不到的话,返回最后一个操作数。

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

this.b = undefined || 0

this.b将设置为零,因为undefined始终是“假的”。

关于truthy vs falsy的资源:http://www.sitepoint.com/javascript-truthy-falsy/

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

答案 3 :(得分:1)

这些都是等价的:

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如果评估为true,则会返回expr1,否则将返回expr2

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果缺少参数或返回值(undefined),它会给出默认值。对于新手而言,这是惯用的,令人困惑的,但这不仅仅是让事情变得更好undefined。在|| 0的情况下,也许你稍后会做一些数学运算,如果没有默认值,你就会开始在任何地方看到NaN