为什么以下是真的:“狗”===(“猫”和“和狗”)

时间:2014-02-17 13:36:54

标签: javascript

为什么&&运算符返回最后一个值(如果该语句为真)?

("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

Fiddle

5 个答案:

答案 0 :(得分:11)

Logical Operators - && (MDN)

  

如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两者都返回true   操作数是真的;否则,返回false。

对于表达式"Cat" && "Dog",第一个表达式"Cat"无法转换为false或布尔值,因此返回"Dog"

答案 1 :(得分:2)

  

为什么&&运算符返回最后一个值?

因为这就是它的作用。在其他语言中,&&运算符返回布尔值truefalse。在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"