IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    JavaScript 的等号运算符

    陈屹峤发表于 2016-05-19 16:37:03
    love 0

    JavaScript 判断相等的运算符分成相等运算符(==)和全等运算符(===),似乎==和===并没有统一的翻译,且把它们分成"相等"和"全等"好了。

    全等运算符

    判断是否全等的规则:

    1. 如果操作数类型不同,那么不全等。

    2. 如果二者都是null, 全等。

    3. 如果都是undefined, 全等。

    4. 如果其中之一为NaN, 不全等。

    5. 如果二者都为true或false, 全等。

    6. 如果都为数值且值相等,全等。

    7. 如果都为字符串,且值相等,全等。

    8. 如果都指向同一个引用类型,全等。

    9. 其他情况,不全等。

    举例

    // false, 类型不同#1
    1 === '1' 
    
    // fasle, #4
    NaN === NaN 
    
    // false, 虽然都是空对象,但不是同一个引用类型值
    [] === []
    
    // true, 同一个引用类型值
    var firstObject = {}
    var secondObject = firstObject
    secondObject['name'] = 'Neo'
    secondObject === firstObject 

    引用类型转换成基本类型

    在之前的加法运算符里面也提到过引用类型到基本类型的转换,过程大致如下:

    • 先调用valueOf方法,如果返回的是基本类型值,转换结束。

    • 如果失败了,就调用toString方法。如果返回基本类型值,转换结束。

    • 否则,抛出错误:TypeError: Cannot convert object to primitive value

    大多数的原生对象在调用valueOf方法的时候都会返回对象自身,所以大多数时候其实都会调用toString方法。

    Date对象比较特殊,它的valueOf方法返回的是毫秒数,在转换成基本类型值的时候直接调用toString方法。

    相等运算符

    判断是否相等的规则:

    1. 如果操作数类型一致,且满足全等的条件,则相等,否则不相等。

    2. 如果操作数类型不一致:

      1. 如果一个是null, 另一个是undefined, 相等。

      2. 如果一个是数字,另一个是字符串,把字符串转换成数字再比较。

      3. 如果一个是布尔值,把true转成1, false转成0, 然后再比较。

      4. 如果一个是对象,另一个是数字或者字符串,把对象转成基本类型值再比较。

    3. 其他情况,不相等。

    举例

    1 == true // true
    1. 根据条件2.3,把true转成1。

    2. 然后两个操作数类型一致,满足条件1,使用全等比较。

    3. 都为数值且相等,全等。

    4. 相等。


    '' == 0 // true
    1. 根据2.2,把''转换成数字,即0。

    2. 然后两个操作数类型一致,满足条件1,使用全等比较。

    3. 都为数值且相等,全等。

    4. 相等。


    null == 0 // false 

    条件3,属于其他情况,不相等。


    null == undefined

    条件2.1,相等。


    NaN == NaN // false
    1. 类型一致,转换成全等比较

    2. NaN === NaN 不成立,因此不全等

    3. 所以不相等


    [''] == '' // true
    1. 条件2.4,先把数组转换成基本类型

    2. 比较'' == '',类型相同,转成全等比较

    3. 类型相同,且值相同,全等。

    4. 相等。


    {} == true // false
    1. true转换成1,然后对象转换成基本类型值,即"[object Object]" == 1

    2. 条件2.2,把字符串转换成数字,得到NaN == 1,类型相同,转成全等比较。

    3. 类型相同,但值不同,所以不全等。

    4. 不相等。

    初看上去,内容非常的繁杂,但是如果碰到的时候就来查一下,很快就能有肌肉记忆了。

    参考:JavaScript 的等号运算符



沪ICP备19023445号-2号
友情链接