如果JavaScript中的空数组[]
为falsy那么为什么当用作三元运算符中的谓词时,运算符会逃避第一个选项?
console.log([] == false); // prints true
console.log([] ? 0 : 1); // prints 0 !
答案 0 :(得分:12)
首先,空数组不是假的,要使用!!
得到实际的布尔值前缀,例如:console.log(!![]) // true
你从第一次比较得到的结果是由于强制。通过==
操作数进行左右对比时,JavaScript会尝试将输入强制转换为公共类型,如下所示:
Boolean
,因此会将其转换为Number
值,从而导致比较为[] == 0
。Object
,因此它被转换为基元;在这种情况下String
通过[].toString()
,导致比较为"" == 0
。String
,因此会转换为number
值,从而产生0 == 0
。Number
原语,因此会对它们的值进行比较,从而产生条件使用第二个表达式,没有比较的右手,所以它只是测试输入是否真实。该数组不是null
,undefined
,0
,""
或NaN
,因此,它是真实的。
要强制在两个输入之间进行非强制性比较,您应该使用===
操作数。
Ecma Standard 6th edition Entry on Coercion
JS Coercion Explained
答案 1 :(得分:1)
添加上述答案..
获取任何值的真正布尔值,你可以用!!
作为前缀(这样你就不会在任何强制问题中运行);
在你的情况下,你可以这样做:
console.log(!![] == false) //logs false
答案 2 :(得分:0)
要记住。
Javascript有两种类型的比较运算符:
严格===
:检查类型和值
类型转换:==
仅检查值。
尝试这些并检查结果:
console.log([] === false); //prints false
console.log([] == false); //prints true
console.log(0 == false); //prints true
console.log(1 == "1") // prints true
console.log(1 === "1") //prints false
我希望它有所帮助。