JSLint说“缺少基数参数”;我该怎么办?

时间:2011-10-19 09:04:01

标签: javascript jslint radix

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

  

第32行问题30:缺少基数参数。

这是有问题的代码:

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

这里有什么问题?

11 个答案:

答案 0 :(得分:832)

使用parseInt传递radix总是一个好习惯 -

parseInt(string, radix)

对于小数 -

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

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

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

Reference

答案 1 :(得分:39)

我没有正确回答这个问题,但我认为清除为什么要指定基数是有意义的。

在MDN文档中,我们可以读到:

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

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

来源:MDN parseInt()

答案 2 :(得分:37)

要避免此警告,请使用:

parseInt("999", 10);

您可以通过以下方式替换它:

Number("999");


请注意,parseInt和Number有different behaviors,但在某些情况下,可以替换另一个。

答案 3 :(得分:23)

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

插入:

radix: false

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

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

答案 4 :(得分:21)

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

/*jshint -W065 */

另请参阅:http://jshint.com/docs/#options

答案 5 :(得分:4)

我只用+ foo解决了它,转换字符串。

请记住,它的可读性不好(脏修复)。

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

答案 6 :(得分:4)

您也可以在parseInt行的正上方添加此行:

// eslint-disable-next-line

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

答案 7 :(得分:2)

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

parseInt(string,radix);

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

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

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

答案 8 :(得分:0)

您可以使用substring

来代替调用.slice()函数
    imageIndex = parseInt(id.slice(-1)) - 1;

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

谢谢。

答案 9 :(得分:0)

只需在.eslintrc中添加自定义规则,如下所示 if(!preg_match("/%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu/",$website)){ $websiteerror="Invalid URL"; 并且您将摆脱此eslint unnesesery警告。 这是为了随便的lint。

答案 10 :(得分:0)

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

所以不是:

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

执行以下操作:

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

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

var num = parseFloat(someValue); 

Reference