本文是 重温基础 系列文章的第十八篇。
今日感觉:优化本身的代码,也是很愉快的事情。 前端
系列目录:git
本章节复习的是JS中的关于严格相等和非严格相等的一些知识。 github
前置知识:
判断两个变量的值是否相等,是编程中很是重要的一个操做。这里咱们内心面先有两组对照,思考下:编程
在咱们比较字符串、数值和布尔值的相等性,是比较简单的,可是到了比较对象的时候,问题就比较复杂。
早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成类似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操做符:segmentfault
==
===
另外还有一类ES6新增的方法:微信
Object.is
(ES6新增)JavaScript中用相等操做符使用==
进行比较,若两个操做数相等,则返回true
,不然返回false
。反之,不相等操做符使用!=
。
这两个操做符都会先转换操做数类型,再进行比较。 post
一般在转换不一样数据类型时,相等和不相等会遵循如下规则:学习
false
转为0
,true
转为1
。valueOf()
方法,用返回的基本类型值来判断。两个操做符进行比较时会遵循下面规则:优化
null
和undefined
相等。null
和undefined
转换成其余值。NaN
,则不相同(==
时返回false
,!=
时返回true
)。NaN
,则不相同(==
时返回false
,!=
时返回true
)。对象
,则比较它们是否是同一个对象。对象
,则相等操做符返回true
,不然返回false
。下面列出一些特殊状况的比较 :spa
表达式 | 值 |
---|---|
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 |
除了比较前不转换操做数歪,全等和不全等与相等和不相等并没有区别,但使用的是===
,只有当不转换的状况下两个操做数相同,才会返回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 类型不一样
因为相等和不相等操做符存在类型转换问题,所以为了保持代码中数据类型的完整性,咱们推荐使用去哪等和不全等操做符。
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
相等。
相等操做符对于不一样类型的值,进行的比较以下图所示(来源 MDN):
注意:
ToNumber(A)
表示比较前将参数 A
转换为数字ToPrimitive(A)
经过尝试调用 A
的A.toString()
和 A.valueOf()
方法,将参数 A
转换为原始值(Primitive)。本部份内容到这结束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787... |
JS小册 | js.pingan8787.com |
欢迎关注微信公众号【前端自习课】天天早晨,与您一块儿学习一篇优秀的前端技术博文 .