¿En qué se diferencia el manejo de saltos de línea de Python de los puntos y comas automáticos de JavaScript?

41

Javascript tiene una función llamada Inserción automática de punto y coma donde, básicamente, si el analizador encuentra un token no válido, y el último token anterior fue un salto de línea, el analizador insertará un punto y coma donde se encuentra el salto de línea. Básicamente, esto le permite escribir todo su código javascript sin punto y coma, pero debe conocer algunos casos de borde, principalmente si tiene una palabra clave de retorno y luego el valor que desea devolver en una nueva línea.

function test(){
    // This will return 'undefined', because return is a valid statement
    // and  "john" is a valid statement on its own.
    return 
          "john"
}

Debido a estos errores, hay docenas de artículos con títulos como "La inserción automática de punto y coma es malo", "Usar siempre los puntos y coma en Javascript", etc.

Pero en Python nadie usa punto y coma y tiene exactamente los mismos errores.

def test():
    # This will return 'undefined', because return is a valid statement
    # and  "john" is a valid statement on its own.
    return 
    "john"

Funciona exactamente igual y, sin embargo, nadie tiene un miedo mortal al comportamiento de los Pythons.

Creo que los casos en los que el javascript se comporta mal son tan pocos que deberías poder evitarlos fácilmente. ¿Devolver + valor en una nueva línea? ¿La gente realmente hace eso mucho?

¿Alguna opinión? ¿Utilizas puntos y coma en javascript y por qué?

    
pregunta Einar Egilsson 07.08.2011 - 15:33

13 respuestas

62

La razón es que en Python, las nuevas líneas son una forma inequívoca de separar las líneas de código; Esto es por diseño, y la forma en que esto funciona ha sido bien pensado. Como resultado, el código de Python es perfectamente legible e inequívoco sin ningún marcador especial de fin de declaración (aparte de la nueva línea).

Javascript, por otro lado, fue diseñado con una sintaxis tipo C en mente, donde las declaraciones siempre terminan con un punto y coma. Para hacer que el lenguaje sea más tolerante a los errores, intenta adivinar dónde deberían ir los puntos y coma adicionales para corregir el código. Como se ajustó a la sintaxis tipo C en forma retroactiva, no siempre funciona como se esperaba (a veces, el intérprete de script no es correcto), y puede generar un código bastante intuitivo.

O, argumentar en términos de "explícito es mejor que implícito": en Python, una nueva línea ya es completamente explícita, mientras que en Javascript es ambiguo, así que agregas el punto y coma para hacerlo explícito.

    
respondido por el tdammers 07.08.2011 - 15:53
28

Creo que hay una diferencia bastante fundamental en la forma en que funciona en Python. Cita del post de Einar Egilsson vinculado a: "un punto y coma no está implícito al final de una línea si el primer token de la línea posterior se puede analizar como parte de la misma declaración".

En Python, un salto de línea siempre termina la instrucción, excepto en ciertos casos bastante obvios, como dentro de una expresión entre paréntesis. JavaScript, por otro lado, tratará de analizar tantas líneas como sea posible antes de finalizar la declaración, lo que podría llevar a cosas como esta:

// Define a function and name it area.
area = function(r) {
    return r * r * 3.14159
}

// Fooled you! We're actually invoking it.
(14)
    
respondido por el Henrik 07.08.2011 - 20:09
20

A menudo minimizo mis archivos JS en modo de producción. Medios, eliminación de comentarios y saltos de línea.

Sin el uso de puntos y coma, eso rompería mi Javascript.

    
respondido por el Deradon 07.08.2011 - 15:50
5

No funciona como lo describe.

  

Javascript tiene una función llamada Inserción automática de punto y coma donde, básicamente, si el analizador encuentra un token no válido, y el último token anterior fue un salto de línea, el analizador insertará un punto y coma donde se encuentra el salto de línea.

Esto está mal. Ejemplo:

return
  1 + 2;

1 es un token perfectamente válido, pero el analizador seguirá insertando un punto y coma directamente después de return .

Como puedes ver, incluso no puedes decir exactamente dónde ocurrirá un punto y coma.

El problema con la inserción automática es doble:

  • Por un lado, las personas pueden dejar un punto y coma donde la inserción automática no puede determinar que es necesario insertar una.
  • Además, se puede insertar un punto y coma donde no se pretende, como se indicó anteriormente.

Por supuesto, usar puntos y coma después de cada declaración ayuda solo con la primera fuente de errores.

En cualquier caso, como ya puede adivinar, creo que la inserción automática de punto y coma en la sintaxis tipo C es una mala idea.

    
respondido por el Svante 07.08.2011 - 17:59
4

Yo diría una razón simple:

Javascript se ve "kinda java-ish" o "kinda C-ish". Por supuesto, es un lenguaje dinámico, así que se ve diferente ... pero acéptalo - Hay llaves. Los idiomas con llaves generalmente tienen puntos y coma. Los reflejos naturales se activan y hacen que su dedo vaya hacia la tecla de punto y coma antes de presionar Enter .

Python, por el contrario, incluso a simple vista parece totalmente diferente. Por lo tanto, poca o ninguna analogía con "los idiomas aburridos estándar" se forma intuitivamente y cuando uno ingresa en el "modo python", La falta de punto y coma viene como algo natural.

    
respondido por el Kos 07.08.2011 - 20:44
2

