为什么" 0" == []错误?

时间:2017-10-30 12:31:11

标签: javascript



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




为什么JavaScript会像这样评估表达式?

4 个答案:

答案 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');

来源:http://es5.github.io/#x11.9.3

答案 2 :(得分:5)

Truthy和Falsy 除了一个类型,每个值也有一个固有的布尔值,通常称为truthy或falsy。有些规则有点奇怪,因此在调试JavaScript应用程序时理解比较的概念和效果会有所帮助。

以下值始终是假的:

  • 0(零)
  • ''或"" (空字符串)
  • 未定义
  • NaN(例如1/0的结果)

其他一切都是真实的。这包括:

  • ' 0' (包含单个零的字符串)
  • '假' (包含文本“false”的字符串)
  • [](空数组)
  • {}(空对象)
  • function(){}(“空”函数)

使用==松散等式比较truthy和falsy值时可能会发生意外情况:

参见松散平等比较表

Table for loose equality comparison with ==

答案 3 :(得分:0)

JavaScript使用类型转换将任何值强制转换为需要它的上下文中的布尔值,例如条件和循环。

在第一种情况下

console.log( 0 == '0'); 

javascript使用coerceing并将两者都转换为数字并进行比较。现在0 == 0所以返回true。

在第二种情况下

console.log( 0 == [] );

两者都是假的(虚假值是在布尔上下文中计算时转换为false的值)。所以现在比较false == false,返回真值。

第三种情况

console.log( [] == '0'); 

[]是假的,'0'是字符串,js无法强制它们转换为可以比较的类型。如此虚假。