2011-10-10 28 views

Respuesta

16

Debido {a : 1} es una declaración y no se permite que siga por == embargo

({ a : 1 }) es una expresión y se le permite ser seguido por ==

Esto es, básicamente, las reglas definidas en la gramática.

Sin embargo tenga en cuenta que ({ a: 1} == { a: 1}) es válido. Entonces la expresión de equivalencia es válida.

Esto significa que {a : 1} == { a : 1 } simplemente no es una declaración válida .

12.4 of the ES5.1 spec dice

NOTA Un ExpressionStatement no puede comenzar con una llave de apertura porque eso podría hacer que sea ambigua con un bloque. Además, un ExpressionStatement no puede comenzar con la palabra clave de la función porque eso podría hacer que sea ambigua con una FunctionDeclaration.

Como comentario, usted encontrará que

({a : 1}) != {a : 1} porque son dos nuevos objetos

+0

¿Estás seguro? Espero que '! ==' falle pero no '! =' – spraff

+6

@spraff: sí, está seguro. –

13

El líder "{" personaje es interpretado por el intérprete como iniciar un bloque de instrucciones, no como comenzando una expresión. Es una ambigüedad en el lenguaje y esa es la forma en que se resuelve (de acuerdo con la especificación).

Es similar a la ambigüedad alrededor de la palabra clave function. Cuando una instrucción comienza con function, es una declaración de declaración de función, aunque sintácticamente es podría ser el inicio de una expresión. Los analizadores simplemente deben resolver tales ambigüedades de acuerdo con algunas reglas.

+3

[12.4] (http://es5.github.com/?utm_source=javascriptweekly&utm_medium=email#x12.4) es la referencia que un '{' debe ser un bloque y no puede ser una declaración de expresión – Raynos

+0

Ah gracias ! Necesito guardar una copia de la especificación uno de estos días en lugar de volver al sitio de ecma y descargarlo todo el tiempo - es muy lento :-) – Pointy

+0

marcar el ES5.1 anotado – Raynos

0

Creo que es posible que desee asignar ambos objetos a las variables primero y comparar esas dos variables en lugar de crearlas dentro de la declaración. Su problema se basa en el hecho de que está asignando en la declaración. Al agregar el() está envolviendo esa tarea como una declaración y funciona bien.

Cuestiones relacionadas