ChatGPT解决这个技术问题 Extra ChatGPT

JSLint 说“缺少基数参数”

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

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

这是有问题的代码:

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

这里有什么问题?


C
Community

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

parseInt(string, radix)

对于十进制 -

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

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

如果字符串以“0x”开头,则基数为 16(十六进制)

如果字符串以“0”开头,则基数为 8(八进制)。此功能已弃用

如果字符串以任何其他值开头,则基数为 10(十进制)

(Reference)


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

为了避免这个警告,而不是使用:

parseInt("999", 10);

您可以将其替换为:

Number("999");


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


parseIntNumber 之间也存在很大的性能差异。这是一个old performance test
Chrome 77:Number()parseInt() 快 6 倍
L
Liam

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

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

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

来源:MDN parseInt()


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

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

插入:

radix: false

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

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


我将使用它,因为代码在没有基数的情况下运行得很好
a
aleemb

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

/*jshint -W065 */

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


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

在 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


G
Goran_Ilic_Ilke

只需在看起来像 "radix": "off" 的 .eslintrc 中添加您的自定义规则,您就可以摆脱这个 eslint unnesesery 警告。这是为 eslint linter 准备的。


u
user2369834

我只使用 +foo 来转换字符串就解决了这个问题。

请记住,它不利于可读性(脏修复)。

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

R
Rohit Nethi

您也可以简单地将这一行添加到您的 parseInt 行的正上方:

// eslint-disable-next-line

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


A
Ahmed.Dz

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

parseInt(字符串,基数);

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

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

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


D
Daniel Selvan

您可以使用 .slice() 而不是调用 substring 函数

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

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

谢谢。