JavaScriptの構文が非常に哀れであることは誰にもよく知られています。
最初に写真を掲載しましょう
コードは次のとおりです。
コードコピーは次のとおりです。
{} + []; // 0
[] + {}; //「[オブジェクトオブジェクト] "
{} + [] == [] + {}; // 間違い
({} + [] == [] + {}); // 真実
このような痛みを伴う構文の落とし穴は、おそらくJavaScriptのような奇妙なものです。
JavaScriptコンパイラを研究していないほとんどの子供用靴はまったく理解できないと思います。 (少なくとも私はそれが信じられないと思います)
その後、私はしばらくバイドゥの女の子に行き、それから突然それを実現しました!
このコードを見てみましょう。
コードコピーは次のとおりです。
{
A:1
}
ほとんどの子供の靴は、これが一目ぼれの直接的な測定であると考えるだろうと思います。
このコードはどうですか?
コードコピーは次のとおりです。
{
var a = 1;
}
ブラウザは構文エラーを求めますか?
明らかにそうではありません!慎重に考えると、これがステートメントブロックであることを理解します。
コードコピーは次のとおりです。
if(isNumber){
var a = 1;
}
これについて言えば、JavaScriptに曖昧さが{から始まることを発見したかもしれません。
では、JavaScriptコンパイラはこのあいまいさにどのように対処していますか?
この問題を解決するために、ECMAの方法は非常にシンプルで粗いです。構文を解析するとき、ステートメントが「{」で始まる場合、それはステートメントブロックとしてのみ解釈されます。
これは本当に不正行為です!
それらはすべてステートメントブロックであるため、なぜ{a:1}に構文エラーがないのですか?
実際、ここでは、パーサーによってタグとして理解されています。タグは、方向ジャンプのブレークと継続的なステートメントを一致させるために使用されます。
したがって、そのような執筆方法は例外をスローします:
コードコピーは次のとおりです。
{
A:function(){}
}
function(){}は関数宣言ではなく、関数式でもないためです。
この時点で、誰もが{}の奇妙な扱いの基本概念を持っている必要があります。記事の冒頭で言及されたいくつかの文章を振り返ってみましょう。
コードコピーは次のとおりです。
{} + []; // 0
[] + {}; //「[オブジェクトオブジェクト] "
{} + [] == [] + {}; // 間違い
({} + [] == [] + {}); // 真実
最初のものは、{}はステートメントブロックであるため、コードは次のように理解できます。
コードコピーは次のとおりです。
if(1){}
+[]
したがって、返品値は0です。
第二に、{}はステートメントの先頭にないため、通常のオブジェクトの直接的な数量であり、空の配列が直接追加され、「[オブジェクトオブジェクト]」が返されます。
私は最初と2番目の記事を理解していますが、3番目の記事を説明する必要はありません。
第4条は、()で始まるため、最初の{}はオブジェクトの直接数量に解析されるため、2つの式は等しく、返されます。