JSLintは「基数パラメーターがありません」と言います


538

私はこのJavaScriptコードでJSLintを実行し、それは言った:

32行目30文字目の問題:基数パラメーターがありません。

これは問題のコードです:

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

ここで何が問題になっていますか?

回答:


967

parseIntで基数を渡すことは常に良い習慣です-

parseInt(string, radix)

10進数の場合-

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

radixパラメータが省略されている場合、JavaScriptは以下を想定します。

  • 文字列が「0x」で始まる場合、基数は16(16進数)です。
  • 文字列が「0」で始まる場合、基数は8(8進数)です。この機能は廃止されました
  • 文字列が他の値で始まる場合、基数は10(10進数)です。

参考


7
そのサウンドから、デフォルトは10です。それが0xまたは0で始まらない場合、デフォルトは10の基数になりますが、デフォルト値であっても、基数を指定することをお勧めします。 「this」の定義をarray.map関数に指定する。
molson504x

81
それはあまりにも不合理です...そのロジックによって、基数引数自体の基数を表す3つ目のパラメータが必要です
Nishant

6
他のコメント者に同意する。デフォルトが10のときに基数の値を指定するのが良いのはなぜですか?これは一般的な慣習に反しています。
Richard Clayton

9
基数として10を追加すると、別のlintエラーが発生します...Redundant radix parameter
Shanimal

2
@Nishant:radix引数は数値であり、数値の文字列表現ではないため、指定する基数はありません。
tokland 2018

79

この警告を回避するには、以下を使用する代わりに:

parseInt("999", 10);

次のように置き換えることができます:

Number("999");


parseIntとNumberの動作異なりますが、場合によっては一方を他方に置き換えることができます。


4
との間にもパフォーマンスの大きな違いがparseIntありNumberます。これは古いパフォーマンステストです。
Josh Unger

3
Chrome 77:Number()よりも6倍高速parseInt()
Zanon

1
これは問題なく機能するクリーンなソリューションです。
thanos.a

43

私は質問に適切に答えていませんが、基数を指定する必要がある理由を明確にすることは理にかなっていると思います

MDNのドキュメントでは、次のように読むことができます。

基数が未定義または0(または存在しない)の場合、JavaScriptは以下を想定します。

  • [...]
  • 入力文字列が「0」で始まる場合、基数は8(8進数)または10(10進数)です。どの基数を選択するかは、実装によって異なります。 ECMAScript 5は10(10進数)が使用されることを指定していますが、すべてのブラウザーがまだこれをサポートしているわけではありません。このため、parseIntを使用する場合は常に基数を指定してください。
  • [...]

ソース:MDN parseInt()


1
はい、しかしTypescriptコンパイラはそれを挿入します、それでなぜあなたは気にする必要がありますか?
Spock

2
@Spock TSLintはそこにないと不平を言うので。そして、ウサギの穴を下っていきます...
msanford

ええ本当..だから私はこの糸くずのルールを無効にするだけです。それでも、OPTIONALパラメーターが糸くずの原因になる理由がわかりません。まあ
Spock

4
@Spock読者の混乱を排除し、予測可能な動作を保証するために、常にこのパラメーターを指定します。基数が指定されていない場合、実装が異なると結果も異なります。通常、デフォルトは10です。参照
Andrew Lam

27

このテストをスキップする場合は、このルールをオフにすることができます。

インサート:

radix: false

ファイルの" rules"プロパティの下tslint.json

この例外を理解していない場合は、これを行うことはお勧めしません。


1
コードは基数なしで問題なく実行されるため、これを使用します
William

22

JSファイルの上に以下を追加すると、基数警告を抑制するようにJSHintに指示します。

/*jshint -W065 */

参照:http : //jshint.com/docs/#options


2
これはどのjshintオプションに対応しますか?私はエディタでjlimeを実行するためにSublimeLintを使用していますが、オプションのハッシュのみを受け取ります。設定の値のペアなので、「-W065」の提案を適用できないと思います。
Dihedral 2013

5
"-W065": trueたとえば、.jshintrcファイルで使用できます。
alexfernandez 2013

29
-1これを行わないでください。解析したい基数を追加してください
Juan Mendes

言語の型が強くなるほど、コンパイラーの最適化の機会が増えるため、警告がスローされます。
HoldOffHunger 2017

3
最近のJSでは、IMOが基数を追加すると、実際には関数が何を行っているかがより不明確になります。これは、関数のシグネチャがわからない場合にデフォルトで実行されると予想される位置にあります。基数を指定する必要があるのは意味がありません。
Charles Offenbacher

5

+ fooを使用して文字列を変換することで解決しました。

読みやすさを考慮したものではありません(ダーティフィックス)。

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

3

次の行をparseInt行のすぐ上に追加することもできます。

// eslint-disable-next-line

これにより、次の行のeslintチェックが無効になります。1行または2行をスキップするだけの場合に使用します。


2

parseInt()は2つの引数を取るため、空の文字列を基数の場所に置くだけです。

parseInt(文字列、基数);

string解析する値。文字列引数が文字列でない場合は、文字列に変換されます(ToString抽象演算を使用)。文字列引数の先頭の空白は無視されます。

基数上記の文字列の基数(数値システムにおける基数)を表す2〜36の整数。人間が一般的に使用する10進数のシステムには10を指定します。読者の混乱を避け、予測可能な動作を保証するために、常にこのパラメーターを指定してください。基数が指定されていない場合、実装が異なると結果も異なります。通常、デフォルト値は10です。

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


2

そのような.eslintrcにカスタムルールを追加するだけで "radix": "off" 、このeslint unnesesery警告がなくなります。これはeslintリンター用です。


1

ECMAScript 5より前のバージョンでは、parseInt()は8進リテラルも自動検出しました。これにより、多くの開発者が先頭の0は無視されると想定したため、問題が発生しました。

だから代わりに:

var num = parseInt("071");      // 57

これを行う:

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

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

var num = parseFloat(someValue); 

参照


0

substring使用できる関数を呼び出す代わりに.slice()

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

ここで、スライスの-1は、最後のインデックスからスライスを開始することを示します。

ありがとう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.