一、先上记忆题(不得不记,这就是规则):
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行false,[]是新建一个数组数组对象,两边是2个不同对象比较,因此结果为false;
- 第2行false,同1
- 第3行true
- 右边[]是对象,![]为对象取反运算为false,比较式变为 [] == false
- 左右都转Number,比较式变为Number([]) == Nubmer(false)
- 即0 == 0,结果为true
- 第4行false,同1
- 第5行false
- 右边{}是对象,!{}为对象取反运算为false,比较式变为 {} == false
- 左右都转Number,比较式变为Number({}) == Nubmer(false)
- 即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
四、结论
- 看第一节记忆部分。
- true转为1,false转为0,再进行比较。
- 对象调valueOf或toString(后调)转为值,再进行比较(例外:Date只认toString)。
别折腾了,还是用===吧。