这是我参与「第四届青训营 」笔记创作活动的的第1天
在面试题中经常会碰到 判断两个值是否相等, 在开发中有时也会对 == 和 === 进行取舍。
这篇文章会先介绍 ==, ===, Object.is 的比较过程。
网上有很多总结性的文章, 但本文从官方的文档中翻译过来, 并附上相应的总结, 建议大家直接看原文档
严格相等 ===
比较 x === y(其中 x,y 是指) 产生 true 或 false: 进行如下比较
-
- x 和 y 的类型不同, 返回 false
-
- 如果 type(x) = undefined, 返回 true。 注意: 之后的每步都是在类型相等的前提下
-
- 如果 type(x) 是 null, 返回 true
-
- 如果 如果x 是 number类型, 这里分以下几种情况考虑
- a. 如果 x 是 NaN, 返回 false
- b. 如果 y 是 NaN, 返回 false
- c. 如果 x 与 y 是相同的number值,返回true
- d. 如果x为+0且y为-0,则返回true。
- e. 如果x为-0且y为+0,则返回true。
- f. 返回 false
-
- 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
-
- 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
-
- 如果x和y引用同一个对象,则返回true 。否则,返回false
抽象相等 ==
比较 x==y(其中x,y是值)产生true或false: 进行下列比较
- 1、 如果Type(x) 与 Type(y) 相同, 步骤同 严格相等
- 2、 如果x 是 null, 且 y 为 undefined,返回true, 即 null == undefined
- 3、 如果x 是 undefined, 且 y 为 null,返回true, 即 undefined == null
- 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、 返回假。
Object.is
-
- 如果 x 与 y 类型不同, false
-
- 如果 x 是 undefined, 返回 true。 注意: 此步是在类型相同的情况下
-
- 如果 x 是 null, 返回true
-
- 如果 如果x 是 number类型, 这里分以下几种情况考虑
- a. 如果 x 是 NaN 且 y 也是NaN, 返回 true
- b. 如果 x 是 +0 与 y 是 -0, false
- c. 如果 x 是 -0 与 y 是 +0, false
- d. 如果 x 与 y 是相同的number值,返回true
- e. 返回 false
-
- 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
-
- 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
-
- 如果x和y引用同一个对象,则返回true 。否则,返回false
ToNumber
一些常见的转Number的结果
Number('123') // 123
Number('12.3') // 12.3
Number('12.00') // 12
Number('123e-1') // 12.3
Number('') // 0
Number(null) // 0
Number('0x11') // 17
Number('0b11') // 3
Number('0o11') // 9
Number('foo') // NaN
Number('100a') // NaN
Number('-Infinity') //-Infinity
Number({}) // NaN
Number(true) // 1
Number(false) // 0
Number(undefined) // undefined
小结
- Object.is() 与 === 除了在 判断
NaN与+0, -0处不同外,其余都相同 - == 的类型相同时的情况与 === 一样
- == 的类型不同的情况下, 主要用到了
ToNumber和ToPrimitive, 其中ToPrimity只在比较对象中有一个是Object的情况下,其他都是用ToNumber null与undefined在 == 中是直接返回true的
参考资料
文章已保存到WJYGRIT的个人博客, 欢迎大家访问