Hola usuario de nuestro sitio web, encontramos la respuesta a tu interrogante, has scroll y la encontrarás más abajo.
Solución:
El intérprete / compilador de javascript es tan inteligente que solo inserta puntos y comas automáticos si luego hay un Javascript válido.
Tu código funciona, porque && b
tal como está no es una expresión válida, por eso no se inserta ningún punto y coma después de la return a
Resultando en:
return a && b && c;
Sin embargo:
return (undefined);//implicitely inserted
....
es perfectamente válido y por eso se inserta un punto y coma.
Para completar la referencia a la especificación: inserción automática de punto y coma. Vale la pena leer los ejemplos.
No es específico del navegador / implementación, pero Section 7.9 Automatic Semicolon Insertion
de la Especificación del lenguaje ECMAScript vale la pena leer.
7.9 Inserción automática de punto y coma
Ciertas declaraciones de ECMAScript (declaración vacía, declaración de variable, declaración de expresión, declaración do-while, declaración de continuación, declaración de interrupción, declaración de retorno y declaración de lanzamiento) deben terminarse con punto y coma. Estos puntos y comas siempre pueden aparecer explícitamente en el texto fuente. Sin embargo, por conveniencia, estos puntos y comas se pueden omitir del texto de origen en determinadas situaciones. Estas situaciones se describen diciendo que los puntos y comas se insertan automáticamente en el flujo de tokens de código fuente en esas situaciones.
7.9.1 Reglas de inserción automática de punto y coma Hay tres reglas básicas para la inserción de punto y coma:
-
Cuando, a medida que se analiza el programa de izquierda a derecha, se encuentra un token (llamado token infractor) que no está permitido por ninguna producción de la gramática, se inserta automáticamente un punto y coma antes del token infractor si uno o más de los siguientes las condiciones son true:
- El token infractor está separado del token anterior por al menos un LineTerminator.
- El token infractor es}.
-
Cuando, a medida que el programa se analiza de izquierda a derecha, se encuentra el final del flujo de entrada de tokens y el analizador no puede analizar el flujo de token de entrada como un único Programa ECMAScript completo, se inserta automáticamente un punto y coma al final de el flujo de entrada.
-
Cuando, a medida que el programa se analiza de izquierda a derecha, se encuentra un token que está permitido por alguna producción de la gramática, pero la producción es una producción restringida y el token sería el primer token para un terminal o no terminal inmediatamente después de la anotación. ?[no LineTerminator here]? dentro de la producción restringida (y, por lo tanto, dicho token se denomina token restringido), y el token restringido está separado del token anterior por al menos un LineTerminator, luego se inserta automáticamente un punto y coma antes del token restringido. Sin embargo, existe una condición primordial adicional en las reglas anteriores: un punto y coma nunca se inserta automáticamente si el punto y coma se analizaría como una declaración vacía o si ese punto y coma se convertiría en uno de los dos puntos y comas en el encabezado de una declaración for (ver 12.6.3). NOTA Las siguientes son las únicas producciones restringidas en la gramática: PostfixExpression: LeftHandSideExpression [no LineTerminator here] ++ LeftHandSideExpression [no LineTerminator here] – ContinueStatement: continuar [no LineTerminator here] Identificador; BreakStatement: romper [no LineTerminator here] Identificador; ReturnStatement: retorno [no LineTerminator here] Expresión ; ThrowStatement: lanzar [no LineTerminator here] Expresión ; El efecto práctico de estas producciones restringidas es el siguiente: cuando se encuentra un token ++ o – donde el analizador lo trataría como un operador postfijo, y al menos un LineTerminator ocurrió entre el token anterior y el token ++ o – , luego se inserta automáticamente un punto y coma antes del símbolo ++ o -. Cuando se encuentra un token de continuar, romper, regresar o lanzar y se encuentra un LineTerminator antes del siguiente token, se inserta automáticamente un punto y coma después del token de continuar, romper, regresar o lanzar. El consejo práctico resultante para los programadores de ECMAScript es: Un operador posfijo ++ o – debe aparecer en la misma línea que su operando. Una expresión en una declaración return o throw debe comenzar en la misma línea que el token return o throw. Un identificador en una instrucción break o continue debe estar en la misma línea que el token break o continue.
7.9.2 Ejemplos de inserción automática de punto y coma
La fuente
1 2 3
no es una oración válida en la gramática de ECMAScript, incluso con las reglas de inserción automática de punto y coma. En contraste, la fuente
1
2 3
tampoco es una oración ECMAScript válida, pero se transforma mediante la inserción automática de punto y coma en lo siguiente:
1
;2 ; 3;
que es una sentencia ECMAScript válida. La fuente
for (a; b
)
no es una oración ECMAScript válida y no se modifica mediante la inserción automática de punto y coma porque el punto y coma es necesario para el encabezado de una instrucción for. La inserción automática de punto y coma nunca inserta uno de los dos puntos y coma en el encabezado de una instrucción for. La fuente
return
a + b
se transforma mediante la inserción automática de punto y coma en lo siguiente:
return;
a + b;
NOTA La expresión a + b no se trata como un valor que debe devolver la declaración de retorno, porque un LineTerminator lo separa del retorno del token. La fuente
a = b
++c
se transforma mediante la inserción automática de punto y coma en lo siguiente:
a = b;
++c;
NOTA El token ++ no se trata como un operador de sufijo que se aplica a la variable b, porque se produce un LineTerminator entre by ++. La fuente
if (a > b)
else c = d
no es una oración ECMAScript válida y no se altera mediante la inserción automática de punto y coma antes del token else, aunque no se aplica ninguna producción de la gramática en ese punto, porque un punto y coma insertado automáticamente se analizaría como una declaración vacía. La fuente
a = b + c
(d + e).print()
no se transforma mediante la inserción automática de punto y coma, porque la expresión entre paréntesis que comienza la segunda línea se puede interpretar como una lista de argumentos para una llamada de función:
a = b + c(d + e).print()
En el caso de que una instrucción de asignación deba comenzar con un paréntesis izquierdo, es una buena idea que el programador proporcione un punto y coma explícito al final de la instrucción anterior en lugar de depender de la inserción automática de punto y coma.