console.log( 0 == '0' ); // true
console.log( 0 == [] ); // true
console.log( [] == '0' ); // false

为什么JavaScript会像这样评估表达式?
答案 0 :(得分:22)
简而言之,数字0
是假的,字符串"0"
不是。
但是,当使用double equals时,JavaScript会尝试强制类型。所以你从这个
得到了真实console.log( 0 == '0'); // true
由于JavaScript已经强制攻击数字。
下一个:
console.log( 0 == [] ); // true
这有点令人困惑,因为空数组是真实的,零是假的。但是,如果您将一个空数组强制转换为数字,则会得到它的长度 - 这是零。因此,这个实际上是在对密码进行编号后评估0 == 0
。
有了这个:
console.log( [] == '0'); // false
JavaScript不能将它们强制转换为相同的类型 - 而另一种则是伪造的,而另一种则不是。
总之,这就是为什么使用三等于一般更安全,它检查类型和相等。
下面的一个方便的插图
function truthyOrFalsy(val) {
return val ? "Truthy" : "Falsy";
}
console.log("empty array:", truthyOrFalsy([]));
console.log("number zeroL", truthyOrFalsy(0));
console.log("string with a zero character:", truthyOrFalsy("0"));

答案 1 :(得分:7)
/*
If Type(x) is Number and Type(y) is String,
return the result of the comparison x == ToNumber(y).
*/
console.log( 0 == '0');
/*
If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
*/
console.log( 0 == [] );
/*
If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.
*/
console.log( [] == '0');
答案 2 :(得分:5)
Truthy和Falsy 除了一个类型,每个值也有一个固有的布尔值,通常称为truthy或falsy。有些规则有点奇怪,因此在调试JavaScript应用程序时理解比较的概念和效果会有所帮助。
以下值始终是假的:
其他一切都是真实的。这包括:
使用==松散等式比较truthy和falsy值时可能会发生意外情况:
参见松散平等比较表
答案 3 :(得分:0)
JavaScript使用类型转换将任何值强制转换为需要它的上下文中的布尔值,例如条件和循环。
在第一种情况下
console.log( 0 == '0');
javascript使用coerceing并将两者都转换为数字并进行比较。现在0 == 0所以返回true。
在第二种情况下
console.log( 0 == [] );
两者都是假的(虚假值是在布尔上下文中计算时转换为false的值)。所以现在比较false == false,返回真值。
第三种情况
console.log( [] == '0');
[]是假的,'0'是字符串,js无法强制它们转换为可以比较的类型。如此虚假。