前言
今天是个阳光明媚的一天,正在寻觅新素材的时候,看到牛逼的群友提出个问题就是
为什么 '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' 只有一位,所以会拿到 '' 和 0 的unicode码码对比
就是这样,按照 空字符和数字对比 会强转为 数字的规则
空对象 会转换成 0
所以得到结果 '1'< '10' == true 成立!
转换规则详情可见:
'0' < '' 特殊的对比
事实上也会有一些特殊判断如 '0' < '' 那是因为 空字符经过unicode码是NaN 而'0'是48的 unicode码
NaN是不合法的特殊Number值,并大于合法数组,除了Infinity无穷大
结论
明白了这个概念就很好解释 '1' < '10' 是为什么了
首先他们并不是不同类型相比,并且不是 == 相比,大小于相比会把他们首字符转换成unicode码对比大小,
如果首字符对比unicode码相同将逐一对比。
扩展例子
- 第一个因为有一个
number所以转换成了number去对比 - 第二个都是
string并且 大小于对比 首字母转换unicode码对比。后面相当于''和unicode码的对比
另外 说个好玩的
这个 是因为 '选'的unicode 码大于 '努'的unicode 码
也证明程序中也是 每个所做的选择都很重要
一起努力一起进步,我是阿江!