为什么这会失败?
我读这段代码的方式是“如果a或b或c等于3,那么该陈述为真”。但显然JavaScript不同意。为什么呢?
function test() {
var a = 'one';
var b = 'two';
var c = 'three';
return ( ( a || b || c ) === 'three' );
}
编辑:我知道我需要分别评估每个表达式,但是正在寻找一种更快的方法来编写它。我们欢迎任何建议。
答案 0 :(得分:5)
您对代码的阅读不正确。翻译成其他形式:
if (a) {
return a === "three";
}
if (b) {
return b === "three";
}
if (c) {
return c === "three";
}
子表达式(a || b || c)
会返回不是“假”的a
,b
或c
中的第一个。这是a
,因为其值为"one"
,因此这是与"three"
进行比较的整体价值。
答案 1 :(得分:2)
表达式( a || b || c )
以先来先到先得的方式返回任何 truthy 。
这里a
是真实的,因此被使用。如果a
falsey b
将被使用。如果它也是 falsey ,则会使用c
。
因此,您总是最终比较"one" == "three"
,因为字符串被视为 truthy 。在这种情况下,你可以使用Array.some
,用你的话来做你想要的或你想要它的行为
“如果a或b或c等于3,则该陈述为真”
return [a,b,c].some(function(str){
return str == "three";
});
答案 2 :(得分:1)
这评估为a,b或c(将为真或假)字符串等效于“3”。哪个永远是假的。 为了达到你想要的效果,你需要
return (a === 'three') || (b === 'three') || (c === 'three');