不要直接使用数字字符串来比较大小
最近的项目中,后端给我返回来数字是字符串形式的,而根据实际业务需求,我需要进行比较大小。
而我当时考虑的是,js本身属于弱类型,动态语言
弱类型:
在编程语言中,语言被分为强类型和弱类型,我们将支持隐式转换的语言称为弱类型语言,不支持隐式转换的语言称为强类型语言,
而js本身开发出来之际由于各种机缘巧合,让他成为一个弱类型的语言。他有利有弊
动态语言:
在声明变量之前需要先定义变量类型。我们把这种在使用之前就需要确认其变量数据类型的称为静态语言。
相反地,我们把在运行过程中需要检查数据类型的语言称为动态语言。而JavaScript 就是动态语言,因为在声明变量之前并不需要确认其数据类型。
我当时想的就是,即使用数字字符串比较大小,js也会隐士转换成对应的数字,但是我确犯了错误。
我发现在相同长度时,比较后得到的结果是正确的的,但是当长度不一样时就有了问题,看下面得情况
'32' < '55' // true '1' < '2' // true '32' < '128' // false
按理说128是大于32的,但是确是false。这就很尴尬了
后来通过强大的网络发现了这么一个大秘密:
1、纯字符串比较,转换成ASCII码在进行比较;
2、纯数字和纯数字字符串相比较,则将字符串数字隐式转换成数字再进行比较;
3、纯数字和非纯数字字符串比较,都返回false;
当使用纯字符串比较时,js会把它转换成ASCII码比较,而不是转成数字,只有使用纯数字和非纯数字的时候才会隐式转换成数字,心里面万马奔腾
同时需要注意
1.数字和字符串比较大小,js会优先将字符串转成数字来比较(如果将数字转成字符串,那么还要将字符串转成字符编码才能比较,但是将字符串转成数字就可以直接比较了)
2.非纯数字字符串会被转成NaN,关于NaN:
a. NaN是数字类型,typeof NaN === ‘number’
b. NaN不等于任何数值,包括它本身,只能用isNaN()来判断
参考👏😬