==、=== 和 Object.is():你真的了解JS中的‘相等’吗?

深夜加班的程序员“离奇翻车”

凌晨2点,程序员小林正赶工一个电商促销功能。
他写下一行代码:

if (coupon.value == userInput) applyDiscount(); // 用户输入可能是字符串或数字

测试时,用户输入"0",系统却给满100元的商品打了1折!原来,"0"被转为数字0,而优惠码0对应的是1折活动。
小林崩溃:“我明明判断了相等啊?!”

这个夜晚,他终于明白:JS的“相等”背后,藏着无数个“陷阱代码”

JavaScript的三种“相等”武器

JS提供了三种比较操作符,分别应对不同场景:

  1. 宽松相等(==):会“变通”类型,适合“表面值”比较
  2. 严格相等(===):类型和值必须“双达标”
  3. 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()
  • 避免使用:==(除非明确需要类型转换)

你的代码中藏着多少“相等”陷阱?

试判断以下结果:

console.log([] == ![])     // ???
console.log(Object.is([], [])) // ???

(答案:truefalse!哈哈,你猜对了吗?)

通过这篇指南,希望你不再被JS的“相等”谜题困扰!下次遇到比较,记得“三思而后行”哦!

🔥 关注我的公众号「哈希茶馆」一起交流更多开发技巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈希茶馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值