2010-11-07 11 views
7

Me pregunto por qué poner una coma al final de un solo elemento es legal en una matriz de JavaScript:"," al final de un solo elemento en un objeto en javascript es ilegal?

var array = [ 
    'foo', // no error in IDE 
] 

poniéndolo al final de un solo elemento en un objeto es ilegal (al menos mi IDE - WebStorm - está marcando sobre un error):

var object = { 
    'foo': 'bar', // error in IDE 
} 

¿Esto es realmente ilegal en JavaScript?

Respuesta

17

En la especificación ECMAScript 5 es legal:

 
ObjectLiteral : 
    { } 
    { PropertyNameAndValueList } 
    { PropertyNameAndValueList , } 

era ilegal en ECMAScript 3.

 
ObjectLiteral : 
    { } 
    { PropertyNameAndValueList } 

Creo que se hizo legal para hacer este tipo de cosas factible.

function getItems() { 
    return { 
     one : 1, 
     two : 2, 
     three : 3, 
     //four : 4, 
    }; 
} 

lugar de esto:

function getItems() { 
    return { 
     one : 1, 
     two : 2, 
     three : 3//, 
     //four : 4, 
    }; 
} 

Ahorro de algunas de las veces los programadores.

+0

+1 para ir a la especificación. Ahora, ¿por qué agregarían esa segunda línea para hacer que esta construcción legal me confunda? – mkoistinen

+0

@mkoistinen - Ver la actualización. – ChaosPandion

+0

¿Qué hay de ECMAScript 4? – Eric

2

Firefox lo tolera, la mayoría de los demás navegadores lo hacen. ¿Todavía necesito mencionar IE se ahoga en él?

De todos modos, simplemente asegúrese de que no haya comas al final de las matrices/objetos. Mientras que los lenguajes como PHP y, dependiendo de la implementación, JavaScript están de acuerdo, es extremadamente feo. Tampoco dejaría una cadena al final de un archivo sin abrir porque el analizador podría considerar EOF como una cadena válida. fin.

+0

IE8 lo odia, aún. –

+0

¿Cree que es un error que C aplica un punto y coma en la línea final de un archivo? :-) –

2

Sí, si está utilizando IE.

+1

El uso de IE (al menos IE <9) debe ser ilegal también. :> – ThiefMaster

6

Además de lo que ChaosPandion mencionó, hay una diferencia importante entre un , al final de un objeto y una matriz. Las comas vacías en una matriz (técnicamente llamadas elisiones) insertan elementos undefined en la posición correspondiente; esto aumenta la longitud de la matriz, pero los valores son undefined.

Editar: Gracias a ChaosPandion y CMS para señalar el error. Acabo de volver a leer las especificaciones y, de hecho, una sola coma que se arrastra no aumenta la longitud, sin embargo, cualquier coma posterior adicional o cualquier comas en el medio de una matriz aumentará la longitud.

Por ejemplo, [ 1,2,, ] es una matriz de longitud 3 y el mismo que [ 1, 2, undefined ]. Del mismo modo, [ 1,,,2 ] es una matriz de longitud 4 y la misma que [ 1, undefined, undefined, 2 ].

Por extraño que parezca, cuando se trata de esta "característica" de JavaScript, IE se comporta correctamente con una coma final en una matriz (cuenta el elemento extra) mientras Firefox ignora el último elemento indefinido.

+1

Un pequeño error, la sintaxis permite una coma al final, por lo que para hacer una matriz de longitud tres, deberá escribir esto: '[1,2 ,,]' – ChaosPandion

+0

Vea el comentario anterior. Pero +1 para hablar de matrices y comillas finales. –

+0

excelente respuesta –

Cuestiones relacionadas