== 和 ===的区别,以及类型转换的规则

91 阅读1分钟

==是宽松相等,会进行类型转换。===是严格相等不会进行类型转换

类型转换规则

📌 == 进行类型转换的原理

== 进行比较时,它会按照以下转换规则进行类型转换:

📌 规则 1:null 和 undefined 特殊处理

console.log(null == undefined); // ✅ true(特殊规则)
console.log(null === unefined); // ❌ false

null 只等于 undefined,不等于 false0""

nullundefined 都不会转换为 0(与 false 不相等)


📌 规则 2:Boolean 转换为 Number

console.log(true == 1);  // ✅ truetrue1)
console.log(false == 0); // ✅ truefalse0)
console.log(false == "0"); // ✅ truefalse0, "0"0

true 变为 1false 变为 0,然后再进行比较。


📌 规则 3:字符串和数字比较时,字符串转换为数字

console.log("123" == 123); // ✅ true"123"123)
console.log("0" == false); // ✅ true"0"0, false0)
console.log(" " == 0);     // ✅ true(空字符串转换成 0

字符串会转换为数字再比较

""" "(空格)都会变为 0


📌 规则 4:对象和原始值比较时,对象转换为原始值

对象在比较时,会先调用 valueOf()toString() 转换为基本类型

console.log([] == "");     // ✅ true(`[].toString()` → `""`)
console.log([] == false);  // ✅ true(`[].toString()` → `""`,`false0`)
console.log([1] == 1);     // ✅ true(`[1].toString()` → `"1"` → `1`)
console.log([1,2] == "1,2"); // ✅ true(`[1,2].toString()` → `"1,2"`)

数组、对象在比较时会先转换为字符串或数字

[].toString() 返回 ""(空字符串),所以 [] == false 变成 "" == 0,结果为 true


📌 规则 5:== 比较 NaN

console.log(NaN == NaN); // ❌ false
console.log(isNaN(NaN)); // ✅ true

NaN 不等于 NaN,需要使用 isNaN() 来判断