如果空数组
[]
在 JavaScript 中是 falsy 那么为什么当用作三元运算符中的谓词时,运算符会评估为第一个选项?
console.log([] == false); // prints true
console.log([] ? 0 : 1); // prints 0 !
数组不是假的;这可以用
console.log([] === false)
或 console.log(!![])
来证明
通过
==
操作数进行左右比较时,JavaScript 会尝试将输入强制为通用类型。
在第一个示例
[] == false
中,会发生以下情况:
Boolean
,因此将其转换为Number
值,结果比较为[] == 0
。Object
,因此它被转换为基元;在这种情况下,通过 String
得到 [].toString()
,导致比较结果为 "" == 0
。String
,因此它会转换为 number
值,从而得到 0 == 0
。Number
原语,因此比较它们的值,从而得出真实条件对于
[] ? 0 : 1
的第二个示例,没有右侧值可供比较,因此它只是测试输入是否为真。该数组不是 undefined
、null
、0
、""
或 NaN
,因此它被视为 true,因此返回 'true' 选项: 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
我希望它有帮助。
添加上述答案..
要获取任何值的真实布尔值,您可以在其前面加上
!!
(这样您就不会遇到任何强制问题);
根据您的情况,您可以这样做:
console.log(!![] == false) //logs false