大家好,我是31 岁、积极活泼、喜欢把技术讲成故事的小米。
今天我们不背定义、不抄规范,我想请你跟我一起,走进一条JavaScript 王国的“相亲一条街” ,看看几位操作符主角,是如何把无数前端和 Java 后端工程师折磨到怀疑人生的。
本文主题只有一个,但非常重要:JavaScript 操作符:相等操作符
内容分两大块:
- 等于和不等于(== / !=)
- 全等和不全等(=== / !==)
放心,故事很长,坑也很多,但看完你一定会有一种感觉:
“原来我以前写的那些 Bug,都是有原因的……”
故事开场:JavaScript 王国的“相亲一条街”
在 JavaScript 王国里,住着各种各样的“数据角色”:
- 数字先生 Number
- 字符串小姐 String
- 布尔兄弟 Boolean
- 空空如也的 null
- 神秘莫测的 undefined
- 还有性格复杂的 Object
而在王国最热闹的地方,有一条街,叫做:相等操作符一条街
这条街上,住着四位“判官”:
很多 Bug,其实不是你写错了逻辑,而是你选错了判官。
第一位登场:等于(==)——“能凑合就凑合”
1、 == 的座右铭
== 的人生信条只有一句话: “只要结果看起来一样,过程我不太在乎。”
它最擅长做的事情,叫做——类型转换。
2、一个经典相亲故事
在相亲一条街上:
- 数字 1 说:“我是 Number”
- 字符串 '1' 说:“我是 String”
== 看了一眼,说:“别管你们来自哪个类型了,我先把你们统一成数字看看。”
于是:
结果一样?好,相等!
3、更离谱的相亲现场
== 的操作流程大概是:
这时候你可能会问:“小米,这合理吗?”
我只能说:合理,但不讲道理。
4、null 和 undefined:暧昧关系的巅峰
这是 == 世界里最特殊的一条规则。在 JavaScript 王国里:
- null:我什么都没有
- undefined:我压根还没被定义
== 看了看他们,说了一句非常暧昧的话:“你俩虽然不一样,但都挺‘空’的,那就算你们一样吧。”
注意:他们只对彼此这样。
5、== 的完整气质总结
不等于(!=)——“等于的反面”
1、!= 并不独立
很多人以为 != 是个全新的判官,其实不是。它的工作流程是:
先用 == 判断,再把结果取反
因为:
所以:
2、!= 的坑,一点都不比 == 少
你只要记住一句话: != 的危险程度 ≈ ==
故事转折:原则派登场——全等(===)
如果说 == 是“能凑合就凑合”,那 === 就是: “不合规矩,免谈。”
1、=== 的三条铁律
=== 判断相等,必须同时满足:
- 类型相同
- 值相同
- 不做任何类型转换
哪怕你们“看起来一样”,但出身不同,直接拒绝。
2、冷静到极致的判断
在 === 眼里:“你是谁,你就是什么,别想伪装。”
3、对象:=== 的“亲子鉴定仪”
虽然:
- 都是对象
- 都长得一样
但在内存世界里:它们不是同一个人。
因为它们指向同一块内存地址。
不全等(!==)——原则派的反义词
1、!== 的工作方式
和 != 类似:先用 === 判断,再取反
因为:
2、这是最安全的不等判断方式
没有任何暧昧,没有任何隐式转换。
四大操作符终极对照表
这是你可以直接收藏的一张表:
真实世界的血泪教训
1、一个真实 Bug 场景
当:
结果是:
于是你开始怀疑人生。
2、改成 ===,世界立刻清净
这时候:
Bug 消失,夜里睡得安稳。
为什么 ESLint 强烈推荐 ===
你可能见过这条规则:
它的潜台词是: “不要让 JavaScript 帮你做决定。”
让代码明确,让行为可预期,让未来的你感谢现在的你。
面试官最爱问的那句话(标准回答版)
Q:== 和 === 有什么区别?
你可以这样回答:
== 是抽象相等,会进行隐式类型转换后再比较,存在较多隐式规则和坑点;
=== 是严格相等,不进行类型转换,要求类型和值都相同,更安全、更可预测,因此在实际开发中推荐优先使用 ===。
如果你再补一句:
“只有在明确知道类型转换规则且有意为之的情况下,才考虑使用 ==。”
恭喜你,这题基本稳了。
总结
JavaScript 的相等操作符,看起来只是几个符号:
== != === !==
但它们背后,是:
- 一整套类型系统
- 一堆历史包袱
- 无数工程师的眼泪
我常跟新人说一句话: “你不是写错了代码,你只是太相信 == 了。”
END
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、转发给那个还在用 == 的朋友。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
我们下篇再见。