【发布时间】:2011-12-10 18:13:33
【问题描述】:
我在这段 JavaScript 代码上运行了 JSLint,它说:
第 32 行字符 30 处的问题:缺少基数参数。
这是有问题的代码:
imageIndex = parseInt(id.substring(id.length - 1))-1;
这里有什么问题?
【问题讨论】:
标签: javascript jslint radix
我在这段 JavaScript 代码上运行了 JSLint,它说:
第 32 行字符 30 处的问题:缺少基数参数。
这是有问题的代码:
imageIndex = parseInt(id.substring(id.length - 1))-1;
这里有什么问题?
【问题讨论】:
标签: javascript jslint radix
我没有正确回答这个问题,但我认为明确为什么我们应该指定基数是有意义的。
在 MDN 文档中我们可以读到:
如果 radix 未定义或为 0(或不存在),JavaScript 假定 以下:
- [...]
- 如果输入字符串以“0”开头,则基数为 8(八进制)或 10(十进制)。确切选择哪个基数取决于实现。 ECMAScript 5 指定使用 10(十进制),但并非所有浏览器都支持这一点。出于这个原因,总是指定一个基数 使用 parseInt 时。
- [...]
【讨论】:
在 ECMAScript 5 之前,parseInt() 还自动检测八进制文字,这会导致问题,因为许多开发人员认为前导 0 会被忽略。
所以不是:
var num = parseInt("071"); // 57
这样做:
var num = parseInt("071", 10); // 71
var num = parseInt("071", 8);
var num = parseFloat(someValue);
【讨论】:
只需在 .eslintrc 中添加您的自定义规则,如下所示
"radix": "off"
你将摆脱这个 eslint 不必要的警告。
这是给 eslint linter 的。
【讨论】:
你可以使用.slice()而不是调用substring函数
imageIndex = parseInt(id.slice(-1)) - 1;
这里,slice中的-1表示从最后一个索引开始slice。
谢谢。
【讨论】:
为避免此警告,请不要使用:
parseInt("999", 10);
您可以将其替换为:
Number("999");
请注意,parseInt 和 Number 有 different behaviors,但在某些情况下,一个可以替换另一个。
【讨论】:
parseInt 和Number 之间的性能差异也很大。这是old performance test。
Number() 比 parseInt() 快 6 倍
只需在基数处放一个空字符串,因为 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;
【讨论】:
你也可以简单地在你的 parseInt 行上方添加这一行:
// eslint-disable-next-line
这将禁用 eslint 检查下一行。如果您只需要跳过一两行,请使用此选项。
【讨论】:
我只使用 +foo 来转换字符串就解决了。
请记住,它不利于可读性(脏修复)。
console.log( +'1' )
// 1 (int)
【讨论】:
如果您想跳过该测试,可以关闭此规则。
插入:
radix: false
在tslint.json 文件的“rules”属性下。
如果你不理解这个异常,不建议这样做。
【讨论】:
使用 parseInt 传递基数总是一个好习惯 -
parseInt(string, radix)
对于十进制 -
parseInt(id.substring(id.length - 1), 10)
如果 radix 参数被省略,JavaScript 假设如下:
【讨论】:
Redundant radix parameter
radix 参数是一个数值,而不是数值的字符串表示形式,因此没有要指定的基数。
【讨论】:
"-W065": true,例如在.jshintrc 文件中。