在查看我在网上找到的一些代码时,我发现了这个特殊的代码行(Javascript):
function values(b) {
this.b = b || 0;
}
我根本无法弄清楚||0
的目的是什么。如果我没有弄错,因为||
返回一个布尔值,这个值b
将始终是参数的布尔等效值。如果b
传递为真(即1
或true
),则b
应为真;否则,使用其中一个false
值(即NaN
,0
),这应该是错误的。然后我将其解释如下:
b
是true
:
this.b = true || false; // will evaluate to true
b
是false
:
this.b = false || false; // will evaluate to false
我只是看不到添加||0
所获得的价值。有人可以向我解释一下吗?
答案 0 :(得分:13)
||
是指定默认值的常用方法。这是因为JavaScript的虚假值。在JavaScript中,undefined
,null
,空字符串和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
真正感兴趣的值是undefined
和null
。所以我们真正想要的是:
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);
如果您的目的是使用true
或false
值,那么您的建议就足够了。
答案 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
简而言之:
&&
和||
运算符具有一项特殊功能,可以评估值的真实性,但会返回值,而不仅仅是true
或false
。
在您的情况下,expr1 || expr2
如果评估为true,则会返回expr1
,否则将返回expr2
。
答案 4 :(得分:0)
这是一种定义参数默认值的方法。
如果b
为undefined
,则this.b
变为0
。
答案 5 :(得分:0)
如果缺少参数或返回值(undefined
),它会给出默认值。对于新手而言,这是惯用的,令人困惑的,但这不仅仅是让事情变得更好undefined
。在|| 0
的情况下,也许你稍后会做一些数学运算,如果没有默认值,你就会开始在任何地方看到NaN
。