たとえば、Watと私の Chrome ブラウザーの両方で:
{} + {}
はNaN
しかし、Node REPL では、
[object Object][object Object]
確かに、後者の方が私には理にかなっています。文字列を強制してから行動することは、かなり合理的なことです。ただし、この不一致がどこから来るのかわからないため、単純な JS の動作を理解するために REPL をどれだけ信頼できるかわかりません。
たとえば、Watと私の Chrome ブラウザーの両方で:
{} + {}
はNaN
しかし、Node REPL では、
[object Object][object Object]
確かに、後者の方が私には理にかなっています。文字列を強制してから行動することは、かなり合理的なことです。ただし、この不一致がどこから来るのかわからないため、単純な JS の動作を理解するために REPL をどれだけ信頼できるかわかりません。
{}
式 (空のオブジェクト リテラル) とステートメント (空のブロック) の両方です。
eval()
入力をステートメントとして解析しようとします。
「通常の」ステートメント (たとえば、if
) でない場合は、式を評価する式ステートメントとして解析されます。
したがって、{} + {}
は (ASI を介して) 2 つのステートメントとして解析されます{}; +{}
。最初のステートメントは空のブロックです。2 番目のステートメントは、オブジェクトを数値に強制する単項演算子です。
オブジェクトを数値に強制するには、(これは を返します) を呼び出してから、結果を数値として解析します (そうではありません)。それを最終ステートメントの値として返します。+
toString()
"[object Object]"
eval()
Nodeは REPL 入力をラップし()
て、式として解析されるように強制します。
// First we attempt to eval as expression with parens.
// This catches '{a : 1}' properly.
self.eval('(' + evalCmd + ')',