web-dev-qa-db-ja.com

Javascriptには、Javaと同様のforループ構文が拡張されていますか?

JavaScriptに配列の反復処理を可能にするforループ構文が強化されているかどうか疑問に思っています。たとえば、Javaでは、次の操作を簡単に実行できます。

String[] array = "hello there my friend".split(" ");

for (String s : array){
    System.out.println(s);
}

出力は次のとおりです。

hello
there
my
friend

JavaScriptでこれを行う方法はありますか?または、以下のようにarray.lengthを使用し、標準のforループ構文を使用する必要がありますか?

var array = "hello there my friend".split(" ");

for (i=0;i<array.length;i++){
    document.write(array[i]);
}
25
ewok

JavaScriptにはforeachスタイルのループ(for (x in a))がありますが、Arrayで使用するのは非常に悪いコーディング方法です。基本的に、_array.length_アプローチが正しいです。使用できる新しいJavaScriptにはa.forEach(fn)メソッドもありますが、すべてのブラウザーでの存在が保証されているわけではなく、_array.length_の方法よりも低速です。

EDIT 2017:「実際、どうなるか見ていきます」現在、ほとんどのエンジンでは、関数がインラインである限り、.forEach()for(;;)と同じかそれより高速です。つまり、arr.forEach(function() { ... })は高速です、foo = function() { ... }; arr.forEach(foo) ではないかもしれません。 2つは同一であると考える人もいるかもしれませんが、1つ目は2つ目よりもコンパイラーの最適化の方が簡単です。

26
Amadan

最近のほとんどのブラウザで利用できる最新バージョンのJavaScriptを使用して、これを行うことができます。

array.forEach(function(x){
  document.write(x);
});

詳細は https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach にあります。ブラウザーがこれをサポートしていないのではないかと心配している場合は、「互換性」の下にリストされている実装の(うまくいけば縮小された)バージョンを使用して、自分で追加できます。

これは少し時代遅れですが、これはforEachの互換バージョンを縮小したもので、数年前にMozillaのページから派生しました。

if(!Array.prototype.forEach){Array.prototype.forEach=function(b){if(typeof b!="function"){throw new TypeError()}var a=this.length,d=arguments[1],c;for(c=0;c<a;c++){if(c in this){b.call(d,this[c],c,this)}}}};

私はこれで問題に遭遇したことはありませんが、Mozillaのページの実装は、ECMA-262、エディション5、15.4.4.18と互換性を持つように、いくつかの追加のチェックとコードで拡張されています。

httpsにリストされているように、これをインクルードするためにすべてのページに使用およびインクルードするcommon.jsというファイルと、JavaScript 1.6で導入された他のすべての「配列エキストラ」があります。 //developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras 。 (私はこれを更新して公開して公開するつもりでした。)

これは最速のアプローチではない可能性があります(詳細については http://jsperf.com/for-vs-foreach/15 を参照してください-リンクのおかげで、Amadan)-そこに簡潔さと保守性などについては言うべきものです。さらに、今後数か月と数年にわたってJavaScriptエンジンのさらなる改善によってこの格差がどの程度最適化されるかを見るのは非常に興味深いでしょう。 :-)

11
ziesemer

ES2015(ES6)では、for-ofループ。 IEを除くほとんどのブラウザでサポートされています。

let array = [10, 20, 30];

for (let value of array) {
  console.log(value);
}

こちらのMozillaの説明を参照

6
CaseyC

for(s in array)を実行できますが、foreachとは異なりますのでご注意ください。

この場合、sはキー(インデックス)であり、値ではありません。 hasOwnPropertyはオブジェクトのinもループするため、prototypeも使用する必要があります。

_for(s in array){
    if(array.hasOwnProperty(s)){
        console.log(array[s]);
    }
}
_

編集:@Amadanが指摘したように、hasOwnPropertydoesプロパティが次のように追加されると反復されます:array.test = function(){}。 _for...in_を使用するのはではないことをお勧めします。

EDIT2:最新のWebブラウザー(IE <9ではないもの)を使用している場合は、_Array.forEach_を使用できます)。 @ziesemerは、IE <9をサポートする必要がある場合、このために Mozillaにはシム があると指摘しています.

_array.forEach(function(s){
    console.log(s);
});
_

注:個人的には、JavaScriptプロジェクトに jQuery を使用し、 _$.each_ を使用しています。

_$.each(array, function(i,s){
    console.log(s);
});
_
3
Rocket Hazmat

新しいJavaScriptエンジンのArrayプロトタイプには「forEach」メソッドがあります。一部のライブラリでは、プロトタイプ自体を同様の方法で拡張しています。

2
Pointy

これを試して、

 var errorList = new Array();
       errorList.Push("e1");
       errorList.Push("e2");

       for (var indx in errorList){
               alert(errorList[indx]);
          }
1
shanika yrs
x = [1,2,3];
for (i in x) {
  console.log(i);
}
1
Chris Lohfink