==是宽松相等,会进行类型转换。===是严格相等不会进行类型转换
类型转换规则
📌 == 进行类型转换的原理
当 == 进行比较时,它会按照以下转换规则进行类型转换:
📌 规则 1:null 和 undefined 特殊处理
console.log(null == undefined); // ✅ true(特殊规则)
console.log(null === unefined); // ❌ false
✔ null 只等于 undefined,不等于 false、0、"" 等
✔ null 和 undefined 都不会转换为 0(与 false 不相等)
📌 规则 2:Boolean 转换为 Number
console.log(true == 1); // ✅ true(true → 1)
console.log(false == 0); // ✅ true(false → 0)
console.log(false == "0"); // ✅ true(false → 0, "0" → 0)
✔ true 变为 1,false 变为 0,然后再进行比较。
📌 规则 3:字符串和数字比较时,字符串转换为数字
console.log("123" == 123); // ✅ true("123" → 123)
console.log("0" == false); // ✅ true("0" → 0, false → 0)
console.log(" " == 0); // ✅ true(空字符串转换成 0)
✔ 字符串会转换为数字再比较
✔ "" 和 " "(空格)都会变为 0
📌 规则 4:对象和原始值比较时,对象转换为原始值
对象在比较时,会先调用 valueOf() 或 toString() 转换为基本类型
console.log([] == ""); // ✅ true(`[].toString()` → `""`)
console.log([] == false); // ✅ true(`[].toString()` → `""`,`false → 0`)
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() 来判断