繁体   English   中英

为什么||运营商的表现如此?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM