Lawguancong / Daily-Charging-Learning

0 stars 0 forks source link

==和===和Object.is() #30

Open Lawguancong opened 3 years ago

Lawguancong commented 3 years ago

比较的分类

  1. 基础数据类型(值比较;symbol除外)
  2. 引用数据类型(引用地址比较)

===

严格相等运算符 / 全等运算符 === 不需要进行类型转换,只有类型相同并且值相等时,才返回 true.

==

相等运算符 / 非全等运算符 == 如果两者类型不同,首先需要进行类型转换。具体流程如下: • 首先判断两者类型是否相同,如果相等,判断值是否相等. • 如果类型不同,进行类型转换 • 判断比较的是否是 null 或者是 undefined, 如果是, 返回 true . • 判断两者类型是否为 string 和 number, 如果是, 将字符串转换成 number • 判断其中一方是否为 boolean, 如果是, 将 boolean 转为 number 再进行判断 • 判断其中一方是否为 object 且另一方为 string、number 或者 symbol , 如果是, 将 object 转为原始类型再进行判断

Object.is()

本质上,是对“严格相等运算符===“的进一步优化

Object.is('foo', 'foo')
// true
Object.is({}, {})
// false
不同之处只有两个:一是+0不等于-0,二是NaN等于自身。
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

const a = { name: 'haha' };
const b = a
const c = { name: 'haha' };
Object.is(a, b); // true
Object.is(a, c); // false
Object.is(b, c); // false

特殊情况

基础数据类型 -> symbol

const sym1 = Symbol(123);
const sym2 = sym1;
const sym3 = Symbol(123);
sym1 === sym2; // true
sym1 === sym3; // false
sym2 === sym3; // false
Object.is(sym1, sym2); // true
Object.is(sym1, sym3); // false
Object.is(sym2, sym3); // false

参考链接 https://es6.ruanyifeng.com/#docs/object-methods#Object-is