ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript で for ループを使用するときに注意すべき問題 - 問題の概要と javascript スキル

JavaScript で for ループを使用するときに注意すべき問題 - 問題の概要と javascript スキル

WBOY
WBOYオリジナル
2016-05-16 15:44:31970ブラウズ

同じコードを毎回異なる値で何度も実行する場合は、ループを使用すると便利です。

for ループを使用することが多く、for ループ部門は次のように記述します。

// 次佳的循环
for (var i = 0; i < myarray.length; i++) {
  // 使用myarray[i]做点什么
}

このようなコードには大きな問題はありませんが、ループするたびに配列の長さを取得するため、特に myarray が配列ではなく HTMLCollectionオブジェクトの場合。

以下のコードを見てください:

for (var i = 0, max = myarray.length; i < max; i++) {
  // 使用myarray[i]做点什么
}
このコードは配列の長さを 1 回だけ取得するため、コードの品質が向上します。

単一の var 形式を使用すると、次のようにループから変数を取り出すことができます:

function looper() {
  var i = 0,
    max,
    myarray = [];
  // ...
  for (i = 0, max = myarray.length; i < max; i++) {
   // 使用myarray[i]做点什么
  }
}

JavaScript が for ループを使用する場合の問題のまとめ

この問題の議論はもともと社内メールから来たもので、この問題の議論を記録しただけです。

問題を特定した際、一部のプロジェクト チームは、

“for(x in array)” を使用すると、IE ブラウザーに予期しない x の値が表示されることを発見しました。

具体的には、

Array.prototype.indexOf メソッドがカスタマイズされている場合 (たとえば、特定のプロトタイプ汚染が原因)、古いバージョンの IE ブラウザが array.indexOf をサポートしていないことが原因である可能性があります。メソッドと開発者はそれを使用したいのですが、そのようなブラウザでは次の問題が発生する可能性があります:

Array.prototype.indexOf = function(){...};
var arr = [1, 2];
for (x in arr) console.log(x);

// を出力します

1
2
function(){…}
つまり、

indexOf メソッドが出力されます。

解決策は簡単です。このメソッドを追加しないか、「

for (i=0; i などのループを使用します。

しかし、問題の本質は何でしょうか?

for(x in obj) の使用法は実際にはオブジェクトを走査するためであり、配列の実装は実際には を除いて通常のオブジェクトの実装と同じであるためではないかと推測する人もいます。 key は指定された値です:

{0:"something", 1:"something else"}

stackoverflow の質問と回答でも、配列を走査するときに for...in を使用する場合と for(;;) を使用する場合には違いがあると述べられています。前者はオブジェクトのプロパティを列挙することを意味します。問題:

列挙の順序は保証されません。

継承されたプロパティも列挙されます。


Array.prototype.forEach のサポートに関して、IE8 以下は正確にサポートできないことがこの表から明らかです。

forEachメソッドの互換性についても詳しく説明しています。実際、主要な JavaScript フレームワーク (jQuery、Underscore、Prototype など) にはすべて、for-each 機能の安全で一般的な実装があります。

JSLint の for in の章でも、for in ステートメントはオブジェクトの属性名をループできると述べていますが、プロトタイプ チェーンを通じて継承された属性もトラバースするため、多くの場合、予期しないエラーが発生します。 。大まかな解決策があります:

for (name in object)

 { if (object.hasOwnProperty(name))

 { .... } }

このループと同様の

for(var i=0;i を使用するときの問題についても言及している人もいました。JavaScript にはコード ブロック レベルの変数がないため、i へのアクセスはここでのアクセス許可は、実際にはアクセス許可が配置されているメソッドです。一部の本では、プログラマにそのような変数宣言を 1 か所に置くようアドバイスしていますが、直感的に言えば、ほとんどの場合、それは十分合理的ではありません。

JavaScript 1.7 で導入された "let" を使用すると、この問題が解決され、i が真のブロックレベル変数になります:

for(let i =0; i < a.length; i++)
最後に、Google の JavaScript スタイル ガイドにも次の制約が含まれています。

for-in loop:


Only for iterating over keys in an object/map/hash
上記は、JavaScript で for ループを使用する際に注意すべき問題に関するこの記事の全内容です。問題の概要も含めて、今後の作業や学習に役立つことを願っています。業界関係者からの提案。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。