‘==’作为一种区别于‘===’的比较方式,会隐式转换等号两边的类型为一致
试探一下‘==’转换方法
1. let a = '97'
let b = 97
console.log(a == b)
但是上述过程没有触发toString()或者valueOf()
因为JS中的基本数据类型不是对象,像String、Number都是基本数据类型的包装
这也就导致了基本数据类型没有toString()、valueOf()方法。
(可能有人会说使用执行a.toString()不会报错啊,那是因为‘.’将a隐式转换成了String对象)
2. 如果将a变成String对象
let a = new String('97')
在上述过程中就会触发toString()函数,大概是返回字符串字面量,再进行1中的过程
3. 但是
let a = new String('97')
let b = new Number(97) || let b = new String('97')
console.log(a == b)
上述过程没有触发toString()|valueOf()
这说明当两个对象(引用类型)进行比较时,结果永远都是false,这说明‘==’是对值进行比较,两个引用类型的值永远不一样
具体的‘==’转换规则参考ES5文档
(引自juejin.cn/post/684490…)
比较运算 x==y, 其中 x 和 y 是值,返回 true 或者 false。这样的比较按如下方式进行:
1、若 Type(x) 与 Type(y) 相同, 则
1* 若 Type(x) 为 Undefined, 返回 true。
2* 若 Type(x) 为 Null, 返回 true。
3* 若 Type(x) 为 Number, 则
(1)、若 x 为 NaN, 返回 false。
(2)、若 y 为 NaN, 返回 false。
(3)、若 x 与 y 为相等数值, 返回 true。
(4)、若 x 为 +0 且 y 为 −0, 返回 true。
(5)、若 x 为 −0 且 y 为 +0, 返回 true。
(6)、返回 false。
4* 若 Type(x) 为 String, 则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false。
5* 若 Type(x) 为 Boolean, 当 x 和 y 为同为 true 或者同为 false 时返回 true。 否则, 返回 false。
6* 当 x 和 y 为引用同一对象时返回 true。否则,返回 false。
2、若 x 为 null 且 y 为 undefined, 返回 true。
3、若 x 为 undefined 且 y 为 null, 返回 true。
4、若 Type(x) 为 Number 且 Type(y) 为 String,返回比较 x == ToNumber(y) 的结果。
5、若 Type(x) 为 String 且 Type(y) 为 Number,返回比较 ToNumber(x) == y 的结果。
6、若 Type(x) 为 Boolean, 返回比较 ToNumber(x) == y 的结果。
7、若 Type(y) 为 Boolean, 返回比较 x == ToNumber(y) 的结果。
8、若 Type(x) 为 String 或 Number,且 Type(y) 为 Object,返回比较 x == ToPrimitive(y) 的结果。
9、若 Type(x) 为 Object 且 Type(y) 为 String 或 Number, 返回比较 ToPrimitive(x) == y 的结果。
10、返回 false。