JSLint说“缺少基数参数”


538

我在此JavaScript代码上运行了JSLint,它说:

第32行的字符30处的问题:基数参数丢失。

这是有问题的代码:

imageIndex = parseInt(id.substring(id.length - 1))-1;

怎么了

Answers:


967

用parseInt传递基数始终是一个好习惯-

parseInt(string, radix)

对于小数-

parseInt(id.substring(id.length - 1), 10)

如果省略了radix参数,则JavaScript假定以下内容:

  • 如果字符串以“ 0x”开头,则基数为16(十六进制)
  • 如果字符串以“ 0”开头,则基数为8(八进制)。不推荐使用此功能
  • 如果字符串以任何其他值开头,则基数为10(十进制)

参考


7
从它的声音来看,默认的IS是10。如果它不是以0x或0开头,则默认为10。但是最好的做法是指定一个基数,即使它是默认值也是如此。指定array.map函数的“ this”的定义。
molson504x 2015年

81
那太不合理了……按照这种逻辑,应该有第三个参数来代表基数参数本身的基数
Nishant

6
同意其他评论者。当默认值为10时,为什么提供基数值很好?这违背了常规。
理查德·克莱顿

9
加10作为基数会得到另一个皮棉错误...Redundant radix parameter
Shanimal

2
@Nishant:radix参数是数字值,而不是数字值的字符串表示形式,因此没有要指定的基数。
tokland

79

为避免此警告,请使用:

parseInt("999", 10);

您可以将其替换为:

Number("999");


请注意,parseInt和Number的行为不同,但是在某些情况下,一个可以替换另一个。


4
parseInt和之间的性能差异也很大Number。这是旧的性能测试
乔什·昂格

3
Chrome 77:Number()parseInt()
Zanon

1
这是干净的解决方案,效果很好。
thanos.a

43

我没有正确回答这个问题,但是,我认为有必要弄清楚为什么我们应该指定基数

在MDN文档中,我们可以阅读以下内容:

如果radix未定义或为0(或不存在),则JavaScript假定以下内容:

  • [...]
  • 如果输入字符串以“ 0”开头,则基数为8(八进制)或10(十进制)。选择哪个基数取决于实现。 ECMAScript 5指定使用10(十进制),但并非所有浏览器都支持。因此,在使用parseInt时始终指定一个基数。
  • [...]

资料来源:MDN parseInt()


1
是的,但是Typescript编译器会插入它,那么为什么要打扰呢?
Spock

2
@Spock,因为TSLint抱怨它不存在。然后沿着兔子洞走下去……
桑福德,2016年

是的,是的,这就是为什么我只禁用此皮棉规则。仍然不明白为什么OPTIONAL参数会触发皮棉投诉。.哦,很好
Spock

4
@Spock始终指定此参数,以消除读者的困惑并保证可预测的行为。当未指定基数时,不同的实现通常会产生不同的结果,通常将值默认为10。参考
Andrew Lam

27

如果您想跳过该测试,则可以关闭此规则。

插:

radix: false

在文件中的“ rules”属性下tslint.json

如果您不了解此异常,则不建议这样做。


1
我将不基数就好用这个,因为代码运行
威廉

22

在您的JS文件顶部添加以下内容将告诉JSHint禁止基数警告:

/*jshint -W065 */

也可以看看: http //jshint.com/docs/#options


2
这对应于什么jshint选项?我正在使用SublimeLint在我的编辑器中运行jshint,它只接受一个选项的哈希:用于设置的值对,因此我认为我不能应用您的“ -W065”建议。
Dihedral

5
您可以"-W065": true.jshintrc文件中使用。
alexfernandez

29
-1请不要这样做,只需添加要解析的基数
Juan Mendes 2014年

语言的类型越强,编译器优化的机会就越多,这就是它发出警告的原因。
HoldOffHunger

3
在现代JS中,IMO添加基数实际上使人不清楚函数的作用。如果您不知道函数签名,可以使用默认值。必须指定基数没有任何意义。
Charles Offenbacher

5

我仅使用+ foo解决了该问题,即可转换字符串。

请记住,它对可读性(脏污修复)不是很好。

console.log( +'1' )
// 1 (int)

3

您也可以直接在parseInt行上方添加以下行:

// eslint-disable-next-line

这将禁用eslint检查下一行。如果只需要跳过一两行,请使用此选项。


2

只需将一个空字符串放在基数位置,因为parseInt()带有两个参数:

parseInt(string,radix);

字符串要解析的值。如果string参数不是字符串,则将其转换为字符串(使用ToString抽象操作)。字符串参数中的前导空格将被忽略。

基数2到36之间的整数,表示上述字符串的基数(数学数字系统中的基数)。为人类常用的十进制系统指定10。始终指定此参数,以消除读者的困惑并保证可预测的行为。当未指定基数时,不同的实现产生不同的结果,通常将值默认为10。

imageIndex = parseInt(id.substring(id.length-1))-1;
imageIndex = parseInt(id.substring(id.length - 1), '')-1;


1

只需在.eslintrc中添加自定义规则,该规则看起来像这样 "radix": "off" ,您将摆脱此eslint不必要的警告。这是为eslint短绒棉。


1

在ECMAScript 5之前,parseInt()还自动检测八进制文字,这会引起问题,因为许多开发人员认为前导0将被忽略。

因此,而不是:

var num = parseInt("071");      // 57

做这个:

var num = parseInt("071", 10);  // 71

var num = parseInt("071", 8);

var num = parseFloat(someValue); 

参考


0

不用调用substring函数就可以使用.slice()

    imageIndex = parseInt(id.slice(-1)) - 1;

在这里,切片中的-1表示从最后一个索引开始切片。

谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.