Javascript (ECMAscript) は、Array.prototype.forEach
バージョン 1.6 (ECMAscript エディション 3、2005) 以降のメソッドをサポートしています。そのため、かなり多くのブラウザがすでにそのメソッドをサポートしており$.each()
、たとえば jQuery のメソッドと比較して信じられないほど高速です。
(実際には、どの Javascript ライブラリーに関係なく、すべての実装に勝っています)
jQuery と比較すると、約 60 ~ 70% 高速です。JSPerfのforEach と jQueryで試してみてください。
これまで使用してきた唯一の欠点は、イテレーションを早期に中断する方法がわからないことです。for
, while
and do-while
have aステートメントと同様にbreak
、jQuerysはループを中断する.each()
をサポートしてreturn false
います。
ECMAScript Edition 5 の仕様(私が見つけた最新のもの)を調べましたが、そのループからの早期のブレークについては言及されていません。
では、質問ですが、ダグラス・クロックフォード氏はこれを と呼びdesign error
ますか?
私は何かを見逃していますか?そのようなループを早期に中断することは可能ですか?
編集
これまでの回答に感謝します。誰も「ネイティブ」ソリューションを思い付いていないので、そのための実装は実際にはありません(おそらく機能ですか?)。とにかく、私は提案された方法があまり好きではないので、少しだまされて、最終的に私が好きな方法を見つけました(少なくとも、より良い)。次のように見えます:
var div = document.createElement('div'),
divStyle = div.style,
support = jQuery.support,
arr = ['MozTransform', 'WebkitTransform', 'OTransform'];
arr.slice(0).forEach(function(v,i,a){
if(divStyle[v] === ''){
support.transform = v;
a.length = 0;
}
});
これは「実際の」製品コードです。私は css3 変換プロパティを検索する良い方法を探していましたが、ecma5 仕様と奇妙な Javascript フォーラムで迷子になりました :-)
したがって、配列オブジェクト自体を 3 番目のパラメーターとして.forEach
コールバックに渡すことができます。探しているものが見つかったらすぐに、元の配列からコピーを作成し、slice(0)
そのプロパティを呼び出して 0 に設定します。.length
非常にうまく機能します。
誰かがより良い解決策を思いついたら、もちろんこれを編集します。