【重温基础】18.相等性判断
栏目: JavaScript · 发布时间: 5年前
内容简介:本文是今日感受:优化自己的代码,也是很愉快的事情。系列目录:
本文是 重温基础 系列文章的第十八篇。
今日感受:优化自己的代码,也是很愉快的事情。
系列目录:
本章节复习的是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)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- php比较两个浮点数是否相等
- CSS Flexbox 之間距相等
- c# – 比较两个(Integer)列表是否相等
- 在 Python 中判断两个浮点数的相等
- C#相等判断实例报错分析及解决
- JS面试题之比较两个对象是否相等?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言从入门到精通
王娣//韩旭 / 清华大学 / 2010-7 / 49.80元
《C语言从入门到精通》从初学者的角度出发,以通俗易懂的语言,丰富多彩的实例,详细介绍了使用C语言进行程序开发应该掌握的各方面知识。全书共分17章,包括C语言概述,算法,数据类型,运算符与表达式,常用的数据输入、输出函数,选择结构程序设计,循环控制,数组,函数,指针,结构体和共用体,位运算,预处理,文件,存储管理,网络套接字编程和学生成绩管理系统等。所有知识都结合具体实例进行介绍,涉及的程序代码给出......一起来看看 《C语言从入门到精通》 这本书的介绍吧!