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

30次阅读

共计 2230 个字符,预计需要花费 6 分钟才能阅读完成。

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

【复习资料】ES6/ES7/ES8/ES9 资料整理 (个人整理)
【重温基础】1-14 篇
【重温基础】15.JS 对象介绍
【重温基础】16.JSON 对象介绍
【重温基础】17.WebAPI 介绍

本章节复习的是 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 == 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):

注意:

ToNumber(A) 表示比较前将参数 A 转换为数字

ToPrimitive(A) 通过尝试调用 A 的 A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。

参考文章:

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

本部分内容到这结束

Author
王平安

E-mail
pingan8787@qq.com

博 客
www.pingan8787.com

微 信
pingan8787

每日文章推荐
https://github.com/pingan8787…

JS 小册
js.pingan8787.com

正文完
 0