2012-11-19 22 views
3

我注意到了CoffeeScript的編譯器,我一個無法解釋的行爲:)的Node.js - 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」時,效果很好。有沒有人對此有過解釋?

+0

http://stackoverflow.com/questions/9992620/coffeescript-existential-operator-and-this – 2012-11-20 00:09:26

+0

thx爲鏈接 – JimBob

回答

3

tldr;typeof x !== "undefined"不需要本地 JavaScript變量。

SO問題CoffeeScript Existential Operator and this有關於的信息爲什麼 CoffeeScript將進行此優化。

現在,看看爲什麼它是一個有效代碼生成所呈現的情況下:

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

因此,根據邏輯表,它們是語義等價。這是==運營商的「非嚴格」性質,它決定了這種比較的結果 - 也許是令人驚訝的結果:關於該主題的SO問題比比皆是。

然而,這裏是當/爲什麼typeof x !== "undefined"有時使用的重要區別:它會不會結果ReferenceError。如果x被稱爲局部變量那麼就沒有這樣的考慮,並且可以安全地使用較短的(!=)JavaScript表達式。

在這種情況下,當在CoffeeScript的分配被註釋掉了,有沒有當地變量/名稱爲reality_id結合 - 注意,var說法也不同 - CoffeeScript中插入額外的保護適當的。