比较运算符

相等运算符

相等运算符==比较两个值是否相等,会进行类型转换。

基本用法

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

== vs ===

比较表达式 == 结果 === 结果 东巴文建议
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

NaN比较

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

null和undefined

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);
}

下一步

掌握了比较运算符后,让我们继续学习:

  1. 逻辑运算符 - 学习逻辑运算
  2. 其他运算符 - 学习其他运算符
  3. 条件语句 - 学习条件语句

东巴文(db-w.cn) - 让编程学习更简单

⚖️ 东巴文寄语:比较运算符是条件判断的基础,理解=====的区别,避免隐式类型转换的陷阱,是写出可靠代码的关键。在 db-w.cn,我们帮你避开每一个坑!