2016-03-09 4 views
5

TypeScriptを使用している新しいプロジェクトで作業を開始しました。私は、TypeScriptで動作する別のプロジェクトから来ています。 TypeScriptのネイティブfor forループは利用可能なので、(古いプロジェクトチーム)はこれを使用することにしました。私のためにEspacialyは、Javaのバックグラウンドに関連してforループを書く方がはるかに便利でした。TypeScriptの_forforeach()以上のネイティブfor forループを使用する必要があります

新しいプロジェクトでは、どこでも_.foreach()ループを使用して配列を繰り返し処理します。私は疑問に思って何

のためのネイティブtypescriptですとの性能差と_.foreachは(あり)

私は、彼らは多かれ少なかれ、まったく同じ速さであることを縫い目jsperfで少しテストを作成しましたJavaScriptの

012で

for (let num: string of list){ 
    console.log(num); 
} 

のために...

https://jsperf.com/foreach-vs-forof/12

活字体

var list = "9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9".split(); 

//Transpiled TypeScript for of  | **19,937 ±5.04% 
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 
    var num = list_1[_i]; 
    console.log("" + num); 
} 

//lodash       | 20,520 ±1.22% 
_.forEach(list, function(item) { 
    console.log("" + item) 
}); 

Imho私はTypeScriptの「ネイティブ」が好きです。

あなたは何をお勧めしますか? _.forEachのために使うべき他のポイントはありますか?

答えて

2

私はlodashにコメントできません、私はそれを使用していません。しかし、以下のような背景があります。

'for of'は、TypeScript 1.5で各要素の周りをループするために導入されました。配列リストJS出力(ECMA Script 5または6をターゲットにしているかどうかによって異なります)を調べると、ECMASCript5の場合、以下の両方の出力が同じになることがわかります。 See this article for associated background readingと、どのようにES6/2015をターゲットにして出力に影響を与えるかを示します。

ForEachのTypescript実装に関しては、これに関するGitHub hereに関する興味深い議論があります。特に、ループの条件付きブレークアウトの周り。あなたのテストに基づいて

for (let line of v.lineEntry) { 

} 

for (var _i = 0, list_1 = list; _i < list_1.length; _i++) { 

} 
2

私はネイティブArray.prototype.forEachを使用して、別のものを追加しました:

list.forEach(function(item) { 
    console.log("" + item) 
}); 

これは、実際に入力する方がはるかに簡単ですので、私の好ましい方法をInfactはあります。また、配列を使ってやりたいことが他のものに近い。 map/filterなど

http://jsperf.com/foreach-vs-forof/9 3つすべては、妥当なパフォーマンスの違いはありません。

2

私は私の読書を超えてtypescriptの経験はありませんが、私はES6/ES2015でかなりの経験があります。 for ofはまだ完成したES2015仕様の一部です。私はのthis記事をMDNから読んでいます。ここで

は、いくつかの類似点と相違点for offorEachの(そしてこれらはちょうど私の知る限りが見つかり、現在の知っているようです)、次のとおりです。

  • forEachアレイ、オブジェクトされているコレクションに取り組んでいますlodashに、または 文字列。

  • ネイティブforEachは、配列、マップ、およびセットで機能します。すべてのIterables

  • for of作品:配列、文字列、TypedArrays、 マップ、セット、DOMのコレクション、および発電機。

私はExploring ES6からfor ofにこの章を読んで(ES6を探ることは偉大な読み取りである。それは非常に徹底したのです。それは、同様に無料のオンラインです。)でしょう異なるように私に目立つことから、いくつかのことについてfor of上がらないことforEachにあります。

ブレークと

breakcontinueforEachで公開されていないため-のループの内側に仕事を続けます。 forEachのcontinueに最も近いものはreturnを使用していますが、これは実際にはほとんど同じことです。 breakについては、代替案は見当たりませんが(ただし、ロダッシュをディスカウントしません。なぜなら、単一のアイテムを見つけて返すような休憩を必要とするほとんどのものは、すでにロダッシュのライブラリの多くでカバーされているからです)。

提案したようにObject.entriesがES2017に到着した場合でも、オブジェクトの列挙可能なプロパティと値を容易にかつ正確に反復することさえできます。これを使用したい場合は、ポリフルールの1つでhereを使用します。それはどのようなものかの例です。

var obj = {foo: "bar", baz: "qux"}; 

for (let x of Object.entries(obj)) { // OK 
    console.log(x); // ["foo", "bar"], ["baz", "qux"] 
} 

およびhereの高速ポリフィル実装を記述しました。あなたは通常、配列の破壊を使用して、それ自身の変数にキーと値を分離します。機能の種類に

forEachvarデフォルトは、あなたは良いことですforまたはfor ofループにletからになるだろう。私が意味することは、その反復のための変数の中で起こっている非同期が、そのループの特定の部分だけにスコープされている場合です。 forEachのこのプロパティはletと実際には関係ありませんが、JavaScriptではスコープとクロージャを使用しています。 forEachfor of

あなただけ(例えば、あなたが設定またはジェネレータは、for ofを使用し、break秒を必要とするか、地図を使用する必要があります)現在のジョブに最適な1を決定する必要があります。それ以外にもコレクションのどちらかの理由が特に強いわけではないように、彼らは両方ともコア機能で動作します。また、forEachまたはfor ofのいずれかを使用できるコレクションを扱うときは、ほぼ同じ速度で同じことをする(そして、通訳者によればいつでも速度が変わる可能性がある)ので、主に個人的な好みになります。私はlodashの他のさまざまな機能の利点は、実際に地図を作成したり、減らしたり、フィルタリングしたり、見つけたりするのに多くの時間を節約できると感じています。あなたが最も快適に書くことを感じるので、for of私はあなたがそれをそのように書くことを続けることを勧めますが、一旦あなたは他の機能を使ってロダッシュで書くことを始めると、ロダッシュの方法でもっと快適に書くことができます。

編集:

はあなたのコードを見ている私はあなたのリストの作成でエラーに気づきました。最後に.split()があり、あなたは.split(",")だったはずです。あなたは、文字列全体の長さ1のリストを作成していました。その文字列の1回だけ繰り返すので、ベンチマークが似ていました。私はテストをします。 Hereです。私はまだそれが実行されるたびに変更されるように思われるパフォーマンスについては心配しません。

関連する問題