É bem conhecido a todos que a sintaxe do JavaScript é tão lamentável.
Vamos colocar uma foto primeiro
O código é o seguinte:
A cópia do código é a seguinte:
{} + []; // 0
[] + {}; // "[objeto objeto]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // verdadeiro
Uma armadilha de sintaxe tão dolorosa é provavelmente apenas uma coisa estranha como JavaScript.
Acredito que a maioria dos sapatos infantis que não estudam compiladores de JavaScript não podem ser entendidos. (Pelo menos eu acho incrível)
Mais tarde, fui à garota do Baidu por um tempo e depois percebi de repente!
Vamos dar uma olhada neste código:
A cópia do código é a seguinte:
{
A: 1
}
Acredito que a maioria dos sapatos infantis pense que isso é uma medição direta do objeto à primeira vista.
E esse código?
A cópia do código é a seguinte:
{
var a = 1;
}
O navegador solicitará erros de sintaxe?
Obviamente não! Se você pensar com cuidado, entenderemos que este é um bloco de declaração.
A cópia do código é a seguinte:
if (isNumber) {
var a = 1;
}
Falando nisso, você pode ter descoberto que haverá ambiguidade em JavaScript começando com {.
Então, como o compilador JavaScript lida com essa ambiguidade?
Para resolver esse problema, o método da ECMA é muito simples e grosseiro: ao analisar a sintaxe, se uma instrução começar com "{", é interpretada apenas como um bloco de declaração.
Esta é realmente uma maneira traidora!
Como todos são blocos de declaração, por que {a: 1} não tem erros de sintaxe?
De fato, aqui, A é entendido pelo analisador como uma tag. As tags são usadas para combinar o intervalo e continuar as declarações para saltos direcionais.
Portanto, esse método de escrita lançará uma exceção:
A cópia do código é a seguinte:
{
A: function () {}
}
Porque function () {} não é uma declaração de função, nem é uma expressão de função.
Neste ponto, todos devem ter um conceito básico do tratamento estranho de {}. Vamos olhar para as poucas frases mencionadas no início do artigo:
A cópia do código é a seguinte:
{} + []; // 0
[] + {}; // "[objeto objeto]"
{} + [] == [] + {}; // false
({} + [] == [] + {}); // verdadeiro
O primeiro, porque {} é um bloco de declaração, o código pode ser entendido como:
A cópia do código é a seguinte:
if (1) {}
+[]
Portanto, o valor de retorno é 0.
Segundo, como {} não está no início da instrução, é uma quantidade direta de objeto normal, a matriz vazia e o objeto vazio são adicionados diretamente e "[objeto objeto]" é retornado.
Eu entendo o primeiro e o segundo artigos, mas não há necessidade de explicar o terceiro artigo.
Artigo 4, porque começa com (), o primeiro {} é analisado na quantidade direta do objeto, de modo que as duas fórmulas são iguais e retornam true.