相等运算符==比较两个值是否相等,会进行类型转换。
console.log(5 == 5); // true
console.log(5 == "5"); // true(类型转换)
console.log(true == 1); // true
console.log(false == 0); // true
console.log(null == undefined);// true
console.log("" == 0); // true
| 类型1 | 类型2 | 转换规则 | 结果 |
|---|---|---|---|
| 数字 | 字符串 | 字符串转数字 | 5 == "5" → true |
| 布尔值 | 任意 | 布尔值转数字 | true == 1 → true |
| 对象 | 原始值 | 对象转原始值 | [1] == 1 → true |
| null | undefined | - | null == undefined → true |
| NaN | 任意 | - | NaN == NaN → false |
console.log(NaN == NaN); // false
console.log(NaN != NaN); // true
console.log([] == false); // true
console.log([] == ![]); // true
console.log({} == !{}); // false
console.log(null == 0); // false
console.log(undefined == 0); // false
严格相等运算符===比较两个值是否相等,不进行类型转换。
console.log(5 === 5); // true
console.log(5 === "5"); // false(类型不同)
console.log(true === 1); // false
console.log(false === 0); // false
console.log(null === undefined);// false
console.log("" === 0); // false
// 对象比较的是引用地址
let obj1 = { name: "东巴文" };
let obj2 = { name: "东巴文" };
let obj3 = obj1;
console.log(obj1 === obj2); // false(不同引用)
console.log(obj1 === obj3); // true(同一引用)
// 数组同理
let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2); // false
console.log(arr1 === arr1); // true
| 比较表达式 | == 结果 | === 结果 | 东巴文建议 |
|---|---|---|---|
| 5 == "5" | true | false | 使用=== |
| true == 1 | true | false | 使用=== |
| null == undefined | true | false | 使用=== |
| [] == false | true | false | 使用=== |
| 0 == "" | true | false | 使用=== |
| NaN == NaN | false | false | 使用Number.isNaN |
东巴文建议:始终使用===进行相等比较,避免隐式类型转换带来的意外结果。
!=console.log(5 != 3); // true
console.log(5 != "5"); // false(类型转换后相等)
console.log(true != 1); // false
console.log(null != undefined);// false
!==console.log(5 !== 3); // true
console.log(5 !== "5"); // true(类型不同)
console.log(true !== 1); // true
console.log(null !== undefined);// true
>和小于<console.log(5 > 3); // true
console.log(3 < 5); // true
console.log(5 > 5); // false
console.log("5" > 3); // true(字符串转数字)
console.log("a" < "b"); // true(字典序)
console.log("abc" < "abd"); // true
>=和小于等于<=console.log(5 >= 5); // true
console.log(5 <= 5); // true
console.log(5 >= 3); // true
console.log(3 <= 5); // true
// 按字典序比较
console.log("apple" < "banana"); // true
console.log("Apple" < "apple"); // true(大写字母ASCII码更小)
console.log("10" < "9"); // true(字符串比较,"1" < "9")
console.log("10" > 9); // true(转为数字比较)
// 使用localeCompare进行本地化比较
console.log("东".localeCompare("西")); // -1(东在西前面)
// 1. 同类型直接比较
console.log(5 > 3); // true
console.log("a" < "b"); // true
// 2. 数字与字符串比较,字符串转数字
console.log(5 > "3"); // true
console.log("5" > 3); // true
// 3. 布尔值转为数字
console.log(true > 0); // true(1 > 0)
console.log(false < 1); // true(0 < 1)
// 4. null转为0,undefined转为NaN
console.log(null >= 0); // true
console.log(null > 0); // false
console.log(undefined > 0); // false
console.log(undefined < 0); // false
let obj = {
valueOf() {
return 10;
},
toString() {
return "20";
}
};
console.log(obj > 5); // true(调用valueOf)
console.log(obj < 15); // true
// 没有valueOf时调用toString
let obj2 = {
toString() {
return "30";
}
};
console.log(obj2 > 20); // true
| 类型1 | 类型2 | 转换规则 | 东巴文说明 |
|---|---|---|---|
| 数字 | 数字 | 直接比较 | 无转换 |
| 字符串 | 字符串 | 字典序比较 | 无转换 |
| 数字 | 字符串 | 字符串转数字 | "5" → 5 |
| 布尔值 | 任意 | 布尔值转数字 | true → 1 |
| 对象 | 原始值 | 对象转原始值 | valueOf/toString |
// 错误写法
console.log(1 < 2 < 3); // true(看似正确)
console.log(3 > 2 > 1); // false!(实际错误)
// 解析:
// 1 < 2 → true, true < 3 → 1 < 3 → true
// 3 > 2 → true, true > 1 → 1 > 1 → false
// 正确写法
console.log(1 < 2 && 2 < 3); // true
console.log(3 > 2 && 2 > 1); // true
console.log(NaN === NaN); // false
console.log(NaN == NaN); // false
console.log(NaN > 5); // false
console.log(NaN < 5); // false
// 正确检测NaN
console.log(Number.isNaN(NaN)); // true
console.log(null == 0); // false
console.log(null > 0); // false
console.log(null >= 0); // true!(特殊规则)
console.log(undefined == 0); // false
console.log(undefined > 0); // false
console.log(undefined >= 0); // false
// 1. 使用严格相等
if (value === 5) {} // 推荐
if (value == 5) {} // 不推荐
// 2. 避免连续比较
if (min <= value && value <= max) {} // 推荐
if (min <= value <= max) {} // 错误
// 3. 明确类型转换
if (Number(str) === 5) {} // 推荐
if (str == 5) {} // 不推荐
// 4. 使用Number.isNaN检测NaN
if (Number.isNaN(value)) {} // 推荐
if (value === NaN) {} // 永远为false
// 5. 对象比较使用深度比较
function deepEqual(a, b) {
return JSON.stringify(a) === JSON.stringify(b);
}
掌握了比较运算符后,让我们继续学习:
东巴文(db-w.cn) - 让编程学习更简单
⚖️ 东巴文寄语:比较运算符是条件判断的基础,理解
==和===的区别,避免隐式类型转换的陷阱,是写出可靠代码的关键。在 db-w.cn,我们帮你避开每一个坑!