Hoy, mientras leía al azar el libro de patrones de JavaScript O'Reilly, encontré algo interesante (página 27 como referencia).
En Javascript, en algunos casos, hay una diferencia si la ubicación de inicio de la riostra es diferente.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Mientras
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
¿Hay algún otro idioma que tenga ese comportamiento? Si es así, seguro que tendría que cambiar mi hábito .. :)
Me preocupa principalmente PHP, C, C ++, Java y ruby.
javascript
language-agnostic
programming-languages
language-design
Rajat Singhal
fuente
fuente
Respuestas:
Cualquier lenguaje que no se base en punto y coma (sino en líneas nuevas) para delimitar declaraciones potencialmente permite esto. Considere Python :
Es posible que pueda construir un caso similar en Visual Basic, pero en la parte superior de mi cabeza no puedo entender cómo porque VB es bastante restrictivo en el lugar donde se pueden colocar los valores. Pero lo siguiente debería funcionar, a menos que el analizador estático se queje de un código inalcanzable:
De los idiomas que mencionaste, Ruby tiene la misma propiedad. PHP, C, C ++ y Java no lo hacen simplemente porque descartan la nueva línea como espacios en blanco y requieren punto y coma para delimitar las declaraciones.
Aquí está el código equivalente del ejemplo de Python en Ruby:
fuente
Throw
yex.GetBaseException()
son líneas lógicas separadas. Más específicamente, dado que Basic históricamente usa líneas para delimitar sus declaraciones, es más probable que un "gotcha" sea una situación en la que un programador cree que ha creado una nueva declaración en una nueva línea lógica, pero no lo ha hecho.El intérprete de JavaScript agrega automáticamente un
;
al final de cada línea si no encuentra uno (con algunas excepciones, no los ingresa aquí :).Básicamente, el problema no es la ubicación de las llaves (que aquí representan un objeto literal, no un bloque de código como en la mayoría de los lenguajes), sino esta pequeña "característica" que obliga a su primer ejemplo a
return ;
=>undefined
. Puede consultar el comportamiento dereturn
en la especificación ES5 .Para otros idiomas que tienen un comportamiento similar, consulte la respuesta de Konrad .
fuente
undefined
a ser devuelto. Escribí un poco sobre los otros idiomas con el prefijo afaik , así que tómatelo con un grano de sal :).Seguramente. El lenguaje de programación go de Google exhibe un comportamiento muy similar (aunque con diferentes efectos). Como se explica allí:
En secreto, creo que Rob Pike solo quería una excusa para requerir el One True Brace Style.
fuente
La respuesta a esa pregunta es bastante sencilla. Cualquier idioma que tenga "inserción automática de punto y coma" podría tener problemas en esa línea. El problema con esto
..es que el motor js insertará un punto y coma después de la
return;
declaración (y por lo tanto, regresaráundefined
). Este ejemplo es una buena razón para abrir las llaves siempre en el lado derecho y nunca también en el lado izquierdo. Como ya lo notó correctamente, si hay un corchete en la misma línea, el interpretador lo notará y no podrá insertar un punto y coma.fuente
FWIW, JSLint informa varias advertencias con esa sintaxis:
fuente
El primer idioma en el que encontré esto fue awk (que también tiene su parte de "rarezas" de sintaxis; punto y coma opcionales, concatenación de cadenas usando solo espacios en blanco, etc.) Creo que los diseñadores de DTrace, que basaron la sintaxis D libremente en awk, tuve suficiente sentido común para NO copiar estas características, pero no puedo recordarlo de la parte superior de mi cabeza. Un ejemplo simple (contando el número de etiquetas ENTITY en un DTD, desde mi Mac):
Si este pequeño script en cambio se escribiera con la llave en una línea propia, esto es lo que sucedería:
fuente