前端小知识003:JS中 == 与 === 的区别

在日常写 JavaScript 的过程中,===== 是两个经常会让开发者产生疑惑的比较运算符。它们看起来只差一个等号,但意义和行为却完全不同。理解这两者的区别,对于写出更加稳定、可靠的前端代码非常重要。


一、基础定义

==(宽松相等)

  • 会进行类型转换(type coercion)

  • 在比较前会尝试把两个值转换到同一类型再比较

  • 因此经常出现"看起来不合理但成立"的结果
    ===(严格相等)

  • 不会进行类型转换

  • 类型和值必须都相同才返回 true

  • 更加安全,推荐在大多数情况下使用

二、==的类型转换规则详解

2.1 字符串与数字的比较

当字符串与数字比较时,字符串会被转换为数字。

javascript 复制代码
console.log(123 == '123');     // true, '123' → 123
console.log(0 == '0');         // true, '0' → 0
console.log(1 == '1.00');      // true, '1.00' → 1
console.log(1 == '1abc');      // false, '1abc' → NaN
console.log(0 == '');          // true, '' → 0

2.2 布尔值与其他类型的比较

布尔值会先被转换为数字(true→1, false→0),然后再进行比较。

javascript 复制代码
console.log(true == 1);        // true, true → 1
console.log(false == 0);       // true, false → 0
console.log(true == '1');      // true, true → 1, '1' → 1
console.log(false == '');      // true, false → 0, '' → 0
console.log(true == '2');      // false, true → 1, '2' → 2

2.3 null 和 undefined 的特殊规则

nullundefined 在宽松相等中相互相等,但与其他值都不相等。

javascript 复制代码
console.log(null == undefined); // true
console.log(null == 0);        // false
console.log(null == '');       // false
console.log(undefined == 0);   // false
console.log(undefined == '');  // false

2.4 对象与原始值的比较

对象会通过 valueOf()toString() 方法转换为原始值后再比较。

javascript 复制代码
console.log([1] == 1);         // true, [1] → '1' → 1
console.log([1] == '1');       // true, [1] → '1'
console.log([] == 0);          // true, [] → '' → 0
console.log([] == false);      // true, [] → '' → 0, false → 0

const obj = {
  valueOf() { return 100; },
  toString() { return '200'; }
};
console.log(obj == 100);       // true, obj.valueOf() → 100

三、特殊情况分析

3.1 NaN 的异常行为

NaN与任何值(包括自己)都不相等。

javascript 复制代码
console.log(NaN == NaN);       // false
console.log(NaN === NaN);      // false
console.log(NaN == 0);         // false
console.log(NaN == 'NaN');     // false

// 判断 NaN 的正确方式
console.log(Number.isNaN(NaN)); // true
console.log(Object.is(NaN, NaN)); // true

3.2 复杂对象的比较

对象比较的是引用地址,而不是内容。

javascript 复制代码
const obj1 = { name: 'John' };
const obj2 = { name: 'John' };
const obj3 = obj1;

console.log(obj1 == obj2);     // false,不同引用
console.log(obj1 == obj3);     // true,相同引用
console.log(obj1 === obj2);    // false
console.log(obj1 === obj3);    // true

四、推荐使用===

javascript 复制代码
// 显式类型转换后使用 ===
const num = Number(inputValue);
if (num === 1) { ... }

// 使用 parseInt 明确转换
const page = parseInt(urlParams.page, 10);
if (page === 1) { ... }

// 使用 Boolean() 明确转换
const isValid = Boolean(someValue);
if (isValid === true) { ... }
相关推荐
yuanyxh4 小时前
macOS 应用 - 纯对话生成
前端·macos·ai编程
大家的林语冰4 小时前
ES5 凉凉,Babel 8 正式发布,默认不再编译为 ES5 和 CJS......
前端·javascript·前端工程化
光影少年5 小时前
react批量更新、同步/异步更新场景
前端·react.js·掘金·金石计划
假如让我当三天老蒯5 小时前
模块化:ES Module 与 CommonJS 的区别
前端·面试
用户40950115773175 小时前
Private Forge v2.0 发布:12大前端业务场景技能系统
前端
weedsfly6 小时前
异步编程全景与事件循环——彻底搞懂 JS 执行机制
前端·javascript
用户059540174466 小时前
AI Agent记忆测试踩坑实录:Mock骗了我一周,Mem0+pytest一招破局
前端·css
用户1733598075376 小时前
纯前端 PDF 数字签名实战:Vue 3 + pdf-lib 在浏览器里完成签名嵌入
前端·javascript
IT_陈寒7 小时前
SpringBoot自动配置的坑,我爬了三天才出来
前端·人工智能·后端
Avan_菜菜13 小时前
AI 能写代码了,为什么我反而开始要求它先写文档?
前端·github·ai编程