3

私にとっては、coffeescript コンパイラーの説明できない動作に気付きました :)

例えば:

getImage: (req, res) =>
    realty_id = req.query.id

    if (realty_id?)

結果

ImageController.prototype.getImage = function(req, res) {
    var realty_id,
        _this = this;
      realty_id = req.query.id;
      if ((realty_id != null)

しかし、実際には最後の行は次のようになります: if ((typeof realty_id !== "undefined" && realty_id !== null))

「realty_id = req.query.id」をコメントアウトするとうまくいきます。誰かがそれについて説明していますか?

4

1 に答える 1

3

tldr; ローカルJavaScript 変数typeof x !== "undefined"では必要ありません。

SO の質問CoffeeScript Existential Operatorには、 CoffeeScript がこの最適化を行う理由に関する情報があります。

次に、提示されたケースで有効なコード生成である理由を確認します。

-> x         x != null   typeof x !== "undefined" && x !== null
----------   ---------   -------------------------------------
ANY_TRUE     true        true
0            true        true
null         false       false
undefined    false       false

したがって、論理テーブルによると、それらは意味的に同等です。この比較の結果 (おそらく驚くべきこと) を決定するのは、演算子の「厳密ではない」性質です==。このトピックに関する質問はたくさんあります。

ただし、いつ/なぜtypeof x !== "undefined"使用されるの重要な違いは次のとおりReferenceErrorです。がローカル変数xであることがわかっている場合、そのような考慮事項はなく、短い ( ) JavaScript 式を安全に使用できます。!=

CoffeeScript での代入がコメント アウトされている場合、その名前のローカル変数/バインディングはありません。ステートメントも異なるreality_idことに注意してください。CoffeeScript は必要に応じて追加のガードを挿入します。var

于 2012-11-20T01:26:46.470 に答える