为什么 {} == false 的计算结果为 false,而 [] == false 的计算结果为 true

Why does {} == false evaluate to false while [] == false evaluates to true?

本文关键字:false 结果 计算 true 为什么      更新时间:2023-09-26

为什么{} == false的计算结果为false,而[] == false的计算结果为javascript中的true

这是根据抽象相等比较算法进行的类型转换:

{} == false                // step 7 {} == ToNumber(false)
{} == 0                    // step 9 ToPrimitve({}) == 0
"[object Object]" == 0     // step 5 ToNumber("[object Object]") == 0
NaN == 0                   // step 1.c.i
[] == false                // step 7 [] == ToNumber(false)
[] == 0                    // step 9 ToPrimitve([]) == 0
"" == 0                    // step 5 ToNumber("") == 0
0 == 0                     // step 1.c.iii

参考资料:ToNumber、ToPrimitive

正因为如此,更喜欢使用严格的比较。


一些示例 ToPrimitive 如何在比较期间将对象转换为基元。默认情况下,将调用对象的 valueOf 方法,如果valueOf不返回基元值,则toString方法。对于Date对象,默认情况下它将调用toString

var obj = {};
obj.valueOf();        // Object { } // the object itself
obj.toString();       // "[object Object]"

obj.valueOf = function() { return 123; };
obj == 123; // true
obj.toString = function() { return 'foo bar'; };
obj == 123; // false
obj == 'foo bar'; // true
// Date object
var date = new Date();
date.valueOf();        // 1421430720379
date.toString();       // "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)"
date == 1421430720379 // false
date == "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)" // true
date.toString = function() { return 'foo'; };
date == 'foo'; // true