首页 > 技术文章 > 不要直接使用数字字符串来比较大小

smallpen 2021-06-06 17:05 原文

最近的项目中,后端给我返回来数字是字符串形式的,而根据实际业务需求,我需要进行比较大小。

而我当时考虑的是,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()来判断

 

参考

推荐阅读