详解JavaScript中的Object.is()与"==="运算符总结


Posted in Javascript onJune 17, 2020

三重相等运算符 === 严格检查2个值是否相同:

1 === 1;  // => true
1 === '1'; // => false
1 === true; // => false

但是,ES2015规范引入了 Object.is(),其行为与严格的相等运算符几乎相同:

Object.is(1, 1);  // => true
Object.is(1, '1'); // => false
Object.is(1, true); // => false

主要问题是:什么时候使用 Object.is() 代替严格的相等性检查?让我们找出答案。

1.严格相等检查操作符

首先,让我们快速回顾一下严格的相等运算符是如何工作的。
当两个值的类型相同且持有相同的值时,严格相等检查运算符的计算结果为 true。
例如,以下原始值是相等的,因为它们是相同的类型且具有相同的值:

1     === 1;     // => true
'abc'   === 'abc';   // => true
true   === true;   // => true
null   === null;   // => true
undefined === undefined; // => true

严格相等运算符不执行类型的强制转换,即使操作符持有合理的相同值,但是不同类型的操作符,它们也不是严格相等的:

1  === '1';    // => false
1  === true;   // => false
null === undefined; // => false

对对象执行严格相等检查时,对象仅与自身严格相等:

const myObject = { prop: 'Value' };
myObject === myObject; // => true

即使2个对象的属性和值完全相同,它们的值也不同:

const myObject1 = { prop: 'Value' };
const myObject2 = { prop: 'Value' };
myObject1 === myObject2; // => false

以上比较方案在 Object.is(valueA,valueB) 中的工作原理完全相同。

严格相等检查和 Object.is() 之间的区别在于,如何处理 NaN 和如何处理负零 -0。

首先,NaN(非数字)并不严格等于任何其他值,即使使用另一个 NaN:

NaN === NaN; // => false
NaN === 1;  // => false

其次,严格相等运算符不能将 -0 与 +0 区分开:

-0 === +0; // => true

严格相等运算符使用严格相等比较算法。http://www.ecma-international.org/ecma-262/7.0/index.html#sec-strict-equality-comparison

2. Object.is()

Object.is(valueA,valueB) 以与严格相等运算符相同的方式检查相等性的参数,但有两个区别。

首先,NaN 等于另一个 NaN 值:

Object.is(NaN, NaN); // => true
Object.is(NaN, 1);  // => false

其次,Object.is() 区分 -0 和 +0:

Object.is(-0, +0); // => false

与严格相等运算符相比,Object.is() 使用相同值比较算法。http://www.ecma-international.org/ecma-262/7.0/index.html#sec-samevalue

总结

在大多数情况下,严格相等运算符是比较值的好方法。

如果你想直接检查 NaN 值或对负零和正零进行更严格的区分,那么 Object.is() 是一个不错的选择。

Object.is() 作为比较值的函数性方法也很有用,例如在函数式编程中。

来源:dmitripavlutin.com,作者:Dmitri Pavlutin,翻译:公众号《前端全栈开发者》

到此这篇关于详解JavaScript中的Object.is()与"==="运算符总结的文章就介绍到这了,更多相关JavaScript中的Object.is()与"==="运算符内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
关于跨站脚本攻击问题
Dec 22 Javascript
利用javascript解决图片缩放及其优化的代码
May 23 Javascript
javascript中数组的sort()方法的使用介绍
Dec 18 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
javascript实现全局匹配并替换的方法
Apr 27 Javascript
利用CSS3在Angular中实现动画
Jan 15 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
js实现微信聊天效果
Aug 09 Javascript
用webAPI实现图片放大镜效果
Nov 23 Javascript
JS高级程序设计之class继承重点详解
Jul 07 Javascript
vue-iview动态新增和删除的方法
Jun 17 #Javascript
vue iview实现动态新增和删除
Jun 17 #Javascript
vue如何搭建多页面多系统应用
Jun 17 #Javascript
vue2.0实现列表数据增加和删除
Jun 17 #Javascript
使用next.js开发网址缩短服务的方法
Jun 17 #Javascript
vue实现前端分页完整代码
Jun 17 #Javascript
JS实现网站楼层导航效果代码实例
Jun 16 #Javascript
You might like
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
PHP浮点数的一个常见问题
2016/03/10 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
Node.js的Koa实现JWT用户认证方法
2018/05/05 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python爬虫实例详解
2018/06/19 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
在python3中实现更新界面
2020/02/21 Python
利用python下载scihub成文献为PDF操作
2020/07/09 Python
成人毕业生自我鉴定
2013/10/18 职场文书
秸秆管理实施方案
2014/03/15 职场文书
助理政工师申报材料
2014/06/03 职场文书
群教个人对照检查材料
2014/08/20 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android
无线电通信名词解释
2022/02/18 无线电