これは私の答えです。ここには新しいものはありません。私は文法のためのECMAScript仕様(のかなりのコピー)にリンクしているだけで、なぜそれがそうするかを解析する理由を示すためのいくつかのプロダクションを示しています。いずれの場合においても、行動には、JavaScript/ECMAScriptの文法規則に従って、明確に定義されている:{}
は、それがである「コンテキスト」に応じて異なって解析され
のJavaScript REPL S(「コンソール」)スタート。文法生成または "文脈文脈"のStatement
のコードを解析する。 (これは実際にはうそだ、それはProgram
またはSourceElements
のプロダクションから始まりますが、それを掘り下げるための追加の構造が追加されています)。ここでは、簡略化と省略を伴う概略文法の分解です。より多くのために上記のリンクを参照してください。
Statement
Block
...
ExpressionStatement
Block
# This is actually { StatementList[optional] }, but this is what
# it amounts to: * means "0 or more".
{ Statement* }
ExpressionStatement
# An ExpressionStatement can't start with "{" or "function" as
# "{" starts a Block and "function" starts a FunctionStatement.
[lookahead ∉ {{, function}]Expression ;
Expression
# This is really PrimaryExpression; I skipped a few steps.
...
(Expression)
したがって(とき "文の文脈" で):
{}
-> Block # with no StatementList (or "0 statements")
-> Statement
そして:
({})
-> (Expression)
-> Expression
-> ExpressionStatement # omitted in productions below
-> Statement
undefined === {}
がEXPR === EXPR -> EXPR -> STMT
、結果として解析する理由も説明して評価されるとfalseになります。この場合の{}
は、「表現コンテキスト」内にあります。
{} === undefined
の場合、構文エラーである{}; === undefined
またはBLOCK; BOGUS -> STMT; BOGUS
として解析されます。ただし、かっこを追加すると、({} === undefined)
は(EXPR === EXPR) -> (EXPR) -> EXPR -> STMT
として解析されます。それは愚かであっても有効な構文であり、それは{}; + "hi"
、又はBLOCK; + EXPR -> STMT; EXPR -> STMT; STMT
として解析され{} + "hi"
の場合、
(+
この場合に単項です)。同様に、上記と同様に"hi" + {}
は{}
を「式のコンテキスト」に置き、EXPR + EXPR -> EXPR -> STMT
として解析されます。
JavaScriptコンソールは、空の{}
ブロックの「未定義」(実際には「何もありませんが、存在しません」)である最後のステートメントの結果を表示しています。 (これはブラウザ/環境によって異なりますが、最後のExpressionStatementなど、この場合に返される内容は異なる場合があります)
ハッピーコーディング。
... f {UNDEFINED}とは何ですか?本当にそれは適切ではありません。あなたは言い換えることができますか? –
コンソールは、必ずしも通常のJSに明示的にマッピングされているわけではありません。私は、これがchromeかFFコンソールかどうかは覚えていませんが、 '$(id)'と入力すると 'document 'と評価されることが分かります。getElementById(id) '(これは例えばjQueryで壊れます)。 – Alxandr