ESLint の "no-self-assign" ルールとは?


ESLint の "no-self-assign" ルールとは?

このルールは、以下のパターンを問題として検出します。

// 変数への自己代入
var foo = foo;

// プロパティへの自己代入
var obj = {
  bar: obj
};

このような自己代入は、論理的に意味がなく、コードを冗長で読みづらくする可能性があります。また、バグの原因となる可能性もあります。

no-self-assign ルールのオプション

このルールには、以下のオプションがあります。

  • props: プロパティへの自己代入を検出するかどうかを指定します。デフォルトは true です。
  • コードをより簡潔で読みやすくする
  • バグの可能性を減らす
  • コードの意図を明確にする

以下の場合は、自己代入が許可されます。

  • コードが意図的に自己代入を行っている場合
  • コードが古いブラウザとの互換性を維持するために自己代入を行っている場合

以下のコードは、no-self-assign ルールによって違反とみなされます。

// 変数への自己代入
var foo = foo;

// プロパティへの自己代入
var obj = {
  bar: obj
};

このコードを修正するには、以下のいずれかの方法で行うことができます。

  • 自己代入を削除する
  • コードが意図的に自己代入を行っていることを示すコメントを追加する
  • no-self-assign ルールは、コーディングスタイルに関するルールです。必ずしもすべてのコードでこのルールに従う必要はありません。
  • no-self-assign ルールは、他の ESLint ルールと組み合わせて使用することができます。


問題となるコード

// 変数への自己代入
var foo = 10;
foo = foo;

// プロパティへの自己代入
var obj = {
  prop: 'value'
};
obj.prop = obj.prop;

修正後コード

// 変数への自己代入の削除
var foo = 10;

// プロパティへの自己代入の削除
var obj = {
  prop: 'value'
};
// 関数内で変数への自己代入
function example() {
  var bar = 20;
  bar = bar;
}

// forループ内で変数への自己代入
for (var i = 0; i < 10; i++) {
  i = i;
}

// 条件分岐内で変数への自己代入
if (true) {
  var baz = 30;
  baz = baz;
}

これらのコードを修正するには、上記の修正コードと同様に、自己代入を削除するか、コメントを追加する必要があります。

  • 上記のコード例はほんの一例です。no-self-assign ルールは、さまざまな種類の自己代入を検出します。
  • no-self-assign ルールは、オプションでプロパティへの自己代入も検出するように設定できます。


ルールを無効にする

最も簡単な方法は、no-self-assign ルールを無効にすることです。ただし、この方法を選択すると、上記の利点を享受できなくなります。

/* eslint no-self-assign: "off" */

var foo = foo; // このコードは ESLint によって違反と報告されなくなります

例外を設定する

no-self-assign ルールには、以下のオプションがあります。

このオプションを使用して、特定の状況でのみ自己代入を許可することができます。

/* eslint no-self-assign: ["error", { props: false }] */

var foo = foo; // このコードは ESLint によって違反と報告されなくなります
var obj = { prop: obj }; // このコードは ESLint によって違反と報告されます

コードを書き換える

no-self-assign ルールに違反しているコードを書き換えることもできます。書き換えには、以下の方法があります。

代替方法の選び方

  • コードの簡潔性と可読性
  • バグの可能性
  • コードの意図
  • チームのコーディング規約