我读到有时候&&运算符用于“短路”JavaScript,认为返回值0为0而不是NaN,因为0是JavaScript中的错误数字。我一直在四处寻找这一切意味着什么。有人可以向外行解释吗?
例如:
function sign(number) {
return number && number / Math.abs(number); }
如果number
为0,则返回0。
答案 0 :(得分:6)
这听起来像我之前看到的答案,但现在找不到(链接会有所帮助),但你在这里得到了错误的结局。
鉴于以下情况:
foo = 0 ;
bar = foo && 2 / foo;
在第二行,将评估foo。它是0
,因此是假值。 &&
(foo
)的左侧将被退回并分配给bar
。
现在,如果我们有foo = 1
:
foo = 1 ;
bar = foo && 2 / foo;
同样,将评估foo
。这是一个真正的值,因此&&
的右侧将被评估并返回。 2 / foo
为2
,因此2
已分配给bar
。
“短路”只是意味着只要&&
的一部分失败,它就会返回失败的部分,而不会向右边评估任何内容。
答案 1 :(得分:4)
在JavaScript中,布尔运算符&&
和||
不一定返回布尔值。相反,他们会看到他们论点的“真实性”,并可能因此而短路。某些值如0
,空字符串""
和null
都是“假的”。
短路只是意味着跳过表达式右侧的评估,因为左侧足以提供答案。
例如:var result = 100 / number;
之类的表达式会在NaN
时为您提供number = 0
,但是:
var result = number && 100 / number;
由于0
是假的,因此会向您NaN
而不是0
。在布尔上下文中false && anything
是false
,因此评估右侧没有意义。类似地:
// supposed msg is a potentially empty string
var message = msg || "No message";
如果字符msg
不为空(真实),则会msg
,因为true || anything
为true
。如果msg
为空,则会显示"No message instead"
。
答案 2 :(得分:1)
我想我理解你的意思,然而,事实并非如此。
var some_bool = (func_a() && func_b());
现在,当func_a返回false时,func_b确实没有被调用。但是,当它返回NaN(就像0,等于false)时,它仍然返回false!