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]);
}
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つ目よりもコンパイラーの最適化の方が簡単です。
最近のほとんどのブラウザで利用できる最新バージョンの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エンジンのさらなる改善によってこの格差がどの程度最適化されるかを見るのは非常に興味深いでしょう。 :-)
ES2015(ES6)では、for-of
ループ。 IEを除くほとんどのブラウザでサポートされています。
let array = [10, 20, 30];
for (let value of array) {
console.log(value);
}
for(s in array)
を実行できますが、foreach
とは異なりますのでご注意ください。
この場合、s
はキー(インデックス)であり、値ではありません。 hasOwnProperty
はオブジェクトのin
もループするため、prototype
も使用する必要があります。
_for(s in array){
if(array.hasOwnProperty(s)){
console.log(array[s]);
}
}
_
編集:@Amadanが指摘したように、hasOwnProperty
doesプロパティが次のように追加されると反復されます: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);
});
_
新しいJavaScriptエンジンのArrayプロトタイプには「forEach」メソッドがあります。一部のライブラリでは、プロトタイプ自体を同様の方法で拡張しています。
これを試して、
var errorList = new Array();
errorList.Push("e1");
errorList.Push("e2");
for (var indx in errorList){
alert(errorList[indx]);
}
x = [1,2,3];
for (i in x) {
console.log(i);
}