==方法
1、两个复合类型(对象、数组、函数)比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址,所以两个对象总是不相等的
[] == [] // false
{} === {} // false
(function(){} === function(){}) // false
2、两侧类型不相同时,会发生隐式转换
-
NaN和其它任何比较永远false,包括它自己NaN == NaN // false -
Boolean和其它任何比较,首先被转换成Numbertrue == 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这部分强制转换请转到我的另外一条博客里:blog.csdn.net/xumaozeng/a…
-
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
return x !== x && y !== y;
}
};
}