[英]Why || operator is behaving like this?
为什么_value
在第二次函数调用时是foo
? 我花了一段时间才发现这个bug。
function doSomething(value) { console.log('should be:', value); const _value = value || Math.random() > 0.5 ? 'foo' : 'bar'; console.log('actually is:', _value); } let values = ['foo', 'bar']; const first = doSomething(values[0]); const second = doSomething(values[1]);
为了更好地理解,我在测试代码周围添加了一个括号:
(value || Math.random() > 0.5)
由于value
始终定义( non null
),因此条件值为true并将'foo'
' _value
为' _value
'
希望这能为您解释。
因为表达
const _value = value || Math.random() > 0.5 ? 'foo' : 'bar';
被评估为:
const _value = (value || (Math.random() > 0.5)) ? 'foo' : 'bar';
条件运算符的优先级低于表达式中的其他运算符。
value
是非空字符串,因此在布尔上下文中计算结果为true
。 因此,条件评估为true
,最终结果始终为'foo'
。
因为:
> 'bar' == true
false
所以:
const _value = value || Math.random() > 0.5 ? 'foo' : 'bar';
_value
将被随机赋值为'foo'
或'bar'
,因为value
为'bar'
,其值为false
,因此or-expression ||
后半部分 被评估并分配给_value
。
试试这个。
const _value = value || (Math.random() > 0.5 ? 'foo' : 'bar');
因为你的代码中的JS会检查这样的
`if(value || Math.random() > 0.5){
_value = 'foo';
}else{
_value ='bar'
}`
构造const a = b || c
const a = b || c
是常见的Javascript简写。 它的意思是:
如果b
不是假的,则将其分配给a
。 否则将c
分配给a
。
它也可以写成const a = b ? b : c;
const a = b ? b : c;
要么
const a;
if (b) a = b;
else a = c;
一般来说,如果值为空或值为零,则该值是假的 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.