深夜加班的程序员“离奇翻车”
凌晨2点,程序员小林正赶工一个电商促销功能。
他写下一行代码:
if (coupon.value == userInput) applyDiscount(); // 用户输入可能是字符串或数字
测试时,用户输入"0"
,系统却给满100元的商品打了1折!原来,"0"
被转为数字0,而优惠码0对应的是1折活动。
小林崩溃:“我明明判断了相等啊?!”
这个夜晚,他终于明白:JS的“相等”背后,藏着无数个“陷阱代码”。
JavaScript的三种“相等”武器
JS提供了三种比较操作符,分别应对不同场景:
- 宽松相等(==):会“变通”类型,适合“表面值”比较
- 严格相等(===):类型和值必须“双达标”
- Object.is():专治特殊病例(如
NaN
、-0)
详解三种比较规则
1. 宽松相等(==):类型转换的“老好人”
1 == '1' // true(字符串→数字)
0 == false // true(布尔→数字)
'' == 0 // true(空字符串→0)
特点:自动转换类型,但隐藏陷阱!
致命缺点:
null == undefined // true(特殊规定)
[] == 0 // true(数组转空字符串→0)
2. 严格相等(===):铁面无私的“裁判”
1 === '1' // false(类型不同)
0 === false // false(数字 vs 布尔)
NaN === NaN // false(NaN≠NaN!)
+0 === -0 // true(视为相同)
特点:类型和值必须严格一致,推荐日常使用。
例外情况:
NaN !== NaN
(需用isNaN()
检测)+0 === -0
(某些数学场景需区分)
3. Object.is():精准的“显微镜”
Object.is(NaN, NaN) // true(专治NaN)
Object.is(+0, -0) // false(区分±0)
Object.is('1', 1) // false(不转换类型)
特点:
- 不转换类型,不特殊对待NaN和±0
- 适用场景:不可变属性修改、严格区分特殊值
一张表彻底理清区别
场景 | == | === | Object.is() |
---|---|---|---|
0 == '0' | ✅ | ❌ | ❌ |
NaN == NaN | ❌ | ❌ | ✅ |
+0 == -0 | ✅ | ✅ | ❌ |
null == undefined | ✅ | ❌ | ❌ |
如何选择?黄金指南
- 日常开发:优先使用===,避免隐式转换坑
- 特殊需求:
- 检测NaN →
Object.is(x, NaN)
或x !== x
- 区分±0 →
Object.is()
- 检测NaN →
- 避免使用:==(除非明确需要类型转换)
你的代码中藏着多少“相等”陷阱?
试判断以下结果:
console.log([] == ![]) // ???
console.log(Object.is([], [])) // ???
(答案:true
和false
!哈哈,你猜对了吗?)
通过这篇指南,希望你不再被JS的“相等”谜题困扰!下次遇到比较,记得“三思而后行”哦!
🔥 关注我的公众号「哈希茶馆」一起交流更多开发技巧