详解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 相关文章推荐
学习jquery之一
Apr 27 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
Nov 14 Javascript
jQuery页面滚动浮动层智能定位实例代码
Aug 23 Javascript
js修改table中Td的值(定义td的单击事件)
Jan 10 Javascript
jquery css 设置table的奇偶行背景色示例
Jun 03 Javascript
jQuery中ajax的post()方法用法实例
Dec 26 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
Angular.js中下拉框实现渲染html的方法
Jun 18 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
Dec 18 Javascript
Vue 修改网站图标的方法
Dec 31 Vue.js
为什么node.js不适合大型项目
Apr 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
多php服务器实现多session并发运行
2006/10/09 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
手机端页面rem宽度自适应脚本
2015/05/20 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
详解如何较好的使用js
2016/12/16 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
jQuery validata插件实现方法
2017/06/25 jQuery
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
python批量同步web服务器代码核心程序
2014/09/01 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python 实现list或string按指定分段
2019/12/25 Python
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
《猴子种树》教学反思
2014/02/14 职场文书
企业安全生产承诺书
2014/05/22 职场文书
新学期开学演讲稿
2014/05/24 职场文书
环境保护建议书
2014/08/26 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