ESLintのno-magic-numbersルール

ESLintのルールが教えてもらえないという制限下で作業をしていた。pushすると怒られるという緊張感はちょっと良かった。色々なルールで怒られたが、中でもno-magic-numbersにとりわけ怒られた。怒られたコードをメモしておく。

var d = new Date();
var m = d.getMonth() + 1;

月を数字で取得しようとすると怒られる。

var a = ["foo", "bar", "baz", "qux"];
var firstElement = a[0];
var lastElement = a[a.length - 1];

最初と最後の要素を参照しようとすると怒られる。Array#shift()Array#pop()で済むものは置き換えても良いが、若干コストがかかりそうだ。

var s = "foobarbazqux";

if (s.indexOf("foo") === 0) {
  ...
}

特定の文字列で始まるかどうか調べようとすると怒られる。これはちゃんとSring#startsWith()で書き換えた。

var s = "foobarbazqux";

if (s.startsWith(foo)) {
  s = s.substr(foo - 1);
}

特定の文字列で始まっていたら削除しようとすると怒られる。素直に正規表現を使うのが良いだろう。

var minimist = require("minimist");
var argv = minimist(process.argv.slice(2));

minimistで処理するためにNode.jsの実行ファイルとスクリプトのパスを捨てようとすると怒られる。えっ、これどうしよう……。


つまり配列へのテキトウなアクセスで怒られるということだ。配列の長さと添え字のずれを矯正する10が問題と言いかえることもできるだろう。代替手段はあるものはあるが、ないものはかなり苦しい対応になる。

{
  "rules": {
    "no-magic-numbers": [
      "error",
      {
        "ignores": [0, 1]
      }
    ]
  }
}

有効にするなら01を無視する、このような設定が良いかもしれない。


var d = new Date();
var m = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"][d.getMonth()];

月の数字はこうすると設定をカスタマイズせずとも通る。適切な処理だとは思うが、書きたいとはなかなか思わない。Dateオブジェクトが定数としてロケールに応じた月の名前や月の数字を持っていてくれればいいのかな。