Все хорошо известно, что синтаксис 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.
Во -вторых, поскольку {} не находится в начале оператора, это нормальное прямое количество объекта, пустое массив и пустой объект добавляются напрямую, а «[объект объекта]» возвращается.
Я понимаю первые и вторые статьи, но нет необходимости объяснять третью статью.
Статья 4, поскольку он начинается с (), первая {} проанализируется в прямом количестве объекта, поэтому две формулы равны и возвращают true.