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

三重相等运算符 === 严格检查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()与"==="运算符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 实例分析JS中的相等性判断===、 ==和Object.is()

    相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能答对几个? NaN === NaN // false NaN == NaN // false Object.is(NaN, NaN) // true 0 == false // true 1 == true // true Number(null) === 0 // true null == 0 // false Javascript提供了三种不同的值比较操作,分别是严格相等.宽松相等.以及Object.is,希望看完下面的内容,

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

    三重相等运算符 === 严格检查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 主要问题是:什么时

  • 详解Javascript中的Object对象

    Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是Object对象其实包含了很多很有用的属性和方法,尤其是ES5增加的方法,因此,本文将从最基本的介绍开始,详细说明了Object的常用方法和应用. 基础介绍 创建对象 首先我们都知道,对象就是一组相似数据和功能的集合,我们就是用它来模拟我们现实世界中的对象的.那在Javascript中,创建对象的方

  • 详解JavaScript中的4种类型识别方法

    具体内容如下: 1.typeof [输出]首字母小写的字符串形式 [功能] [a]可以识别标准类型(将Null识别为object) [b]不能识别具体的对象类型(Function除外) [实例] console.log(typeof "jerry");//"string" console.log(typeof 12);//"number" console.log(typeof true);//"boolean" console

  • 详解Javascript中prototype属性(推荐)

    在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Javascript语言体系中,是不存在类(Class)的概念的,javascript中不是基于'类的',而是通过构造函数(constructor)和原型链(prototype chains)实现的.但是在ES6中提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能

  • 详解Javascript 中的 class、构造函数、工厂函数

    到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立.现在就主要有三种方法来构建对象,class关键字,构造函数,工厂函数.他们都是创建对象的手段,但是却又有不同的地方,平时开发时,也需要针对这不同来选择. 首先我们来看一下,这三种方法是怎样的 // class 关键字,ES6新特性 class ClassCar { drive () { console.log('Vroom!'); } } const car1 = new ClassCar(); consol

  • 详解JavaScript中new操作符的解析和实现

    前言 new 运算符是我们在用构造函数创建实例的时候使用的,本文来说一下 new 运算符的执行过程和如何自己实现一个类似 new 运算符的函数. new 运算符的运行过程 new 运算符的主要目的就是为我们创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例(比如箭头函数就没有构造函数,所以是不能 new 的).new 操作符的执行大概有以下几个步骤: 创建一个新的空对象 把新对象的 __proto__ 链接到构造函数的 prototype 对象(每一个用户定义函数都有一个 proto

  • 详解JavaScript中的数据类型,以及检测数据类型的方法

    一.js中的数据类型有哪些? 在js中,基本数据类型有五种,分别是 string.number.boolean.null.undefined,不过在ES6中新增加的了一种基本数据类型Symbol(表示独一无二的值),其作用主要是从根本上防止属性名的冲突而设定的. 除了基本数据类型之外,还有引用数据类型object,也有人称之为复杂数据类型,包含了我们常见的Array.Object.Function等. 所以现在js中的数据类型共有七种. PS: Symbol数据类型通过Symbol函数生成.也就

  • 详解javascript中的Strict模式

    简介 在ES5中,引入了strict模式,我们可以称之为严格模式.相应的sloppy mode就可以被称为非严格模式. 严格模式并不是非严格模式的一个子集,相反的严格模式在语义上和非严格模式都发生了一定的变化,所以我们在使用过程中,一定要经过严格的测试.以保证在严格模式下程序的执行和非严格模式下的执行效果一致. 使用Strict mode strict mode会改变javascript的一些表现,我们将会在下一节中进行详细的讲解. 这里先来看一下,怎么使用strict mode. Strict

  • 详解JavaScript中任意两数加减的解决方案

    目录 写在前面 分析填坑思路 解决整数加减的坑 转换科学计算 解决整数减法的坑 解决小数加法的坑 解决小数减法的坑 解决整数加小数的通用问题 总结 写在前面 本文是从初步解决到最终解决的思路,文章篇幅较长 虽然是一篇从0开始的文章,中间的思维跳跃可能比较大 代码的解析都在文章的思路分析和注释里,全文会帮助理解的几个关键词 1.Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 2.15长度的字符串 3.padStart 和 padEnd 分析填坑思

  • 一文详解JavaScript中prototype的使用

    目录 prototype初步认识 函数有prototype属性,函数创建的对象没有 获得当前对象的属性 父和子的扩展 子的proto和prototype的区别 扩展得到的东西到底从哪来的 prototype初步认识 在学习JavaScript中,遇到了prototype,经过一番了解,知道它是可以进行动态扩展的 function Func(){}; var func1 = new Func; console.log(func1.var1) //undefined Func.prototype.v

随机推荐