2012-03-21 5 views

Respuesta

11

Do BlockStatements return 0 ...?

No, blocks devuelve el valor de la última expresión dentro de ellos. Esto se puede ver con sólo hacer:

{1 + 8} 

... en la consola de JavaScript, que mostrará 9.

{1 + ''} + 10 // 10
{1 + ''} + '' // 0
¿Por qué sucede esto?

Porque aunque el bloque devuelve un valor, ese valor no se utiliza. {1 + ''} + 10 // 10 código se evalúa como dos elementos distintos:

{1 + ''} // "1" 
+10  // 10 

... o escribiendo aquellos con muesca estándar y coma:

{ 
    1 + ''; 
} 
+10; 

... y ya está viendo el resultado de la segunda, como si el primero no estuviera allí en absoluto. El + no es el operador de suma, es el unary+ (similar al unary -, pero no cambia el signo de su operando). +10 es, por supuesto, 10; y +'' es 0 porque aplicar el operador a una cadena convierte la cadena en un número, y Number('') es 0.

Puede demostrar que se está viendo la + más que el operador unario por tratar esto:

{1 + ''} * 10 

... que es realmente

{ 
    1 + ''; 
} 
*10; 

falla con un error de sintaxis porque no hay unario *.

Como Felix amablemente señala en los comentarios a continuación, para el + en su ejemplo para ser el operador de suma (que habría terminado por concatenación de cadenas, en su caso), que tendría que ser between two expressions, y una bloque es un statement, no un expression.

+0

Gracias! Inicialmente estaba confundido porque '{''} + 'a'' devuelve' NaN', pero ahora me he dado cuenta de que es por el signo +. – callumacrae

+2

Eso no es 100% correcto: http://es5.github.com/#x12.1 * "Devuelve el resultado de evaluar StatementList." *. Sin embargo, no hace la diferencia, ya que un bloque es una declaración y, por lo tanto, no se puede usar dentro de una expresión (al menos así es como yo lo entiendo). –

+0

@FelixKling: ¡Gracias por eso! He eliminado el bit incorrecto ("Los bloques no devuelven nada"). Y ahora tengo que profundizar en la gramática (que no tengo tiempo de hacer en este momento) para comprender la razón subyacente por la cual el bloque y la expresión que lo sigue se mantienen separados y separados.Lo son, y yo sabía que lo eran, pero no sé qué parte precisa de la gramática dicta que ... :-) Probablemente, como dijiste, es algo que tiene que ver con las declaraciones frente a las expresiones. –