[]==[]相等吗?

256 阅读1分钟

一、先上记忆题(不得不记,这就是规则):

NaN == NaN            // false
NaN == 0              // false
'0123' == 123         // true
'0123x' == 123        // true,Number('0123x')为NaN
null == undefined     // true

Number("") 为 0    
Number([]) 为 0  
Number({}) 为 NaN    
!{} 为 false         

二、以下相等吗?

[] == []
[1] == [1]
[] == ![]
{} == {}
{} == !{}

分析一下:

  1. 第1行false,[]是新建一个数组数组对象,两边是2个不同对象比较,因此结果为false;
  2. 第2行false,同1
  3. 第3行true
    1. 右边[]是对象,![]为对象取反运算为false,比较式变为 [] == false
    2. 左右都转Number,比较式变为Number([]) == Nubmer(false)
    3. 即0 == 0,结果为true
  4. 第4行false,同1
  5. 第5行false
    1. 右边{}是对象,!{}为对象取反运算为false,比较式变为 {} == false
    2. 左右都转Number,比较式变为Number({}) == Nubmer(false)
    3. 即NaN == 0,结果为false

三、对象 == 数字?

const a = { a: 1 }
console.log(a == 111)
a.toString = () => 111
console.log(a == 111) // true

const b = { b: 1 }
b.toString = () => 222 
b.valueOf = () => 333 
console.log(b == 222) // false
console.log(b == 333) // true

const d = new Date()
d.toString = () => 444
d.valueOf = () => 555
console.log(d == 444) // true
console.log(d == 555) // false

四、结论

  1. 看第一节记忆部分。
  2. true转为1,false转为0,再进行比较。
  3. 对象调valueOf或toString(后调)转为值,再进行比较(例外:Date只认toString)。

别折腾了,还是用===吧。

原文链接:mp.weixin.qq.com/s/IkxQr1Q8V…