1

jQuery の for ループの使用は非常に遅いため、通常の for ステートメントをより頻繁に使用することを検討しています。現在の要素に直接アクセスするために、次の構文を見つけました (もちろん、オブジェクトではなく、通常の配列の場合)。

for (var i = 0, e; e = array[i]; i++) { ... }

eループ内の場所は、現在の要素を表します。

この構文はすべてのブラウザーで安全に使用できますか?


添加

わかりました、これはうまくいくと思いますが、短い表記法ではあまり役に立ちません:

for (var i = 0, e; (e = array[i]) !== void(0); i++) { ... }

回答ありがとうございました!

4

3 に答える 3

1

naomikが指摘しているように、配列要素のいずれかに偽の値がある場合、その形式のループは壊れます。Falsey 値はfalsenullundefined""0およびNaNです。したがって、たとえば、null 以外のオブジェクト参照の配列に対して機能します。文字列や数値の配列ではそれほどではありません。

しかし、あなたの質問が構文に関するものであれば、はい、すべての JavaScript エンジンで機能する (そして偽の要素では失敗する) という点で「安全」です。あなたが依存している重要なビットは次のとおりです。

  1. 配列の末尾を超えた要素 (たとえば、 at ) にアクセスすると、例外がスローされるのではなくarray[array.length]、誤った値 ( ) が返されます。undefined

  2. 代入式 ( e = array[i]) の結果が、代入された値であること。

はい、どちらも信頼できます。(まあ、配列が実際に JavaScript 配列である場合、#1 は信頼できます。ホスト提供の配列のようなオブジェクトは異なる場合があります。)


いずれにせよ、どちらもループにのみ適用されないことに注意しieください。ES6 には がletありますが、 で宣言された変数は、varそれらが含まれる関数にスコープされます。

于 2013-10-01T14:15:09.407 に答える
1

私はそれをお勧めしません。たとえば、配列が次のようになっている場合は、次のようになります。

array = ["lala", 078, false, 992, "kas"];

e = array[i];次に、配列の 3 番目のエントリが文字通り false であるため、用語が false を返すため、ループは最初の 2 つだけを通過します。これの方が良い:

for (var i = 0, e; (e = array[i])===undefined; i++) { ... }

クロージャーなどを使用して、未定義の変数を上書きしないように注意してください

于 2013-10-01T14:15:20.883 に答える