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

作者:杜尼卜 时间:2024-04-22 12:50:25 

三重相等运算符 === 严格检查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,翻译:公众号《前端全栈开发者》

来源:https://juejin.im/post/5ee9616851882543152d14d8

标签:JavaScript,Object.is(),===,运算符
0
投稿

猜你喜欢

  • MySQL复制表结构和内容到另一张表中的SQL语句

    2024-01-20 17:20:59
  • python 中的列表生成式、生成器表达式、模块导入

    2021-06-11 06:29:10
  • JAVA正则表达式 Pattern和Matcher

    2023-07-01 19:13:53
  • vue-week-picker实现支持按周切换的日历

    2024-04-30 10:16:23
  • 基于Python实现天天酷跑功能

    2022-09-30 01:18:33
  • python实现图片加文字水印OPenCV和PIL库

    2021-02-04 19:29:09
  • 如何利用python发送邮件

    2022-11-09 09:34:31
  • vite+vue3中使用mock模拟数据问题

    2024-04-28 09:27:56
  • JS限制textarea字数

    2009-09-28 14:41:00
  • MySQL JOIN关联查询的原理及优化

    2024-01-28 13:13:49
  • python 与GO中操作slice,list的方式实例代码

    2022-08-15 08:48:06
  • mysql 8.0.15 winx64安装配置方法图文教程

    2024-01-13 04:44:24
  • SQL子查询全接触

    2007-08-20 10:51:00
  • 编写一个JS组件来说说call和apply的用法

    2008-11-23 17:11:00
  • python项目对接钉钉SDK的实现

    2021-09-18 22:21:29
  • 使用go实现简易比特币区块链公链功能

    2024-04-28 09:18:20
  • Python利用PaddleOCR制作个搜题小工具

    2022-07-22 16:18:18
  • MySQL下海量数据的迁移步骤分享

    2024-01-16 13:13:10
  • Python机器学习工具scikit-learn的使用笔记

    2021-08-30 10:28:50
  • MySQL语句优化的原则

    2009-10-27 12:09:00
  • asp之家 网络编程 m.aspxhome.com