2012-01-26 10 views
22

En wtfjs, encontré que el siguiente es javascript legal.JavaScript "tupla" notación: ¿cuál es su punto?

",,," == Array((null,'cool',false,NaN,4)); // true 

El argumento (null,'cool',false,NaN,4) se parece a una tupla para mí, pero JavaScript no tiene tuplas!

Algunas pruebas rápidas en mi consola javascript producen lo siguiente.

var t = (null,'cool',false,NaN,4); // t = 4 
(null,'cool',false,NaN,4) === 4; // true 
(alert('hello'), 42); // shows the alert and returns 42 

Parece que se comporten exactamente como una lista separada por punto y coma ; de declaraciones, simplemente devolviendo el valor de la última declaración.

¿Hay alguna referencia en alguna parte que describa esta sintaxis y su semántica? ¿Por qué existe, es decir, cuándo debería usarse?

+0

Es el operador de coma: http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ – Lepidosteus

+1

El operador de coma también se puede (ab) utilizar para ejecutar una serie de funciones dentro de una rama ternaria, ya que devolverá el resultado de la última declaración de todos modos: 'var a = isTrue? (b = f (c), g (b)): (b = g (c), f (b)) '. Rara vez es inteligente, pero a veces es útil si se prefiere un código muy conciso sobre la legibilidad, o para la depuración rápida. – Fx32

+0

Esto se llama una 'expresión' en JavaScript, esto no es simplemente un efecto del operador de coma aunque juega una pequeña parte; Esta expresión se resuelve debido al operador de coma. Puede establecer un valor para cualquier variable mutable de cualquier expresión evaluada. Incluso si esa expresión no está definida. – Relic

Respuesta

30

Usted está viendo el efecto de la comma operator .

El operador de coma evalúa sus dos operandos (de izquierda a derecha) y devuelve el valor del segundo operando.

El valor resultante cuando a,b,c,...,n se evalúa siempre será el valor de la expresión más a la derecha, sin embargo todos expresiones en la cadena todavía se evalúan (de izquierda a derecha).

+0

Gracias, el término "operador de coma" es lo que estaba buscando. – Grilse

1

Pruebe esto alert((null,'cool',false,NaN,4)) y entonces usted puede ver.

demo

La razón se debe a que el operador coma evalúa todas las declaraciones y regresar el último.

Piense en esta línea: a = 1, b = 2, c = 3; se ejecutará cada expresión por lo que en esencia se va a establecer las variables a lo que quiere y devolver el último valor (en este caso 3)

8

Como ya se explicó, este comportamiento es causado por el operador ,. Debido a esto, la expresión (null,'cool',false,NaN,4) siempre evaluará a 4. Así que tenemos

",,," == Array(4) 

Array(4) - crea nueva matriz con los elementos asignados 4. En el momento de la comparación con la cadena, esta matriz se convierte en una cadena como lo sería con Array(4).toString(). Para las matrices toString actúa como el método join(',') llamado en esta matriz. Por lo tanto, para la matriz vacía de 4 elementos, join producirá la cadena ",,,".