1

私は、CoffeeScript の範囲内包表記がコンパイルされるわずかに異なる JavaScript について疑問に思っていました。生成された JavaScript の違いに従う理由はありますか?

範囲を整数ステップで反復する

numbers = (i for i in [start..end] by 2)

次のようにコンパイルされます。

for (i = start; i <= end; i += 2) {
  _results.push(i);
}

しかし、小数ステップで反復する場合

numbers = (i for i in [start..end] by 1/2)

もう少し複雑な JavaScript を生成します。

for (i = start, _ref = 1 / 2; start <= end ? i <= end : i >= end; i += _ref) {
  _results.push(i);
}

では、なぜこの追加start <= end条件が必要なのでしょうか?

4

3 に答える 3

1

Coffeescriptは、式1/2が何を評価するかを完全には知りません。それはMath.random()-.5である可能性があり、スクリプトの特定の実行に依存します。

したがって、Coffeescriptがステップが負であるか正であるかを知ることは不可能であるため、一定のステップの符号ではなく、開始と終了の相対的な位置に基づいて条件をキーイングするだけです。

于 2012-04-12T20:01:04.353 に答える
1

これは、整数対小数ではなく、定数対式です。ステップが定数 ( など2) の場合、CoffeeScriptstepはコンパイル時に が正かどうかを認識し、正しいコードを出力します。ステップが式 ( など1/2) の場合、実行時に正かどうかを判断する必要があります。

残念ながら、CoffeeScript は、小数をどのように記述されていても (0.5または1/2)、式として認識しているように見えるため、この問題を回避する簡単な方法はありません。

于 2012-04-13T04:49:03.057 に答える
1

を行うだけでも、同様に精巧なコードが得られますnumbers = (i for i in [start..end])。これは、開始または終了が変数である場合、CoffeeScript が範囲がどちらの方向に進むかを認識できないためです。コンパイラには特別な最適化があり、一定のステップが指定されている場合はより単純なコードが出力されますが、残念ながら 1/2 は定数ではなく式としてカウントされます。

于 2012-04-12T20:53:41.043 に答える