上周末,我妈又给我安排了一场相亲。她语气非常严肃地跟我说了一句话:“小米啊,这次条件我都给你筛好了,你只要负责比较就行。”
我一愣:比较? 这话听起来怎么这么像 JavaScript 里的关系操作符?
在相亲现场,你会不停地做判断:
- 年龄是不是 大于 我?
- 收入是不是 大于等于 我?
- 身高是不是 小于 180?
- 学历是不是 等于 本科?
- 三观是不是 不等于 前任?
你看,本质上,这就是一堆:关系判断
而在 JavaScript 里,干这活的,就是我们今天的主角:关系操作符(Relational Operators)
什么是关系操作符?
先别急着上代码,我们先站在“人话”的角度理解。关系操作符的作用只有一个:
用来比较两个值之间的关系,最终返回一个 boolean (true 或 false)
就像相亲结束后,你心里只会有两个答案:
- 行
- 不行
在 JavaScript 里,关系操作符主要包括:
-
- <
-
=
- <=
- instanceof
- in
别急,前四个你肯定熟,后两个很多人用得少,但面试特别爱问。
>、<、>=、<=:最像“家长问条件”的操作符
1、最基础的数值比较
先来最直观的。
这个没啥好说的,和小学数学一模一样。
2、字符串比较:不是你想的那样
重点来了。我第一次被 JS 坑,是在字符串比较这里。
很多人第一反应是:10 明明大于 2 啊?
但 JavaScript 想的是:逐个字符,按 Unicode 编码比较
比较过程是这样的:
- "10" 的第一个字符是 '1'
- "2" 的第一个字符是 '2'
- '1' < '2'
所以结果是:
类比一下相亲:
- 比的不是“总资产”
- 而是“第一个条件”
只要第一个条件输了,后面再优秀都没用。
3、数字 + 字符串:会发生什么?
这次怎么又对了?因为:关系操作符在比较时,会尝试把非数字转换为数字
转换过程:
然后再比:
所以记住一句话:关系操作符,更偏向“数值比较”
真正的坑:NaN 参与比较
来,深呼吸。
甚至:
在 JS 世界里,NaN 非常“高冷”:它谁都不比,包括它自己
类比一下:
NaN 就像相亲市场里一个人说:“别拿我跟任何人比,我不参与。”
所以实战建议只有一句:任何比较前,先确保不是 NaN
对象比较:你以为比内容,其实比地址
来看一段代码:
为什么?因为:对象比较时,比较的是引用地址,而不是内容
就好比两个人:
- 长得一模一样
- 三观一模一样
- 简历一模一样
但他们是两个人。在 JavaScript 看来:
类比总结一句:JS 看对象,就像看身份证号,不看脸。
关系操作符的“隐式转换规则”(面试必考)
我把常见规则给你捋一遍,相当于考前押题。
1、两边都是字符串
规则:按字符 Unicode 顺序逐位比较
2、有一边是数字
规则:全部转为数字再比较
3、有一边是对象
过程:
对象会经历:valueOf → toString → 数值转换
instanceof:你是不是“这个家族的人”
终于说到一个很有画面感的操作符了。
1、先看用法
返回:
- true
- false
2、它在干什么?
一句话解释:判断某个对象,是否出现在构造函数的原型链上
3、类比一下:家谱
instanceof 就像查家谱:
- 你是不是老王家的?
- 你爷爷是不是这个姓?
只要在家谱上能追溯到:就是一家人
4、示例代码
因为原型链是:
5、面试高频陷阱
记住:所有对象最终都继承自 Object
in 操作符:你家里有没有这个东西?
1、用法
2、它判断什么?
判断属性是否存在于对象或其原型链上
3、举个生活例子
你去朋友家:
- 冰箱在不在?
- 空调在不在?
你不管是他买的,还是房东留下的:只要屋里有,就算有
4、示例
为什么 toString 也是 true?因为:
in vs hasOwnProperty(面试常对比)
很多面试官会问:in 和 hasOwnProperty 有什么区别?
我直接给你一句“标准答案”。
真实项目中的坑(血泪经验)
坑 1:字符串数字比较
在项目里,我永远建议你显式转换:
坑 2:直接比较对象
对象比较的结果,极不直观,一定要拆字段。
坑 3:用 in 判断数组下标
in 判断的是:索引是否存在,而不是值是否存在
面试一句话总结(请背)
如果你时间紧,我给你一个终极面试版总结:
JavaScript 的关系操作符用于比较两个值之间的大小或关系,返回布尔值。
在比较过程中会发生隐式类型转换:
字符串按 Unicode 比较
非数字会尝试转为数字
对象会先转换为原始值,instanceof 用于判断原型链关系,in 用于判断属性是否存在(包括原型链)。
总结
很多人学 JavaScript,只记结论,不理解“为什么”。但你会发现:所有操作符,本质上都像生活里的判断逻辑
相亲、买房、面试、选方案,本质都是在做:
- 比大小
- 比归属
- 比存在
而关系操作符,就是 JavaScript 帮我们做这些判断的“理性大脑”。
END
如果你觉得这篇文章对你有帮助,欢迎点赞、在看、转发给那个还在被 JS 比较规则折磨的朋友。
我是小米,一个喜欢分享技术的31岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!