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

Mik*_*ind 498 javascript jslint radix

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

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

这是有问题的代码:

imageIndex = parseInt(id.substring(id.length - 1))-1;
Run Code Online (Sandbox Code Playgroud)

这有什么不对?

Jay*_*dra 909

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

parseInt(string, radix)
Run Code Online (Sandbox Code Playgroud)

小数 -

parseInt(id.substring(id.length - 1), 10)
Run Code Online (Sandbox Code Playgroud)

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

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

(参考)

  • 这是不合理的......通过这种逻辑,应该有第三个参数来表示基数参数本身的基数 (71认同)
  • 从它的声音,默认IS 10.如果它不是以0x或0开头,它默认为10的基数.但最好的做法是指定一个基数,即使它是默认值,有点像为array.map函数指定"this"的定义. (7认同)
  • 添加10作为基数以获得另一个lint错误...`冗余基数参数` (7认同)
  • 同意其他评论者.为什么在默认值为10时提供基数值是好的?这违反了共同的惯例. (4认同)
  • @Nishant:`radix`参数是一个数值,而不是数值的字符串表示,因此没有要指定的基数. (2认同)
  • 作为函数参数的“radix”默认值是有条件的,而不是“10”。这些条件的默认值是“10”,但这不是同一回事。`parseInt('0xA') !== parseInt('0xA', 10)` ...这是意想不到的。 (2认同)

Zan*_*non 54

要避免此警告,请使用:

parseInt("999", 10);
Run Code Online (Sandbox Code Playgroud)

您可以将其替换为:

Number("999");
Run Code Online (Sandbox Code Playgroud)


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

  • Chrome 77:“Number()”比“parseInt()”快 6 倍 (8认同)
  • parseInt和Number之间也存在很大的性能差异。这是[旧的性能测试](https://jsperf.com/number-vs-parseint-vs-plus/3)。 (4认同)

nmo*_*ira 40

我没有正确回答这个问题,但我认为有必要明确我们为什么要指定基数.

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

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

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

来源:MDN parseInt()

  • @Spock始终指定此参数以消除读者混淆并保证可预测的行为.当未指定基数时,不同的实现会产生不同的结果,通常将值默认为10. [参考](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt) (4认同)
  • 是的,但是 Typescript 编译器会插入它,所以你为什么要麻烦呢? (3认同)
  • @Spock因为TSLint抱怨它不存在.在兔子洞下面我们去...... (2认同)

Spo*_*ck 23

如果您希望跳过该测试,可以关闭此规则.

插入:

radix: false
Run Code Online (Sandbox Code Playgroud)

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

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


小智 22

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

所以而不是:

var num = parseInt("071");      // 57
Run Code Online (Sandbox Code Playgroud)

做这个:

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

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

var num = parseFloat(someValue); 
Run Code Online (Sandbox Code Playgroud)

参考


ale*_*emb 21

在JS文件上添加以下内容将告诉JSHint压制基数警告:

/*jshint -W065 */
Run Code Online (Sandbox Code Playgroud)

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

  • -1请不要这样做,只需添加要解析的基数即可 (29认同)
  • 你可以使用`"-W065":true`,例如在`.jshintrc`文件中. (5认同)
  • 在现代JS中,IMO添加基数实际上使得更不清楚函数在做什么.如果您不知道函数签名,它可能会出现默认情况.你必须指定一个基数是没有意义的. (3认同)
  • 这对应的jshint选项是什么?我正在使用SublimeLint在我的编辑器中运行jshint,并且它只需要一个选项的哈希:值对的设置,所以我认为我不能应用你的"-W065"建议. (2认同)

Gor*_*lke 6

只需在 .eslintrc 中添加您的自定义规则(如下所示) "radix": "off" ,您就可以摆脱此 eslint unnesesery 警告。这是针对 eslint linter 的。