说说 == 和 === 的区别,以及隐式类型转换规则
== vs ===
===(严格相等):不进行类型转换,类型不同直接返回false==(宽松相等):会先进行类型转换再比较
== 的转换规则
- null == undefined →
true(二者相等,但不与其他值相等) - number == string → 字符串转数字再比较
- boolean == 其他 → boolean 先转数字(true→1, false→0)
- object == 原始类型 → object 先转原始类型(调用
valueOf/toString)
null == undefined // true
null == 0 // false
'' == 0 // true ('' → 0)
'1' == 1 // true ('1' → 1)
true == 1 // true (true → 1)
[] == false // true ([] → '' → 0, false → 0)
[] == 0 // true
[1] == 1 // true ([1] → '1' → 1)
// 经典面试题
let a = {}
a.toString = () => '1'
a == 1 // true (a → '1' → 1)建议
- 日常开发一律用
===,只有判断null/undefined时可用== null ==的转换规则复杂,容易出错