为什么&&
运算符返回最后一个值(如果该语句为真)?
("Dog" == ("Cat" || "Dog")) // false
("Dog" == (false || "Dog")) // true
("Dog" == ("Cat" && "Dog")) // true
("Cat" && true) // true
(false && "Dog") // false
("Cat" && "Dog") // Dog
("Cat" && "Dog" && true) // true
(false && "Dog" && true) // false
("Cat" && "Dog" || false); // Dog
答案 0 :(得分:11)
如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两者都返回true 操作数是真的;否则,返回false。
对于表达式"Cat" && "Dog"
,第一个表达式"Cat"
无法转换为false或布尔值,因此返回"Dog"
答案 1 :(得分:2)
为什么&&运算符返回最后一个值?
因为这就是它的作用。在其他语言中,&&
运算符返回布尔值true
或false
。在Javascript中,它返回第一个或第二个操作数,这也是因为这些值本身已经是“truthy”或“falsey”。
因此'Cat' && 'Dog'
会产生值'Dog'
,等于'Dog'
。
答案 2 :(得分:2)
这样想&&
in JavaScript(基于es5 spec的 ToBool )
function ToBool(x) {
if (x !== undefined)
if (x !== null)
if (x !== false)
if (x !== 0)
if (x === x) // not is NaN
if (x !== '')
return true;
return false;
}
// pseudo-JavaScript
function &&(lhs, rhs) { // lhs && rhs
if (ToBool(lhs)) return rhs;
return lhs;
}
现在您可以看到ToBool("Cat")
为true
,因此&&
将rhs
提供"Dog"
,然后===
正在执行"Dog" === "Dog"
true
1}},表示该行提供||
。
为了完整性,可以将// pseudo-JavaScript
function ||(lhs, rhs) { // lhs || rhs
if (ToBool(lhs)) return lhs;
return rhs;
}
运算符视为
{{1}}
答案 3 :(得分:0)
因为你问过true === (true && true)
。如果在布尔运算中使用非布尔值,则javascript将转换为布尔值。非空字符串为“true”,因此返回正确。
答案 4 :(得分:0)
我猜测语言设计师希望用户能够使用||作为“合并”运算符的运算符,例如, “null coalesce”运算符??在C#。
换句话说,如果你想要一个默认值,你可以使用以下习语:
var x = input || "default";
//x will be equal to input, unless input is falsey,
//then x will be equal to "default"