【重温基础】18.相等性判断
栏目: JavaScript · 发布时间: 7年前
内容简介:本文是今日感受:优化自己的代码,也是很愉快的事情。系列目录:
本文是 重温基础 系列文章的第十八篇。
今日感受:优化自己的代码,也是很愉快的事情。
系列目录:
本章节复习的是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)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!