JS中的类型转换 | 青训营笔记

114 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

在面试题中经常会碰到 判断两个值是否相等, 在开发中有时也会对 == 和 === 进行取舍。

这篇文章会先介绍 ==, ===, Object.is 的比较过程。

网上有很多总结性的文章, 但本文从官方的文档中翻译过来, 并附上相应的总结, 建议大家直接看原文档

严格相等 ===

比较 x === y(其中 x,y 是指) 产生 true 或 false: 进行如下比较

    1. x 和 y 的类型不同, 返回 false
    1. 如果 type(x) = undefined, 返回 true。 注意: 之后的每步都是在类型相等的前提下
    1. 如果 type(x) 是 null, 返回 true
    1. 如果 如果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
    1. 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
    1. 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
    1. 如果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

    1. 如果 x 与 y 类型不同, false
    1. 如果 x 是 undefined, 返回 true。 注意: 此步是在类型相同的情况下
    1. 如果 x 是 null, 返回true
    1. 如果 如果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
    1. 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
    1. 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
    1. 如果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处不同外,其余都相同
  • == 的类型相同时的情况与 === 一样
  • == 的类型不同的情况下, 主要用到了 ToNumberToPrimitive, 其中ToPrimity 只在比较对象中有一个是Object的情况下,其他都是用 ToNumber
  • nullundefined 在 == 中是直接返回true的

参考资料

文章已保存到WJYGRIT的个人博客, 欢迎大家访问