JavaScript の構文がいかに悲惨であるかは誰もが知っています。
まず写真を撮りましょう
コードは次のとおりです:
このような厄介な構文の落とし穴は、おそらく JavaScript のような奇妙なものでのみ見られます。
JavaScript コンパイラを勉強していないほとんどの子供たちはまったく理解できないと思います。 (少なくとも私は信じられないほどだと思います)
その後、母の特別訪問に行って、はたと気づきました!
次に、このコードを見てみましょう:
ほとんどの子供用靴は、一見するとこれがオブジェクトの直接的な量であると考えると思います。
このコードはどうでしょうか?
ブラウザでは構文エラーが表示されますか?
明らかにそうではありません!よく考えてみると、これはステートメントブロックであることがわかります。
JavaScript コンパイラーはこの曖昧さにどのように対処するのでしょうか?
この問題を解決するために、ECMA の方法は非常に単純かつ粗雑です。文法解析中に、ステートメントが "{" で始まる場合、それはステートメント ブロックとしてのみ解釈されます。
これは本当に不正な対処方法です。
これらはすべてステートメントブロックであるのに、なぜ {a:1} には文法上の誤りがないのでしょうか?
実際、ここでは、 a はパーサーによってタグとして理解されます。ラベルは、方向へのジャンプを行うために、break および continue ステートメントとともに使用されます。
したがって、次のように記述すると例外がスローされます:
function () {} は関数宣言でも関数式でもないからです。
この時点で、誰もが {} の奇妙な処理についての基本的な概念を理解できるはずです。記事の冒頭で述べた文を振り返ってみましょう:
最初のコードは、{} がステートメント ブロックであるため、コードは次のように理解できます:
つまり、戻り値は 0 です。
2 番目に、{} がステートメントの先頭にないため、通常のオブジェクトの直接量であり、空の配列と空のオブジェクトが直接追加され、「[object Object]」が返されます。
最初の項目と 2 番目の項目は理解できました。3 番目の項目はもう説明する必要はありません。
4 番目の式は () で始まるため、最初の {} はオブジェクト リテラルとして解析されるため、2 つの式は等しく、true を返します。