【JavaScript基础】== 和===

33 阅读1分钟

学习地址: developer.mozilla.org/zh-CN/docs/…

相等判断方式有三种:

(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的判断。