← 返回文章列表
JavaScript·2458 次阅读

JavaScript 数据类型与隐式转换的坑

JavaScript 数据类型与隐式转换的坑

最近被一道面试题虐了:[] == false 的结果是 true,但 !![] 却是 true。JS 的类型转换不搞清楚,写代码全靠猜。

七种数据类型

  • 原始类型:string、number、boolean、null、undefined、symbol(ES6 新增)
  • 引用类型:object(包括数组、函数、日期等)

原始类型存在栈里,赋值是复制;引用类型存的是堆地址,赋值复制的是指针:

const a = { name: 'a' }
const b = a
b.name = 'b'
console.log(a.name) // 'b',a 和 b 指向同一个对象

四则运算的转换规则

+ 只要有一边是字符串,另一边就转成字符串拼接;其他运算符尽量转数字:

1 + '2'        // '12'
'10' - 1       // 9
true + 1       // 2(true → 1)
null + 1       // 1(null → 0)
undefined + 1  // NaN(undefined 转数字是 NaN)

== 的转换套路

== 会在比较前做隐式转换,常见组合:

  • null 和 undefined 互相等,且不等于其他任何值
  • 一边是布尔值,先把布尔转成数字
  • 一边是字符串、一边是数字,字符串转数字

所以 [] == false 的过程是:[] 先转成原始值得到 '',false 转成 0,'' 再转成 0,最后 0 == 0。而 !![] 走的是布尔转换规则——所有对象都是真值。

实践建议

  • 比较一律用 ===,不给隐式转换表演的机会
  • 手动转换要明确:String(x)、Number(x)、Boolean(x)
  • 判断空值用 x == null,一次同时覆盖 null 和 undefined,这是唯一推荐的 == 场景

看到这里了?如果这篇文章帮到过你

请我喝瓶可乐就好 🥤

收款码

评论0 条

还没有评论,来抢沙发~

发表评论

评论需审核后显示

© 2026 许冬博客 · 专注 JS 技术分享

·RSS 订阅·Powered by Nuxt 4