¿Se necesitan puntos y comas después de una asignación literal de objeto en JavaScript?


El siguiente código ilustra un objeto literal asignado, pero sin punto y coma después:

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

Esto parece ser legal, y no emite una advertencia (al 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 futuros problemas de compatibilidad... Me gustaría escribir JavaScript" correcto", así que si técnicamente necesito usar el punto y coma, me gustaría usar se.

 27
Author: Peter Mortensen, 2008-09-03

7 answers

Técnicamente no, JavaScript tiene punto y coma como opcional en muchas situaciones.

Pero, como regla general, utilícelos al final de cualquier instrucción. ¿Por qué? Porque si alguna vez quieres comprimir el script, te ahorrará innumerables horas de frustración.

La inserción automática de punto y coma es realizada por el intérprete, por lo que puede omitirlos si así lo desea. En los comentarios, alguien afirmó que

El punto y coma no es opcional con sentencias como break / continue / throw

Pero esto es incorrecto. 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 diferencia sutil.

Aquí está el resto del estándar en la inserción de punto y coma:

Por conveniencia, sin embargo, tales puntos y comas pueden ser omitidos del texto fuente en ciertas situaciones. Estas situaciones se describen diciendo que los puntos y comas se insertan automáticamente en el código fuente token stream en esas situaciones.

 34
Author: Jason Bunting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 00:58:36

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

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

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

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

 13
Author: Daniel James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 17:54:33

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, un punto y coma se agregará silenciosamente 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 claramente no está bien. Pero hay casos donde un error es no lanzado, pero las sentencias no se ejecutan como se pretendía debido a la inserción de punto y coma. Considerar 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 como este pueden ser terriblemente difíciles de cazar y aunque no puedes asegurar que esto nunca suceda (ya que no hay manera que yo sepa de desactivar la inserción de punto y coma), este tipo de errores son más fáciles de identificar cuando dejas claras tus intenciones usando consistentemente punto y coma. Eso y agregar explícitamente punto y coma se considera generalmente un buen estilo.

Primero me di cuenta de esta pequeña posibilidad insidiosa al leer Douglas Crockford excelente y sucinto libro" JavaScript: The Good Parts ". Yo altamente lo recomiendo.

 8
Author: JesDaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 17:57:27

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". Más bien, tiene reglas estrictas alrededor de la inserción automática de punto y coma. Punto y coma no son opcionales con sentencias como break, continue, o throw. Consulte la Especificación del lenguaje ECMA para más detalles; específicamente 11.9.1, reglas de inserción automática de punto y coma.

 3
Author: TonyLa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 17:55:53

Use JSLint para mantener su JavaScript limpio y ordenado

JSLint dice:

Error:

Global implícito: alerta 2

Problema en la línea 3 carácter 2: Falta coma.

}

 0
Author: Geoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 04:18:53

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

Si está buscando escribir JavaScript "correcto", le sugeriría probar cosas en Firefox con javascript.options.strict (accedido a través de about:config) establecido en true. Puede que no atrape todo, pero debería ayudarlo a asegurarse de que su código JavaScript sea más obediente.

 0
Author: Travis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 17:53:41

Esto no es válido (ver aclaración a continuación) Código JavaScript, ya que la asignación es solo una instrucció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 errores de sintaxis, pero este es un paso adicional e innecesario. No conozco ningún modo estricto, pero sí sé que los analizadores automatizados o compresores / ofuscadores necesitan ese punto y coma.

Si desea escribir código JavaScript correcto, escriba 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 faltan. Esto hace que no sean necesarios para el autor del script, pero implica que son necesarios para el intérprete. Esto significa que la respuesta a la pregunta original es 'No', no se requieren al escribir un guion, pero, como se señala por otros, se recomienda por varias razones.

 -1
Author: Kamiel Wanrooij,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 17:52:14