予期しない以上のJavaScriptの可能な反復


83

私は次のコードを持っています:

  for (i in awards) {
         if (awards[i] instanceof Array === false) {
               console.log(awards[i]);
                httpFactory.patch(awards[i], {"read": true}, false);
             }
       }

私のIDEは、上記のコードに関連してこのエラーを表示します。

予期しない(カスタム/継承された)メンバーに対する反復の可能性、おそらくhasOwnPropertyチェックが欠落している

JavaScriptでフィルタリングされていないfor-inループのインスタンスをチェックします。この構成を使用すると、継承されたプロパティまたは予期しないプロパティが処理されます。hasOwnProperty()メソッドを使用して独自のプロパティをフィルタリングする必要があります。検証は、JavaScript、html、またはjspファイルで機能します。

この声明の意味を詳しく説明していただけますか?


2
jQueryのは実行されませんhasOwnPropertyチェックを-私が生じるであろうどのように多くの警告を不思議に思う....
オリオン座ゼータ星

回答:


145

IDEは、テストを追加することを推奨しています。

if (awards.hasOwnProperty(i)) {
    ...
}

内側のforループ。

個人的にはこれを行わず、可能であれば警告を無効にすることをお勧めします。ほとんどのコードでは必要がなく、ES5コードでは、を使用して列挙できないプロパティをオブジェクトに安全に追加できます。Object.defineProperty

このhasOwnPropertyチェックは、新しい(列挙可能な)プロパティを安全に追加していない場合にのみ必要なObject.prototypeので、最も簡単な修正はそれを行わないことです

jQueryはこのテストを実行しません。安全でない方法で変更するとjQueryが機能しなくなることを明示的に文書化していObject.prototypeます。


40
IntelliJ 15で警告を無効にするには、次の手順を実行します。[設定]-> [エディター]-> [コードスタイル]-> [検査]を開きます。検索ボックスに「hasOwnProperty」と入力します。「Unfilteredfor..inloop」と表示されます。そのボックスのチェックを外します。[OK]ボタンをクリックして変更を受け入れ、ウィンドウを閉じます。
Machtyn 2016年

2
IntelliJの場合:CTRL ALT S(独自のCTRL ALT Sショートカットを持つUbuntuを使用している場合を除く)は、「hasOwnProperty」を検索するだけで、問題に直接アクセスできます。チェックを外すと完了です。
Olivier Pons

1
WebStormで、[ファイル...設定]、[エディター]-> [検査]-> [JavaScriptとTypeScript]-> [一般]の順に移動し、[フィルターされていないfor..inループ]のチェックを外します。
強大な

21

javascriptのすべてのオブジェクトには、独自のプロパティ(ネイティブ/継承されたメソッド/プロパティ)とオブジェクト自体に直接アタッチされたプロパティを持つプロトタイプがあります。

オブジェクトを反復処理すると、オブジェクト自体のプロパティとオブジェクトのプロトタイプのプロパティが反復処理されます。

したがって、プロトタイプの反復を回避するために、オブジェクトが指定されたプロパティを直接持っている場合にのみtrueを返すhasOwnPropertyメソッドを使用することをお勧めします。つまり、プロトタイプの内部ではありません

for (var k in object) {
  if (object.hasOwnProperty(k)) {
     // do your computation here.
  }
}

詳細については、こちらをご覧ください


13

ループを次のようにリファクタリングすることもできます。

const keys = Object.keys(object);
for (const key of keys){
   // do something with object[key];
}

3

また、forEachループを記述して警告を取り除き、より読みやすく機能的なアプローチをとることができます。

Object.keys(object).forEach(key => {
    // Do something with object[key]
});

-2

このループの最初にもう1つの条件を追加する必要があります

if (awards.hasOwnProperty(i)) 

13
私はこの回答に反対票を投じたので、理由を言えば礼儀正しいと思います。この回答は、警告を回避する方法を示していますが、警告の意味、警告を回避する方法、またはこのコードの機能については説明していません。
WoodenKitty 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.