这个问题在这里已经有了答案:
How does JS type coercion work?
(2 个回答)
4年前关闭。
console.log( 0 == '0' ); // true
console.log( 0 == [] ); // true
console.log( [] == '0' ); // false
为什么 JavaScript 会这样计算表达式?
最佳答案
当使用双等号运算符 (==
) 时,JavaScript 将尝试强制类型。规范中的详细信息:sec 11.9.3: Abstract Equality Comparison Algorithm .
示例 1:
console.log( 0 == '0' ); // true
JavaScript 将字符串强制转换为数字 0
, 所以 0 == 0
.示例 2:
console.log( 0 == [] ); // true
与数字比较时,空数组的“ToPrimitive”值为零。所以这个减少到0 == 0
.示例 3:
console.log( [] == '0' ); // false
console.log( [] == '' ); // true
虽然第一个看起来与前面的示例非常相似,但双方都不是数字。乍一看,这似乎是一个 truthy
比较,但是 []
不是八人之一 falsy
values .证明
[]
是真的,但是 ''
是假的: console.log( [] ? true : false ); // true
console.log( '' ? true : false ); // false
在任何理智的语言中,上述两个陈述都意味着 [] == ''
将是 false
.但正如我们之前看到的,在 JavaScript 中并非如此!莫名其妙,
[]
转换为 false
使用 ==
时: console.log( [] == true ); // false
console.log( [] == false ); // true
结论:双方都被转换为 bool 值,但不是通过“正常”“真/假”规则(这会将 []
转换为 true
,因为它不是八个假值之一)。相反,[]
转换为 false
使用 ==
时: console.log( [] == '0' ); // `false == true`, so false
console.log( [] == '' ); // `false == false`, so true
示例 4: console.log( [0] == '' ); // false
console.log( [1] == '' ); // false
这可能表明数组(1
)的长度是“真实的”,与 ''
进行比较。 ,这是“假的”,所以 true == false
,即 false
.或者它可能表明没有合适的类型转换,这是规范中的案例 (10),所以 false
.但是请参见示例 5,它似乎不适合任何一种可能性。示例 5:
console.log( [0] == '0' ); // true
console.log( [0] == '1' ); // false
console.log( [1] == '1' ); // true
console.log( [1] == '0' ); // false
console.log( [2] == '2' ); // true
console.log( [1] == '2' ); // false
令人惊讶的是,当与非空字符串进行比较时,包含一个数字的数组显然会转换为该数字。然后转到将数字与字符串进行比较的规则,该规则将字符串转换为数字。因此,我们将(0
或 1
或 ..)与(0
或 1
或 ..)进行比较。这是规范中的歧义吗?不同的实现有区别吗?
测试完成于
https://www.webtoolkitonline.com/javascript-tester.html
2020 年 10 月 27 日,在 Windows 10 电脑上的 Chrome 中,使用 alert
而不是 console.log
.示例 6:
如果以上所有内容都不能说服您永远不要使用
==
再次考虑一下:var a = [];
console.log( a == a ); // true
但:console.log( [] == [] ); // false
规范中的 9 条类型转换规则都不适用,所以这是第 10 种情况:它们不是同一个对象,即使它们都没有任何内容。它们是空数组的两个不同实例。总而言之,这就是为什么使用三等号通常更安全的原因,它检查类型和相等性。
下面是一个方便的插图(用于测试真实性的案例):
function truthyOrFalsy(val) {
return val ? "Truthy" : "Falsy";
}
console.log("empty array:", truthyOrFalsy([]));
console.log("number zero:", truthyOrFalsy(0));
console.log("string with a zero character:", truthyOrFalsy("0"));
关于javascript - 为什么 "0"== [] 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47015361/