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

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

这是问题中的代码:

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

这里出了什么问题?


当前回答

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

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

如果基数未定义或0(或不存在),JavaScript假设 后: […] 如果输入字符串以“0”开头,基数为8(八进制)或10(十进制)。具体选择哪个基数取决于实现。 ECMAScript 5指定使用10(十进制),但不是所有浏览器都支持这一点。因此,总是指定一个基数 当使用parseInt时。 […]

来源:MDN parseInt()

其他回答

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

/*jshint -W065 */

参见:http://jshint.com/docs/#options

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

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

如果基数未定义或0(或不存在),JavaScript假设 后: […] 如果输入字符串以“0”开头,基数为8(八进制)或10(十进制)。具体选择哪个基数取决于实现。 ECMAScript 5指定使用10(十进制),但不是所有浏览器都支持这一点。因此,总是指定一个基数 当使用parseInt时。 […]

来源:MDN parseInt()

你也可以简单地将这一行添加到你的parseInt行上面:

// eslint-disable-next-line

这将禁用下一行的eslint检查。如果你只需要跳过一两行就可以使用这个方法。

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

所以与其:

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

这样做:

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

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

var num = parseFloat(someValue); 

参考

你可以使用.slice()代替调用子字符串函数

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

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

谢谢。