JSLint 说“缺少基数参数”

IT技术 javascript jslint radix
2021-03-01 10:56:03

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

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

这是有问题的代码:

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

这里有什么问题?

6个回答

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

parseInt(string, radix)

对于十进制 -

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

如果省略 radix 参数,JavaScript 假定如下:

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

参考

@Nishant:radix参数是数值,而不是数值的字符串表示,因此没有要指定的基数。
2021-04-26 10:56:03
那太不合理了……按照这个逻辑,应该有第三个参数来表示基数参数本身的基数
2021-04-30 10:56:03
添加 10 作为基数以获得另一个 lint 错误... Redundant radix parameter
2021-05-03 10:56:03
从它的声音来看,默认值是 10。如果它不是以 0x 或 0 开头,则默认为 10 的基数。但即使是默认值,也最好指定基数,有点像将“this”的定义指定给一个 array.map 函数。
2021-05-07 10:56:03
同意其他评论者的意见。为什么在默认值为 10 时提供基数值更好?这违背了普遍的惯例。
2021-05-17 10:56:03

为避免此警告,请不要使用:

parseInt("999", 10);

您可以将其替换为:

Number("999");


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

parseInt之间也有很大的性能差异Number这是一个旧的性能测试
2021-04-22 10:56:03
Chrome 77:Number()比快 6 倍parseInt()
2021-04-30 10:56:03

我没有正确回答这个问题,但我认为明确为什么我们应该指定 radix是有道理

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

如果 radix 未定义或为 0(或不存在),JavaScript 会假设如下:

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

来源:MDN parseInt()

是的,但是 Typescript 编译器会插入它,所以你为什么要打扰呢?
2021-04-21 10:56:03
是的,真的......这就是为什么我只是禁用这个 lint 规则。仍然不明白为什么 OPTIONAL 参数会引发 lint 投诉.. 哦,好吧
2021-05-04 10:56:03
@Spock 始终指定此参数以消除读者混淆并保证可预测的行为。不指定基数时,不同的实现会产生不同的结果,通常默认值为 10。参考
2021-05-04 10:56:03
@Spock 因为 TSLint 抱怨它不存在。沿着兔子洞,我们走...
2021-05-14 10:56:03

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

插入:

radix: false

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

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

我将使用它,因为代码在没有基数的情况下运行得很好
2021-05-11 10:56:03

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

/*jshint -W065 */

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

您可以使用"-W065": true,例如在.jshintrc文件中。
2021-04-23 10:56:03
语言越强类型,编译器优化的机会就越多,这就是它抛出警告的原因。
2021-05-03 10:56:03
-1 请不要这样做,只需添加您要解析的基数
2021-05-08 10:56:03
这对应于哪个 jshint 选项?我正在使用 SublimeLint 在我的编辑器中运行 jshint,它只需要散列选项:它的设置值对,所以我认为我不能应用你的“-W065”建议。
2021-05-14 10:56:03
在现代 JS 中,IMO 添加基数实际上使函数在做什么变得更加不清楚。如果您不知道函数签名,那么您可能会期望默认值处于该位置。必须指定基数是没有意义的。
2021-05-18 10:56:03