Es bien conocido por todos que la sintaxis de JavaScript es tan lamentable.
Pongamos una foto primero
El código es el siguiente:
La copia del código es la siguiente:
{} + []; // 0
[] + {}; // "[objeto objeto]"
{} + [] == [] + {}; // FALSO
({} + [] == [] + {}); // verdadero
Una trampa de sintaxis tan dolorosa es probablemente solo algo extraño como JavaScript.
Creo que la mayoría de los zapatos infantiles que no estudian compiladores de JavaScript no pueden entenderse en absoluto. (Al menos lo encuentro increíble)
Más tarde, fui a la chica de Baidu por un tiempo y de repente me di cuenta.
Echemos un vistazo a este código:
La copia del código es la siguiente:
{
A: 1
}
Creo que la mayoría de los zapatos para niños pensarán que esta es una medición directa del objeto a primera vista.
¿Qué pasa con este código?
La copia del código es la siguiente:
{
var a = 1;
}
¿El navegador solicitará errores de sintaxis?
¡Obviamente no! Si lo piensas cuidadosamente, entenderemos que este es un bloque de declaración.
La copia del código es la siguiente:
if (isNumber) {
var a = 1;
}
Hablando de esto, es posible que haya descubierto que habrá ambigüedad en JavaScript comenzando con {.
Entonces, ¿cómo trata el compilador JavaScript con esta ambigüedad?
Para resolver este problema, el método de ECMA es muy simple y crudo: al analizar la sintaxis, si una declaración comienza con "{", solo se interpreta como un bloque de declaración.
¡Esta es realmente una forma de trampa!
Dado que son todos los bloques de declaración, ¿por qué {A: 1} no tiene errores de sintaxis?
De hecho, aquí, A es entendido por el analizador como una etiqueta. Las etiquetas se usan para coincidir con las declaraciones de descanso y continuar para saltos direccionales.
Por lo tanto, dicho método de escritura organizará una excepción:
La copia del código es la siguiente:
{
a: function () {}
}
Porque la función () {} no es una declaración de función, ni es una expresión de función.
En este punto, todos deben tener un concepto básico del extraño tratamiento de {}. Veamos hacia atrás en las pocas oraciones mencionadas al comienzo del artículo:
La copia del código es la siguiente:
{} + []; // 0
[] + {}; // "[objeto objeto]"
{} + [] == [] + {}; // FALSO
({} + [] == [] + {}); // verdadero
El primero, porque {} es un bloque de declaración, el código puede entenderse como:
La copia del código es la siguiente:
if (1) {}
+[]
Entonces el valor de retorno es 0.
En segundo lugar, dado que {} no está al comienzo de la declaración, es una cantidad directa de objeto normal, la matriz vacía y el objeto vacío se agregan directamente, y se devuelve "[objeto de objeto]".
Entiendo el primer y el segundo artículo, pero no hay necesidad de explicar el tercer artículo.
Artículo 4, porque comienza con (), el primero {} se analiza en la cantidad directa del objeto, por lo que las dos fórmulas son iguales y devuelven verdadero.