2013-07-03 22 views
3

例如,在這兩個Wat,在我的Chrome瀏覽器:爲什麼Node REPL不能提供與Wat視頻或我的瀏覽器控制檯相同的結果?

{} + {} 

NaN

但在節點REPL,這是

[object Object][object Object] 

後者固然使我更有意義 - 脅迫串起來然後演戲是很合理的事情。但是我不明白這種差異是從哪裏來的,因此我不明白我有多少信任REPL來理解一些簡單的JS行爲。

+0

可能重複?爲什麼不在Node.js中?](http://stackoverflow.com/questions/17268468/why-is-nan-only-on-the-client-side-why-not-in-node-js) – SLaks

回答

4

{}既是一個表達式(一個空對象文字)和一個語句(一個空白塊)。

eval()將嘗試解析其輸入作爲語句。
如果它不是一個「正常」語句(例如,if),它將被解析爲表達式語句,該語句將計算表達式。

因此,{} + {}被解析爲兩條語句(通過ASI):{}; +{}。第一個陳述是一個空白的塊;第二個語句是一元運算符+運算符將對象強制轉換爲數字。
將對象強制轉換爲數字涉及調用toString()(返回"[object Object]"),然後將結果解析爲數字(不是)。
eval()然後將其作爲最終語句的值返回。

節點wraps its REPL input(),迫使它被解析爲一個表達式:的[{爲什麼} + {}爲NaN僅在客戶端

// First we attempt to eval as expression with parens. 
    // This catches '{a : 1}' properly. 
    self.eval('(' + evalCmd + ')', 
+0

和那我想我實際上理解了wat vidoe中的所有JS。謝謝。 – djechlin

相關問題