为什么 "10" > "2" 是 false?JS 关系操作符真相曝光

18 阅读5分钟



上周末,我妈又给我安排了一场相亲。她语气非常严肃地跟我说了一句话:“小米啊,这次条件我都给你筛好了,你只要负责比较就行。”

我一愣:比较? 这话听起来怎么这么像 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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!