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 条
还没有评论,来抢沙发~