2008-09-03 13 views
25

El siguiente código muestra un objeto literal que se le asigna, pero sin punto y coma después:¿Se necesita punto y coma después de una asignación literal de objeto en JavaScript?

var literal = { 
    say: function(msg) { alert(msg); } 
} 
literal.say("hello world!"); 

Esto parece ser legal y no emite una advertencia (por lo menos en Firefox   3). ¿Es esto completamente legal, o hay una versión estricta de JavaScript donde esto no está permitido?

Me pregunto en particular por problemas de compatibilidad en el futuro ... Me gustaría escribir el JavaScript "correcto", así que si técnicamente necesito usar el punto y coma, me gustaría utilizarlo.

+0

Estoy bastante seguro de que se romperá en IE. Si bien puede ser javascript válido, probablemente tenga que agregar el punto y coma de todos modos –

+1

Los puntos y comas son opcionales, pero su código no será válido si lo ejecuta a través de un minimizador de JavaScript como el compresor YUI. Por lo tanto, es una buena práctica incluir siempre puntos y comas. – Ricky

Respuesta

33

No técnicamente, JavaScript tiene punto y coma como opción en muchas situaciones.

Pero, como regla general, úselas al final de cualquier instrucción. ¿Por qué? Porque si alguna vez quiere comprimir el script, lo salvará de innumerables horas de frustración.

El intérprete realiza la inserción de punto y coma automática, por lo que puede dejarlas fuera si así lo desea. En los comentarios, alguien reclamó que

Semicolons are not optional with statements like break/continue/throw

pero esto es incorrecto. Ellos son opcionales; lo que realmente está sucediendo es que los terminadores de línea afectan la inserción automática de punto y coma; es una sutil diferencia.

Aquí está el resto de la serie en la inserción y coma:

For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.

0

Uso JSLint para mantener su JavaScript limpio y ordenado

JSLint dice:

Error:

Implied global: alert 2

Problem at line 3 character 2: Missing semicolon.

}

+1

El problema con JSLint es que fue escrito por Douglas Crockford, quien cree que los puntos y comas deberían ser obligatorios. Por lo tanto, la alerta. – staticsan

+4

@staticsan - No es solo una creencia personal. Requerir puntos y comas al final de cada línea significa que el archivo js se puede minimizar en un único archivo de línea. – Geoff

-1

Esto no es válida (ver la aclaración a continuación) Código de JavaScript, ya que la asignación es solo una declaración regular, no es diferente de

var foo = "bar"; 

El punto y coma se puede omitir ya que los intérpretes de JavaScript intentan agregar un punto y coma para corregir los errores de sintaxis, pero este es un paso adicional e innecesario. No conozco ningún modo estricto, pero sé que los analizadores automáticos o los compresores/ofuscadores necesitan ese punto y coma.

Si desea estar escribiendo código JavaScript correcta, escribir el punto y coma :-)

De acuerdo con la especificación ECMAScript, http://www.ecma-international.org/publications/standards/Ecma-262.htm, los puntos y comas se insertan automáticamente si falta. Esto hace que no sean necesarios para el autor del guión, pero implica que son necesarios para el intérprete. Esto significa que la respuesta a la pregunta original es 'No', no son necesarios al escribir un guión, pero, como lo señalan otros, se recomienda por varias razones.

0

El punto y coma no es necesario. Algunas personas optan por seguir la convención de terminar siempre con un punto y coma en lugar de permitir que JavaScript lo haga de forma automática en los saltos de línea, pero estoy seguro de que encontrará grupos que abogan por cualquier dirección.

Si usted está buscando en la escritura "correcta" JavaScript, sugeriría probar cosas en Firefox con javascript.options.strict (accede a través de about:config) se define como true.Puede que no capte todo, pero debería ayudarlo a asegurarse de que su código JavaScript sea más compatible.

13

El compresor YUI y dojo shrinksafe deberían funcionar perfectamente bien sin punto y coma, ya que están basados ​​en un analizador de JavaScript completo. Pero Packer y JSMin no lo harán.

La otra razón para usar siempre punto y coma al final de las instrucciones es que ocasionalmente puede combinar accidentalmente dos declaraciones para crear algo muy diferente. Por ejemplo, si se sigue la afirmación con la técnica común para crear un ámbito de aplicación usando un cierre:

var literal = { 
    say: function(msg) { alert(msg); } 
} 
(function() { 
    // .... 
})(); 

El analizador podrían interpretar los soportes como una llamada de función, aquí causando un error de tipo, pero en otras circunstancias, podría causa un error sutil que es difícil de rastrear. Otro error interesante es que si la siguiente instrucción comienza con una expresión regular, el analizador podría pensar que la primera barra inclinada es un símbolo de división.

+1

Recientemente me encontré con un problema similar (nuevamente debido a un cierre después de una asignación). Este es un escenario muy probable y es un buen argumento para el uso consistente de puntos y comas. +1 –

2

En este caso no hay necesidad de un punto y coma al final de la instrucción. La conclusión es la misma, pero el razonamiento está muy lejos.

JavaScript no tiene punto y coma como "opcional". Por el contrario, tiene reglas estrictas sobre la inserción automática de punto y coma. Los puntos y coma no son opcionales con sentencias como break, continue o throw. Consulte el ECMA Language Specification para obtener más detalles; específicamente 11.9.1, rules of automatic semicolon insertion.

7

Los intérpretes de JavaScript hacen algo llamado "inserción de punto y coma", por lo que si una línea sin punto y coma es válida, se agregará un punto y coma al final de la instrucción y no se producirá ningún error.

var foo = 'bar' 
// Valid, foo now contains 'bar' 
var bas = 
    { prop: 'yay!' } 
// Valid, bas now contains object with property 'prop' containing 'yay!' 
var zeb = 
switch (zeb) { 
    ... 
// Invalid, because the lines following 'var zeb =' aren't an assignable value 

No es demasiado complicado y al menos se produce un error cuando algo no está bien. Pero hay casos en que se produce un error no, pero las instrucciones no se ejecutan como se esperaba debido a la inserción de punto y coma. Considere una función que se supone que devuelve un objeto:

return { 
    prop: 'yay!' 
} 
// The object literal gets returned as expected and all is well 
return 
{ 
    prop: 'nay!' 
} 
// Oops! return by itself is a perfectly valid statement, so a semicolon 
// is inserted and undefined is unexpectedly returned, rather than the object 
// literal. Note that no error occurred. 

Errores de este tipo pueden ser exasperantemente difícil de cazar y al mismo tiempo no se puede garantizar esto nunca sucede (ya que no hay manera que conozco para convertir fuera de la inserción de punto y coma), este tipo de errores son más fáciles de identificar cuando haces que tus intenciones sean claras al usar consistentemente puntos y comas. Eso y agregar explícitamente punto y coma generalmente se considera un buen estilo.

Me enteré por primera vez de esta pequeña posibilidad insidiosa al leer Douglas Crockford's excelente y sucinto libro "JavaScript: The Good Parts". I altamente lo recomiendo.

Cuestiones relacionadas