【重温基础】18.相等性判断

栏目: JavaScript · 发布时间: 5年前

内容简介:本文是今日感受:优化自己的代码,也是很愉快的事情。系列目录:

本文是 重温基础 系列文章的第十八篇。

今日感受:优化自己的代码,也是很愉快的事情。

系列目录:

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

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

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

1.介绍

在我们比较字符串、数值和布尔值的相等性,是比较简单的,但是到了比较对象的时候,问题就比较复杂。

早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成相似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操作符:

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

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

  • Object.is (ES6新增)

2.相等和不相等

JavaScript中用 相等操作符 使用 == 进行比较,若两个操作数相等,则返回 true ,否则返回 false 。反之, 不相等操作符 使用 !=

这两个操作符都会 先转换操作数类型 ,再进行 比较

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

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

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

  • nullundefined 相等。
  • 比较前不能讲 nullundefined 转换成其他值。
  • 若一个操作数是 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 == 0 true
true == 1 false
undefined == 0 false
null == 0 false
"9" == 9 true

3.不全等

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

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

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

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

特殊的:

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

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

4.同值相等(Object.is)

Object.is(value1, value2); ,传入两个需要对比的值。

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

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的 字符串
  • 两个值指向 同一个对象
  • 两个值 都是数字 并且

    • 都是正零 +0
    • 都是负零 -0
    • 都是 NaN
    • 都是 除零NaN 外的其它同一个 数字
Object.is('leo', 'leo');     // true
Object.is(window, window);   // true

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

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

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

// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true

另外还有特殊的:

  • 零值相等:

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

5.对比图

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

【重温基础】18.相等性判断

注意:

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

【重温基础】18.相等性判断

【重温基础】18.相等性判断

【重温基础】18.相等性判断


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法的陷阱

算法的陷阱

阿里尔•扎拉奇 (Ariel Ezrachi)、莫里斯•E. 斯图克 (Maurice E. Stucke) / 余潇 / 中信出版社 / 2018-5-1 / CNY 69.00

互联网的存在令追求物美价廉的消费者与来自世界各地的商品只有轻点几下鼠标的距离。这诚然是一个伟大的科技进步,但却也是一个发人深思的商业现象。本书中,作者扎拉奇与斯图克将引领我们对由应用程序支持的互联网商务做出更深入的检视。虽然从表面上看来,消费者确是互联网商务兴盛繁荣过程中的获益者,可精妙的算法与数据运算同样也改变了市场竞争的本质,并且这种改变也非总能带来积极意义。 首当其冲地,危机潜伏于计算......一起来看看 《算法的陷阱》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具