【问题标题】:JSLint says "missing radix parameter"JSLint 说“缺少基数参数”
【发布时间】:2011-12-10 18:13:33
【问题描述】:

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

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

这是有问题的代码:

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

这里有什么问题?

【问题讨论】:

    标签: javascript jslint radix


    【解决方案1】:

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

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

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

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

    来源:MDN parseInt()

    【讨论】:

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

    在 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

    【讨论】:

      【解决方案3】:

      只需在 .eslintrc 中添加您的自定义规则,如下所示 "radix": "off" 你将摆脱这个 eslint 不必要的警告。 这是给 eslint linter 的。

      【讨论】:

        【解决方案4】:

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

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

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

        谢谢。

        【讨论】:

          【解决方案5】:

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

          parseInt("999", 10);
          

          您可以将其替换为:

          Number("999");
          


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

          【讨论】:

          • parseIntNumber 之间的性能差异也很大。这是old performance test
          • Chrome 77:Number()parseInt() 快 6 倍
          【解决方案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;

          【讨论】:

            【解决方案7】:

            你也可以简单地在你的 parseInt 行上方添加这一行:

            // eslint-disable-next-line
            

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

            【讨论】:

              【解决方案8】:

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

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

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

              【讨论】:

                【解决方案9】:

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

                插入:

                radix: false
                

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

                如果你不理解这个异常,不建议这样做。

                【讨论】:

                • 我将使用它,因为代码在没有基数的情况下运行良好
                【解决方案10】:

                使用 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 参数是一个数值,而不是数值的字符串表示形式,因此没有要指定的基数。
                【解决方案11】:

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

                /*jshint -W065 */
                

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

                【讨论】:

                • 这对应什么jshint选项?我正在使用 SublimeLint 在我的编辑器中运行 jshint,它只需要一个选项哈希值:设置的值对,所以我认为我不能应用你的“-W065”建议。
                • 您可以使用"-W065": true,例如在.jshintrc 文件中。
                • -1 请不要这样做,只需在其中添加要解析的基数即可
                • 语言越强类型,编译器优化的机会就越多,这就是它抛出警告的原因。
                • 在现代 JS 中,IMO 添加基数实际上使函数在做什么变得更加不清楚。如果您不知道函数签名,它可能会处于默认位置。必须指定基数是没有意义的。
                猜你喜欢
                • 2012-03-27
                • 1970-01-01
                • 2013-09-07
                • 1970-01-01
                • 2013-07-14
                • 2018-09-23
                • 2012-04-26
                • 2012-10-18
                • 1970-01-01
                相关资源
                最近更新 更多