0
点赞
收藏
分享

微信扫一扫

【JS】137-重温基础:相等性判断

【JS】137-重温基础:相等性判断_javascript

本文是 重温基础 系列文章的第十八篇。 今日感受:优化自己的代码,也是很愉快的事情。

本章节复习的是JS中的关于严格相等和非严格相等的一些知识。

前置知识:
判断两个变量的值是否相等,是编程中非常重要的一个操作。这里我们心里面先有两组对照,思考下:

  • 相等 和 不相等
  • 全等 和 不全等

1.介绍

在我们比较字符串、数值和布尔值的相等性,是比较简单的,但是到了比较对象的时候,问题就比较复杂。
早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成相似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操作符:

  • 相等不相等(宽松相等):先转换再比较,使用 ​==
  • 全等不全等(严格相等):仅比较不转换,使用 ​===

另外还有一类ES6新增的方法:

  • Object.is​ (ES6新增)

2.相等和不相等

JavaScript中用相等操作符使用 ​==​​进行比较,若两个操作数相等,则返回 ​true​​,否则返回 ​false​。反之,不相等操作符使用 ​!=​​。
这两个操作符都会先转换操作数类型,再进行比较

通常在转换不同数据类型时,相等和不相等会遵循以下规则:

  • 若有一个操作数是布尔值,则比较前会将布尔值转换为数值: ​false​​转为 ​​0​​, ​​true​​转为 ​​1​​。
  • 若一个操作数是字符串,另一个是数值,则比较前会将字符串转换为数值
  • 若一个操作数是对象,另一个不是,则比较前会调用 ​valueOf()​方法,用返回的基本类型值来判断。

两个操作符进行比较时会遵循下面规则:

  • null​​和 ​​undefined​​相等。
  • 比较前不能讲 ​null​​和 ​​undefined​​转换成其他值。
  • 若一个操作数是 ​NaN​​,则不相同( ​​==​​时返回 ​​false​​, ​​!=​​时返回 ​​true​​)。
  • 若两个操作数是 ​NaN​​,则不相同( ​​==​​时返回 ​​false​​, ​​!=​​时返回 ​​true​​)。
  • 若两个操作数都是 ​对象​,则比较它们是不是同一个对象。
  • 若两个操作数都指向同一个 ​对象​​,则相等操作符返回 ​​true​​,否则返回 ​​false​​。

下面列出一些特殊情况的比较 :

表达式


null == undefined

true

"NaN" == NaN

false

9 == NaN

false

NaN == NaN

false

NaN != NaN

true

false == 0

true

true == 1

true

true == 2

false

undefined == 0

false

null == 0

false

"9" == 9

true

3.全等和不全等

除了比较前不转换操作数歪,全等和不全等与相等和不相等并无区别,但使用的是 ​===​​,只有当不转换的情况下两个操作数相同,才会返回 ​true​。

  1. "99" == 99 ;  // true   因为先转换类型 number 和 number
  2. "99" === 99 ; // false  因为不转换类型 string 和 number

不全等操作符就相对应的使用 ​!==​:

  1. "99" != 99 ;  // false   因为先转换类型 number 和 number
  2. "99" !== 99 ; // true    因为不转换类型 string 和 number

特殊的:

  1. null == undefined;   // true  类似的值
  2. null === undefined;  // false 类型不同

由于相等和不相等操作符存在类型转换问题,因此为了保持代码中数据类型的完整性,我们推荐使用去哪等和不全等操作符。

4.同值相等(Object.is)

Object.is(value1,value2);​​,传入两个需要对比的值。
​​Object.is()​ 判断两个值是否相同,并且不会对参数进行类型转换。如果下列任何一项成立,则两个值相同:

  • 两个值都是 ​undefined
  • 两个值都是 ​null
  • 两个值都是 ​true​​ 或者都是 ​​false​
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
  • 都是正零 ​​+0​
  • 都是负零 ​​-0​
  • 都是 ​​NaN​
  • 都是 ​​除零​​和 ​​NaN​​ 外的其它同一个数字
  1. Object.is('leo', 'leo');     // true
  2. Object.is(window, window);   // true

  3. Object.is('leo', 'pingan');     // false
  4. Object.is([], []);           // false

  5. var leo = { a: 1 };
  6. Object.is(leo, leo);       // true

  7. Object.is(null, null);       // true

  8. // 特例
  9. Object.is(0, -0);            // false
  10. Object.is(-0, -0);           // true
  11. Object.is(NaN, 0/0);         // true

另外还有特殊的:

  • 零值相等:
    与同值相等类似,不过会认为 ​​+0​​ 与 ​​-0​​ 相等。

5.对比图

相等操作符对于不同类型的值,进行的比较如下图所示(来源 MDN):

【JS】137-重温基础:相等性判断_操作数_02

注意:

  • ToNumber(A)​​ 表示比较前将参数 ​​A​​ 转换为数字
  • ToPrimitive(A)​​通过尝试调用 ​​A​​ 的 ​​A.toString()​​ 和 ​​A.valueOf()​​ 方法,将参数 ​​A​​ 转换为原始值(Primitive)。

【JS】137-重温基础:相等性判断_javascript_03

【JS】137-重温基础:相等性判断_操作符_04

【JS】137-重温基础:相等性判断_javascript_05

参考文章:

  1. MDN JavaScript 中的相等性判断
  2. JavaScript高级程序设计

【JS】137-重温基础:相等性判断_javascript_06



举报

相关推荐

0 条评论