相等判断方式有三种:
(1)strict Equality 严格相等 ===
不进行类型转换,直接比较;
引用类型比较其地址位置
// 严格相等 Strict Equality
// 基础类型不进行类型转换 - Number, Boolean, String, Null, undefined
console.log(undefined === undefined); // true
console.log(null === null); // true
console.log(undefined === null); // false
console.log(0 === false); // false
console.log(false === null); // false
console.log("1" === "1"); // true
console.log("1" === 1); // true
console.log("1" === new String("1")); // true
// 引用类型,指向引用地址 Object, Array, Date
console.log([1, 2] === [1, 2]); // false
var array = [2, 3];
console.log(array === [2, 3]); // false
console.log(new Date() === new Date()); // false
(2)Abstract Equality 非严格相等 ==
隐式转换后,进行严格相等比较;
如何转换? 优先将a == b中(a,b)中能转换成number的值转换成number;
// NaN和谁比都是为false;
// undefined, null除了和自身以及彼此比,都是为false;
// Number, String, Boolean 都是优先转为Number再进行比较,如果不能,则用String进行比较
console.log(1 == "1"); // true
console.log(0 == false); // true
console.log(1 == false); // false
console.log(undefined == false); // false
console.log(null == false); // false
console.log(null == null); // true
console.log(NaN == NaN); // false
console.log(null == undefined); // true
toPrimitive () : 通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。
console.log(["1"] == "1"); // true
console.log({} == {}); // false 类型一样,直接比较严格相等比较
let a = ["1,2,3", "4,5"];
console.log(a == "1,2,3,4,5"); // true
console.log(a == ["1,2,3", "4,5"]); // false
let obj = { a: "1,2,3" };
console.log(obj == '{a: 1,2,3}'); // false
console.log(obj == 'a: 1,2,3'); // false
console.log(obj == '1,2,3'); // false
console.log(obj == obj.toString()); // true
例外:
窄对象 document.all == undefined
技巧: a !== a // true -> a= NaN
(3)Same Value同值相等 Object.is(a, b)
Same Value: 等价于 ===
例外:+0/-0, NaN和NaN
console.log(+0 === -0); // true
console.log(Object.is(+0, -0)); // false
console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
Same-Value-Zero 同零值相等
与同值相等类似,不过 +0 == -0 // true
即,只增加NaN == NaN的判断。