详解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 相关文章推荐
JavaScript自定义DateDiff函数(兼容所有浏览器)
Mar 01 Javascript
理解javascript回调函数
Dec 28 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
JavaScript中计算网页中某个元素的位置
Jun 10 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
Bootstrap源码解读按钮(5)
Dec 23 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
jQuery+koa2实现简单的Ajax请求的示例
Mar 06 jQuery
微信小程序文章详情页面实现代码
Sep 10 Javascript
Vue 实现从小到大的横向滑动效果详解
Oct 16 Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 Javascript
node.js通过Sequelize 连接MySQL的方法
Dec 28 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
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
显示js对象所有属性和方法的函数
2009/10/16 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
浅谈jQuery双事件多重加载的问题
2016/10/05 Javascript
JSONP基础知识详解
2017/03/19 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
彻底揭秘keep-alive原理(小结)
2019/05/05 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Shell编程面试题
2012/05/30 面试题
市级优秀班主任事迹材料
2014/05/13 职场文书
公司承诺书格式
2014/05/21 职场文书
社区服务标语
2014/07/01 职场文书
政风行风建设责任书
2014/07/23 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
优秀班主任材料
2014/12/16 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
2015年资料员工作总结
2015/04/25 职场文书
行为规范主题班会
2015/08/13 职场文书
Flask response响应的具体使用
2021/07/15 Python