7

私のコードには、文字列を反復処理し、文字ごとに操作を実行する必要がある場所がいくつかあります。私の node.js アプリケーションは、リクエストごとにこれを何十回も行う必要があり、多くの場合、文字列の長さはかなり長くなる可能性があります。

以下のような JavaScript を coffeescript に変換する唯一の方法は、文字列の長さに基づいて配列を作成することです。私が持っているこれの問題は、ハードウェア側で行うことが余分なことであり、余分なメモリを消費し、不要に見えることです (私のノードアプリケーションは 1 秒あたり最大数千の dgram を処理するため、この余分な作業がすべて加算されます)。

JavaScript の方法:

for(var i = 0; i < str.length; i++) { /* Do stuff with str here */ }

推奨されるCoffeeScriptの方法

for i in [0..str.length]
  # Do stuff here

繰り返しますが、従来の for ループがハードウェアの観点からそのステップを台無しにする必要がない場合に、配列オブジェクトの作成を強制するのはばかげていると思います。

私が見つけた唯一の回避策は、次のような while ループを使用することです。

i = 0
while i < str.length
  # Do stuff
  i++

それは機能しますが、単純な for ループを使用するだけの単純な JavaScript の方法よりもはるかに冗長です。

基本的な反復を実行するために余分な配列を生成することなく、CoffeeScript で for ループを使用する方法はありますか?

4

3 に答える 3

13

必要がなければ、実際には配列を作成しません。コンパイルされたJSを見てください。このCoffeeScript:

str = "hello"
for i in [0..(str.length-1)]
  alert(i)

次の JavaScript を生成します。

var i, str, _i, _ref;

str = "hello";

for (i = _i = 0, _ref = str.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
  alert(i);
}

実際には配列は作成されませんでした。

(未定義を避けるために .length から 1 を引きます)

于 2012-12-05T15:20:12.763 に答える
7

文字列自体を反復処理することもできます。

for ch, i in str
  # Do stuff here.
于 2012-12-05T16:01:10.200 に答える
2

JavaScript (したがって、CoffeeScript も) では、strings次のようにアクセスできますarrays

console.log("Hello world".length);       // returns "11"
console.log("Hello world"[6]);           // returns "o"
console.log("Hello world".indexOf("w")); // returns "6"

これらのループのいずれかで配列を初期化しているとは思いません。

ただし、問題が解決する場合は、CoffeeScript ファイルでプレーンな JavaScript を使用できるはずです。

于 2012-12-05T15:17:24.933 に答える