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

标签 javascript

这个问题在这里已经有了答案:





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
令人惊讶的是,当与非空字符串进行比较时,包含一个数字的数组显然会转换为该数字。然后转到将数字与字符串进行比较的规则,该规则将字符串转换为数字。因此,我们将(01 或 ..)与(01 或 ..)进行比较。
这是规范中的歧义吗?不同的实现有区别吗?
测试完成于 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/

相关文章:

javascript - 无法在 IE 中选择文本区域中的文本

javascript - 悬停后保持视频控制 3 秒

javascript - 在 Javascript 中 chop 字符串

javascript - 将流映射到惰性 promise 流

javascript - 问题 - AngularJS 未捕获错误 : [$injector:modulerr]

javascript - 如何在页面顶部隐藏导航栏

javascript - 如何在reactjs中更好地在查看和编辑模式之间切换

javascript - 在 JavaScript 中使用常量有什么意义?

javascript - 使用 switchMap 发出一个热 bool 值 observable?

javascript - 我如何用 Javascript 编写这个 urllize 函数?