相等是“==”,而全等是“===”,相等和全等的区别,总结就是:
- 相等 ==: 先转换类型再比较
- 全等 ===:直接比较,不转换类型,只要是类型不同就不相等,类型相同的看值是否相等
- Object.is(value1,value2):ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。
Object.is
就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
Object.is与“===”不同之处只有两个:一是
+0
不等于-0
,二是NaN
等于自身。
例如:
55 == "55" // true
55 === "55" // false
分析代码,对于相等来说”55”会被转换成number类型的55,所有比较后相等,但是对于全等来说,”55”不会被转换,由于类型不同(一个number一个String)所有比较之后为false,所以对于全等来说,必须保证数据类型也相同
相等转换规则:
- 对于boolean值,false转换为0,true转换为1
代码为:
true == 1 // true
true == 2 // false
- 如果一个操作数是字符串,另一个是数值,比较之前将字符转换为数值
代码为:
"5" == 5 // true
- null 与 undefined比较是相等的,而且对比之前不能将null与undefined转换成其他值
代码为:
null == undefined // true
null == 0 // false
undefined == 0 // false
- 如果两个操作数是对象,那么比较他们是不是指向同一个对象。
代码为:
var a = {}
var b =a
a == b // true
c = {}
a == c // false
- 有一个操作符为NaN就返回false
代码为:
NaN == NaN // false
5 = NaN // false
NaN === NaN //false
- 如果其中一方是否为 object 且另一方为 string、number 或者 symbol , 将 object 转为原始类型再进行判断
let person1 = {
age: 25
}
let person2 = person1;
person2.gae = 20;
console.log(person1 === person2); //true,注意复杂数据类型,比较的是引用地址
-
new Number()
是一个内置的函数构造函数。 虽然它看起来像一个数字,但它并不是一个真正的数字:它有一堆额外的功能,是一个对象。当我们使用==
运算符时,它只检查它是否具有相同的值,所以a和b是相等的;然而,当我们使用===
操作符时,类型和值都需要相等,b和a与c的类型不一样,所以不等。
==
会引发隐式类型转换,右侧的对象类型会自动拆箱为Number
类型。
let a = 3;
let b = new Number(3);
let c = 3;
console.log(a == b); //true
console.log(a === b); //false
console.log(b === c); //false
思考:[] == ![]
我们来分析一下: [] == ![]
是true还是false?
- 首先,我们需要知道 ! 优先级是高于 == (更多运算符优先级可查看: 运算符优先级)
![]
引用类型转换成布尔值都是true,因此![]
的是false- 根据上面的比较方法,其中一方是 boolean,将 boolean 转为 number 再进行判断,false转换成 number,对应的值是 0.
- 根据上面比较方法,有一方是 number,那么将object也转换成Number,空数组转换成数字,对应的值是0.(空数组转换成数字,对应的值是0,如果数组中只有一个数字,那么转成number就是这个数字,其它情况,均为NaN)
- 0 == 0; 为true