likes
comments
collection
share

一文总结 === 、 == 、Object.is()的区别

作者站长头像
站长
· 阅读数 67

JavaScript, 判等运算一直是让人迷惑的地方,为什么会有 ===== 之分,以及为什么后面又会出现 Object.is()。这里面涉及到 JS 的隐式类型转换,也是笔试、面试常考点,学好它还是很有必要的。

===

在 JS 中, == = 叫做全等运算符,全等操作符由 3 个等于号( === )表示,不会进行隐式类型转换,即必须类型相同值也相同,才会相等。

对于值类型:

如果数据的类型不相等,肯定是为 false

let result1 = ("55" === 55); // false,不相等,因为数据类型不同
let result2 = (55 === 55); // true,相等,因为数据类型相同值也相同

undefined 和 null 与自身严格相等

let result1 = (null === null)  //true
let result2 = (undefined === undefined)  //true

特殊情况:

  • NaN !==NaN
  • +0 === -0
console.log(NaN === NaN) // false
console.log(+0 === -0); // true

对于引用类型:

引用类型也叫复杂数据类型,像普通对象、Array、Function、Map、Set 都可以算作 object 类型的一种,他们的基类是 Object

对于引用数据类型,比较的是他们的引用地址

const obj1 = {
  name: "张三",
};

const obj2 = {
  name: "张三",
};
const obj3 = obj1;

console.log(obj1 === obj2); // false
console.log(obj1 === obj3); // true
console.log({} === {}); // false

==

等于操作符用两个等于号( == )表示,如果操作数相等,则会返回 true,等于操作符在比较中会进行隐式类型转换,再确定操作数是否相等。

记住 === 和 == 最根本的一点, == 会进行隐式类型转换,这也是让 == 变的难以理解的根本原因

这里做个思维导图总结一下。 一文总结 ===   、 ==  、Object.is()的区别

首先,对于特殊情况,大家记一下就好

console.log(undefined == null); // true
console.log(NaN == NaN); // false
console.log(+0 == -0); // true

对于类型相等的情况,直接比较值,这里和 === 的规则是一样的,不多说

最后,说一下最不好理解的类型不同的情况

分为以下两种情况:

  • 均为值类型(原始值):把不是 number 类型转为number类型,最后可以看成是两个number类型的值进行比较

对于隐式转换规则,不好展开讲,自行学习

let result1 = (true == 1); // true, true 会被转为 1
let result1 = ("55" == 55); // true,"55"会被转为 55
  • 一端为值类型,一端为为引用类型:
    • 把引用类型一端转换为值类型。To Primitive,首先调用 valueOf 方法生成一个值,若转换后的值仍然不是值类型,则在调用 toString方法转为值类型(toString() 一定会转成一个字符串,至于为什么会有 valueOf 和 toString 这两个方法,它们都是位于原型链上 )。
    • 现在两端都为值类型了,进行两端均为值类型规则比较(上面已讲)。

常见 object 数据的转换形式:

对象valueOf()toString()
Object原值"[object Object]"
Function原值"function xyz() {...}"
Array原值"x,y,z"
Date数字"Sat May 22 2021..."

当然,我们也可以自己重写 valueOf()toString() 这两个方法。

const obj = {
  valueOf() {
    return 1;
  }
}

let result1 = (obj == 1); // true

如何选择 === 和 == ?

相等运算符隐藏的类型转换,会带来一些违反直觉的结果,所以,除了在比较对象及其属性为null或者undefined的情况下,我们可以使用相等操作符(==),其他情况建议一律使用全等操作符( == =)

if (obj == null) {
  // ......
}

// 等同于
if (obj === null || obj === undefined) {
	// ......
}

Object.is()

Object.is() 是Object 这个内置对象的一个静态方法。它接收两个值,比较两个值是否相等,返回一个 boolean 值。

主要记住的一点:Object.is() 的表现基本和**全等运算符(===)**一致,除了以下两点:

  • 两个 NaN 相等
  • +0-0 不再相等
console.log(Object.is(NaN, NaN)); // true
console.log(Object.is(+0, -0)); // false

你可以把 Object.is() 看成是更加严谨的 ===

转载自:https://juejin.cn/post/7254006318285455418
评论
请登录