关于字符串数字对比有差异这档子事

897 阅读2分钟

前言

今天是个阳光明媚的一天,正在寻觅新素材的时候,看到牛逼的群友提出个问题就是
image.png
为什么 '1' < '10' == true'2' < '10' == false 呢?

设想

本来以为 String 同类型 ,如果比较的话是以长度来比较,但是看到 '1' < '10' == true 时我就发现事情好像没有这么简单!但是这里合理的!接下来请听我慢慢道来~

首先申明一个点,如果其他同类型确实不会转类型去比对。

  • 但是如果是String的同类型做大小于比对的话,会转换成unicode码比对!
  • 并且默认转换的是首字符的unicode码,如果相等会逐一对比,直到产生结果,将停止对比返回结果

转换成代码就是:

 '1'.charCodeAt() < '1'.charCodeAt() //字符串 1转unicode码  和字符串 1转unicode码 对比 
 '' < '0'.charCodeAt() 

他们会先去比第一位☝️ ,得到的unicode码相同,然后再去比 第二位 但是 '1' 只有一位,所以会拿到 ''0unicode码码对比

image12.png

就是这样,按照 空字符和数字对比 会强转为 数字的规则

image13.png

空对象 会转换成 0

image14.png
所以得到结果 '1'< '10' == true 成立!

转换规则详情可见
image.png

'0' < '' 特殊的对比

image.png
事实上也会有一些特殊判断如 '0' < '' 那是因为 空字符经过unicode码NaN'0'是48的 unicode码
NaN是不合法的特殊Number值,并大于合法数组,除了Infinity无穷大

结论

明白了这个概念就很好解释 '1' < '10' 是为什么了
首先他们并不是不同类型相比,并且不是 == 相比,大小于相比会把他们首字符转换成unicode码对比大小, 如果首字符对比unicode码相同将逐一对比

扩展例子

image.png

  • 第一个因为有一个number 所以转换成了 number 去对比
  • 第二个都是string 并且 大小于对比 首字母转换unicode码对比。后面相当于''unicode码的对比

另外 说个好玩的

image3.png

这个 是因为 '选'的unicode 码大于 '努'的unicode 码

也证明程序中也是 每个所做的选择都很重要
一起努力一起进步,我是阿江!