4

たとえば、Watと私の Chrome ブラウザーの両方で:

{} + {}

NaN

しかし、Node REPL では、

[object Object][object Object]

確かに、後者の方が私には理にかなっています。文字列を強制してから行動することは、かなり合理的なことです。ただし、この不一致がどこから来るのかわからないため、単純な JS の動作を理解するために REPL をどれだけ信頼できるかわかりません。

4

1 に答える 1

4

{}式 (空のオブジェクト リテラル) とステートメント (空のブロック) の両方です。

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 + ')',
于 2013-07-03T18:33:36.747 に答える