JavaScript中的相等操作符使用详解


Posted in Javascript onDecember 21, 2019

ECMAScript 中的相等操作符由两个等于号 ( == ) 表示,如果两个操作数相等,则返回 true。

相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。

在转换不同的数据类型时,相等操作符遵循下列基本规则:

1. 如果有一个操作数是布尔值,则在比较相等性之前,将其转换为数值;

2. 如果一个操作数是字符串,另一个操作数是数值,在比较之前先将字符串转换为数值;

3. 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;

4. 如果有一个操作数是 NaN,无论另一个操作数是什么,相等操作符都返回 false;

5. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;

6. 在比较相等性之前,不能将 null 和 undefined 转成其他值。

7. null 和 undefined 是相等的。

以上内容摘自《 JavaScript 高级程序设计(第3版)》3.5.7

一、基本规则

上面阐述的 1、2、3 三条规则,总结成一句话就是:

如果相等操作符两边的操作数,不包含 null 或者 undefined,且两个操作数不全是对象,

在执行相等比较之前,会先调用 Number() 将两个操作数强制转为 Number 类型,然后进行比较

所以在使用相等操作符的时候,会有以下情况:

'55' == 55; //true
false == 0; //true
"wise" == 3; //false ( Number("wise") -> NaN )
[] == 0; //true ( Number([]) -> 0 )

但是在特殊情况下,也就是两边都有对象的时候,会产生看似不合理的结果:

NaN == NaN; //false (参考第4条规则)
[] == []; //false
[] == ![]; //true
{} == {}; //false
{} == !{}; //false

二、[] == [] 和 {} == {}

在 JavaScript 中,Object、Array、Function、RegExp、Date 都是引用类型

声明引用类型的时候,变量名保存在 js 的栈内存里面,而对应的值保存在堆内存里面

而这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针

var a = {};
var b = {};

上面的代码中,声明变量 a 的时候,在堆内存中存储了一个 Object,而 a 实际保存的这个 Object 的地址

然后声明变量 b 的时候,又存储了一个新的 Object

虽然 a 和 b 都保存了一个 Object,但这是两个独立的 Object,它们的地址是不同的

再结合前面的第5条规则:如果两个对象指向同一个对象,相等操作符返回 true

所以 {} == {} 的结果是 false,同样的, [] == [] 的结果也是 false

var c = b;
b == c; //true(变量c保存的是b的指针,它们指向同一个对象)

三、[] == ![] 和 {} == !{}

参考链接:JavaScript 运算符优先级

ECMAScript 中规定,逻辑非 (!) 的优先级高于相等操作符 ( == )

在比较 [] == ![] 的时候,先计算 ![] 得到布尔值 false

所以实际上比较的是 [] == false

然后根据上面的第1条规则和第3条规则,将两个操作数转为数值类型:

Number([]) == Number(false); // -> 0 == 0 -> true

在比较 {} == !{} 的时候,也是遵守同样的规则:

{} == !{} -> {} == false -> Number({}) == Number(false) -> NaN == 0

然后第4条规则规定:如果有一个操作数是 NaN,相等操作符返回 false

所以 {} == !{} 的结果是 false

小结:

“==”在比较不同类型值得时候会进行隐式的类型转化,而”===”不会转化,全等一定相等,相等却不一定全等,这是一个充分不必要条件。undefined和null相等而不全等,且在相等比较的时候不会转化为其他类型的值。NaN是不等于NaN 的,要判断某个变量是不是NaN,要用”!=”。对象和非对象在进行比较的时候会先转为基本类型值然后再根据上面的规则进行比较。

Javascript 相关文章推荐
JQuery 学习笔记 选择器之六
Jul 23 Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 Javascript
MultiSelect左右选择控件的设计与实现介绍
Jun 08 Javascript
JavaScript从数组中删除指定值元素的方法
Mar 18 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
Jan 04 Javascript
jQuery绑定自定义事件的魔法升级版
Jun 30 Javascript
jQuery实现的导航下拉菜单效果
Jul 04 Javascript
前端面试题及答案整理(二)
Aug 26 Javascript
微信小程序开发入门基础教程
Apr 19 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
Jan 08 jQuery
JavaScript 定时器详情
Nov 11 Javascript
高性能js数组去重(12种方法,史上最全)
Dec 21 #Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 #Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
Dec 20 #Javascript
angularjs模态框的使用代码实例
Dec 20 #Javascript
推荐几个不错的console调试技巧实现
Dec 20 #Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 #Javascript
node使用request请求的方法
Dec 20 #Javascript
You might like
收音机术语解释
2021/03/01 无线电
PHP漏洞全解(详细介绍)
2012/11/13 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
对Angular.js Controller如何进行单元测试
2016/10/25 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
2017/01/04 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python Collatz序列实现过程解析
2019/10/12 Python
Vilebrequin美国官方网上商店:法国豪华泳装品牌
2020/02/22 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
门卫岗位职责
2013/11/15 职场文书
竞选班长演讲稿
2013/12/30 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
应用心理学专业求职信
2014/08/04 职场文书
专项资金申请报告
2015/05/15 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis