例如,在這兩個Wat,在我的Chrome瀏覽器:爲什麼Node REPL不能提供與Wat視頻或我的瀏覽器控制檯相同的結果?
{} + {}
是NaN
但在節點REPL,這是
[object Object][object Object]
後者固然使我更有意義 - 脅迫串起來然後演戲是很合理的事情。但是我不明白這種差異是從哪裏來的,因此我不明白我有多少信任REPL來理解一些簡單的JS行爲。
例如,在這兩個Wat,在我的Chrome瀏覽器:爲什麼Node REPL不能提供與Wat視頻或我的瀏覽器控制檯相同的結果?
{} + {}
是NaN
但在節點REPL,這是
[object Object][object Object]
後者固然使我更有意義 - 脅迫串起來然後演戲是很合理的事情。但是我不明白這種差異是從哪裏來的,因此我不明白我有多少信任REPL來理解一些簡單的JS行爲。
{}
既是一個表達式(一個空對象文字)和一個語句(一個空白塊)。
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 + ')',
和那我想我實際上理解了wat vidoe中的所有JS。謝謝。 – djechlin
可能重複?爲什麼不在Node.js中?](http://stackoverflow.com/questions/17268468/why-is-nan-only-on-the-client-side-why-not-in-node-js) – SLaks