Hay varias razones buenas no para usar la inserción de punto y coma en JavaScript.

Principalmente es porque la inserción de punto y coma como se define en el estándar ECMAScript no es intuitiva para algunos casos. @Svante señala un caso para return donde el uso de nueva línea causará problemas.

Lo que él no menciona es que causará problemas si también estás usando punto y coma , porque la inserción del punto y coma sucede si lo quieres o no.

Otra muy buena razón no para usar la inserción de punto y coma es el control de salida. En muchos casos, JavaScript se ejecuta a través de un minificador antes de ser utilizado en la producción. Algunos mineros pueden manejar casos de inserción automática de punto y coma, pero no veo ninguna razón para confiar en que funcione perfectamente

Además, para los sistemas de administración de contenido, el JavaScript en línea se puede minimizar automáticamente, y he visto varios casos en los que el minitorizador simplemente elimina comentarios y recorta los espacios en blanco (incluidas las nuevas líneas) desde el principio y el final de cada línea.

Para los autores que no tienen la opción de elegir las herramientas, es mucho más fácil limitarse a un formato que funcione en la gran mayoría de los casos.

    
respondido por el zzzzBov 07.08.2011 - 18:25
1

No usar el punto y coma es una receta para el fracaso al minimizar los archivos de archivos de JavaScript. Por eso me da miedo.

    
respondido por el Eastern Monk 07.08.2011 - 18:24
1

En Javascript, puede escribir un programa que sea sintácticamente correcto en ausencia de la inserción automática de punto y coma, y ASI transformará ese programa en un programa sintácticamente correcto diferente (por ejemplo, código de transformación que devuelve un valor en el código que no devuelve nada). No hay un caso análogo en Python. En Python, cualquier nueva línea que pueda terminar una declaración hará finalizar una declaración, a menos que se escape con una barra invertida. Técnicamente, supongo que las reglas de Javascript son igualmente deterministas, pero no sé si podría resumir las reglas de Javascript para terminar las declaraciones en una sola frase.

    
respondido por el Ryan Thompson 07.08.2011 - 19:43
1

En la mayoría de los casos, el ASI de JavaScript maneja las cosas como se esperaba. Un ejemplo de ASI que tal vez no se comporte de la manera que usted esperaría es este:

var i = 0

(function() {
   // do something
})()

Esto se interpretará como que llama a la función 0 con la función anónima y luego ejecuta el resultado. En este caso, es probable que desee realizar una asignación, luego ejecute inmediatamente la función anónima.

Para alguien que no esté familiarizado con ASI puede ser muy confuso cuando te encuentras con problemas como este, por eso siempre recomiendo a los desarrolladores de mi equipo que utilicen puntos y coma.

(Aparte de esto: no uso punto y coma cuando trabajo en proyectos personales o paralelos porque sé que nadie más necesitaría mantener el código).

    
respondido por el jay_soo 07.08.2011 - 20:39
1

Al igual que tú, creo que es un poco paranoico. Las reglas para la inserción de punto y coma están bien definidas en JavaScript, al igual que en Python y CoffeeScript. Nadie se tira de punto y coma a Python o CoffeeScript, así que ¿por qué se trata JavaScript de forma diferente?

Creo que es una reacción exagerada al estado desgraciado del código JavaScript típico de hace unos diez años. JavaScript fue visto como un lenguaje débil, con errores, feo, no bueno. Fue una vergüenza. Posiblemente no puedas escribir un buen código en JavaScript!

Luego, la gente vino y trató de demostrar que podría escribir código hermoso y claro en JavaScript. La regla " siempre usa puntos y coma" fue parte de esta ola. Y para ser honesto, puede aclarar algunas situaciones.

¿Por qué se sigue tratando a JavaScript de manera diferente?

Hay inercia. Y no debe pasarse por alto que las personas que aprecian el código estructurado explícito a menudo prefieren los lenguajes de estilo C. las personas que aprecian el código estructurado implícitamente a menudo siguen adelante a lenguajes que no sean de estilo C (como CoffeeScript).

    
respondido por el Closure Cowboy 07.08.2011 - 20:58
0

Los uso en Javascript estrictamente por coherencia. Si la mayoría de las líneas tienen

Python los tiene para casos extremos, como declaraciones múltiples en una sola línea, javascript los tiene y, dado que los encontrará con regularidad, cumplo con la norma en la que se utilizan.

No puedo encontrar un uso para varias declaraciones en la misma línea y, por lo tanto, no preveo el uso de puntos y coma.

    
respondido por el Chris 07.08.2011 - 15:38
0

Si usa algo como bundle-fu, y el administrador de activos para su aplicación web en rieles, entonces se rompería horriblemente si no encuentra un punto y coma al final del token en javascript. Así que es una buena práctica poner una.

    
respondido por el subiet 07.08.2011 - 17:45
0

No puedo recordar cuál es la versión exacta de IE, pero hay algunos casos en los que IE literalmente produce un error si falta un punto y coma. IIRC es cuando tienes en el ámbito global algo como:

var myFunc = function() {
  ...
}

Si no agrega el; después de la llave de cierre, el programa fallará en algunas versiones de IE. Eso, junto con las otras razones (incluida la recomendación de Crockford de usarlas siempre explícitamente) me ha llevado a usarlas siempre explícitamente en todos los casos.

    
respondido por el apinstein 07.08.2011 - 20:51

Lea otras preguntas en las etiquetas