2020-12-24 JS中的相等性比较方法
==
方法
1、两个复合类型(对象、数组、函数)比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址,所以两个对象总是不相等的
[] == [] // false
{} === {} // false
(function(){} === function(){}) // false
2、两侧类型不相同时,会发生隐式转换
-
NaN
和其它任何比较永远false
,包括它自己NaN == NaN // false
-
Boolean
和其它任何比较,首先被转换成Number
true == 1 => 1 == 1 // true true == '2' => 1 == 2 // false true == ['1'] => 1 == 1 // true true == ['2'] => 1 == 2 // false undefined == false => undefined == 0 // false null == false => null == 0 // false
这部分强制转换请转到我的另外一条博客里:https://blog.csdn.net/xumaozeng/article/details/106782358
-
String
和Number
比较,先将String 转为Number类型123 == '123' => 123 == 123 // true '' == 0 => 0 == 0 // true
-
null
和undefined
比较结果是true,除此之外,null
和false
与其它任何值比较都是falsenull == undefined // true null == '' // false null == 0 // false null == false // false undefined == '' // false undefined == 0 // false undefined == false // false
-
原始类型和引用类型比较,对象还按照ToPrimitive规则转换为原始类型
'[object Object]' == {} // true '1,2,3' == [1,2,3] // true [] == ![] => [] == false => 0 == 0 // true [null] == 0 // true [undefined] == 0 // true,这两个都会被当成空数组处理
===
方法
这个严格相等性方法和上面不同点是,不会进行强制转换,先判断类型是否相等,在判断值是否相同,不过也有特殊情况将数字-0和+0视为相等,NaN总是不等于自身
Object.is(value1, value2)
方法
该方法判断两个值是否为同一个值,返回一个Boolean
值
有以下条件返回true
-
都是undefined
-
都是null
-
都是true或false
-
都是相同长度的字符串且相同字符按相同顺序排列
-
都是相同对象(有同一个引用)
-
都是数字且
- 都是+0 - 都是-0 - 都是NaN - 或都是非0而且非NaN且为同一个值
与==
运算不同,==
运算符在判断相等前对两边的变量(如果它们不是同一类型)进行强制转换(这种行为结果会将'' == false
判断为true
),而Object.is()
不会强制转换两边值
与===
运算也不同,===
运算(包括==
运算符)会将数字+0
与-0
视为相等,而将NaN
与NaN
视为不相等,而Object.is()
正好相反
MDN源码(polyfill)
if (!Object.is) {
Object.is = function (x, y) {
if (x === y) {
// +0 != -0;
return x !== 0 || 1 / x === 1 / y;
} else {
// NaN == NaN
return x !== x && y !== y;
}
};
}