eslint 规则连接:https://eslint.org/docs/rules/radix
原文规则错误描述解读
在我们使用parseInt 的时候,应该设置第二个参数据,而不能不写使用默认。
思考
parseInt 第二个参数radix 是什么意思
语法:
parseInt(string, radix)
参数描述:
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 |
数字的基数是什么意思呢?
基数(cardinal number)在数学上,是集合论中刻画任意集合大小的一个概念。两个能够建立元素间一一对应的集合称为互相对等集合。例如3个人的集合和3匹马的集合可以建立一一对应,是两个对等的集合。
百度了下基数的概念,然后试验了一下,是不是所谓的进制。
因为radix该值介于 2 ~ 36 之间,所以我从2开始试验:
可以看出函数将字符串按照每一位进行划分,比如 ‘16’分为 1和6,如果每一位在基数范围内,则不是NAN否则,是NAN。
在看下数值怎么结算的呢?是不是按照基数的进制来的?
161
被分为 1
、6
、 1
6不在范围内,后面不计算最后得:
1 * 5^ 0 = 1
123
被分为 1
、2
、 3
都在范围内,计算最后得:
1 * 5^ 2 + 2 * 5^ 1 + 3 * 5^0 = 25 + 10+3 = 38
虽然还是不明白基数在集合中的全部定义,大概知道的意思是,前面被分解后的数,是不是在基数的集合里,如果第一个不再则返回NAN,如果第一个在,后面的哪个不在,在哪里停止。
最后计算按照基数进制计算。
parseInt 第二个参数radix 默认值是什么
那么parseInt默认值,是不是10呢?默认值是10,传入0 会以10处理。
查看v8 parseInt 源码可以看出:
if (radix == 0) { //如果传入radix是0,则以10进行处理
// Radix detection.
radix = 10;
if (*current == '0') {
++current;
if (current == end) return SignedZero(negative);
if (*current == 'x' || *current == 'X') {
radix = 16;
++current;
if (current == end) return JunkStringValue();
} else {
leading_zero = true;
}
}
} else if (radix == 16) { //16进制
if (*current == '0') {
// Allow "0x" prefix.
++current;
if (current == end) return SignedZero(negative);
if (*current == 'x' || *current == 'X') {
++current;
if (current == end) return JunkStringValue();
} else {
leading_zero = true;
}
}
}
if (radix < 2 || radix > 36) return JunkStringValue(); //radix不在2~36之间的处理
总结
parseInt用的时候比较简单,但是理解第二个参数还是有些抽象。不要以为然的写代码,一定弄清其中真相。