【前端每天一题】🔥 第 12 题:== 与 === 的区别?为什么 [] == ![] 是 true?

== 与 === 的区别 - 前端高频必考题

第 12 题:== 与 === 的区别?为什么 [] == ![] 是 true?

这道题属于前端面试常年 TOP 级别,必考。

第 12 题:== 与 === 的区别?为什么 [] == ![] 是 true?


一、===(严格相等)

不进行类型转换,类型不同必定不等。

示例:

javascript 复制代码
1 === '1'           // false
true === 1          // false
null === undefined  // false

二、==(抽象相等)

会进行复杂的隐式类型转换。

转换规则(必须背):

  1. 对象 == 基本类型 → 对象转成基本类型(调用 valueOf 或 toString)
  2. 字符串、数字、布尔值 → 最终都会先转成数字比较
  3. null 和 undefined 只互相相等
  4. NaN == 任何值都是 false

三、重点:对象与基本类型比较

复制代码
对象 == 基本类型 → 对象 → 基本类型(toPrimitive)

示例:

javascript 复制代码
[] == 0   // true
// [] -> '' -> 0 == 0

为什么 [] 会变成 ""

因为:

javascript 复制代码
[].toString() === '' 

四、终极面试题:为什么 [] == ![] 是 true?

这是前端面试真·高频题。

✔ 第一步:先算 ![]

  • [] 是对象,所以是真值 → true
  • ![]false

所以表达式变成:

javascript 复制代码
[] == false

✔ 第二步:false 转成数字

根据规则:布尔值 → 数字

  • false → 0
javascript 复制代码
[] == 0

✔ 第三步:对象转基本类型(数组 → 字符串 → 数字)

  • [].toString()''
  • Number('')0

最终:

ini 复制代码
0 == 0 → true

五、另外三个容易考的陷阱题(你顺便拿下)

❓ 1. "0" == false → ?

  • false → 0
  • "0" → Number("0") = 0
  • 结果: true

❓ 2. [] == [] → ?

  • 引用类型比较地址
  • 两个不同数组地址不同
  • 结果: false

❓ 3. null == undefined → ?

  • 规则规定它俩互相相等
  • 结果: true

六、总结表(面试官最爱)

表达式 结论 原因
[] == ![] true ![]→false→0;[]→""→0
[] == false true false→0;[]→0
[] == 0 true []→""→0
"" == 0 true ""→0
null == undefined true 规则
[] == [] false 引用不同

七、速记卡片(背这个就够了)

ini 复制代码
🎯 === 不转换类型
🎯 == 会类型转换,最终都转成数字比较

📌 布尔转数字:true=1,false=0
📌 对象和基本类型比较:对象 → 基本类型(toString/valueOf)
📌 数组变成:[].toString() === ''

🔥 必考:[] == ![]
[] == false → false→0;[]→""→0 → 0==0 → true
相关推荐
Hilaku33 分钟前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒34 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术35 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
UrbanJazzerati36 分钟前
统计学的"测谎仪":一文搞懂方差、标准差与“N-1”的秘密
面试
颜酱36 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
全栈前端老曹1 小时前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理
HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件
前端·javascript·vue.js
顾林海1 小时前
Android文件系统安全与权限控制:给应用数据上把“安全锁”
android·面试·操作系统
boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆1 小时前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化