详解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 陷阱 window全局对象
Nov 26 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
Sep 15 Javascript
javascript中删除指定数组中指定的元素的代码
Feb 12 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
Javascript中产生固定结果的函数优化技巧
Jan 16 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
Mar 14 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
JS判断非空至少输入两个字符的简单实现方法
Jun 23 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
Oct 11 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
Sep 12 Javascript
js实现头像上传并且可预览提交
Dec 25 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
php除数取整示例
2014/04/24 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
round robin权重轮循算法php实现代码
2016/05/28 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
网页前台通过js非法字符过滤代码(骂人的话等等)
2010/05/26 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
jquery查找tr td 示例模拟
2014/05/08 Javascript
浅析javascript 定时器
2014/12/23 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
从Python的源码浅要剖析Python的内存管理
2015/04/16 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
Django实现文件上传下载功能
2019/10/06 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
澳大利亚最大的在线美发和美容零售商之一:My Hair Care & Beauty
2019/08/24 全球购物
Fanatics官网:运动服装、球衣、运动装备
2020/10/12 全球购物
简单叙述一下MYSQL的优化
2016/05/09 面试题
历史博物馆观后感
2015/06/05 职场文书