2012-03-25 31 views
6

Como gdoron señaló,¿Cómo [b] [b = a, 0] intercambia entre a y b?

var a = "a"; 
var b = "b"; 

a = [b][b = a,0]; 

intercambiará a y b, y aunque se ve un poco de hacky, que ha provocado mi curiosidad y estoy muy curiosa la forma en que funciona. No tiene ningún sentido para mí.

+2

_ "un poco hacky" _ ??? un montón de hacky ... :-) – gdoron

+0

Relevante: [¿Cuál es una mejor manera de intercambiar dos valores de argumento?] (http://stackoverflow.com/questions/8482402/whats-a-better-way-to-swap- two-argument-values) –

+0

¿No hubiera tenido más sentido comentar la otra respuesta de Godron y pedir una aclaración en su pregunta original? –

Respuesta

7
var a = "a"; 
var b = "b"; 

a = [b][b = a, 0]; 

Vamos a romper la última línea en pedazos:

[b]  // Puts b in an array - a safe place for the swap. 
[b = a] // Assign a in b 
[b = a,0] // Assign a in b and return the later expression - 0 with the comma operator. 

por lo que finalmente es a =[b][0] - el primer objeto de la matriz [b] =>b asignado a a

Live DEMO

lee @am no, estoy en la pregunta:
When is the comma operator useful?
Es su código ...

+0

Entonces, cuando 'b' se pone en la matriz, ¿es seguro? –

+1

@Derek. No se pierde cuando 'b = a' – gdoron

1

Podría ayudar (o impedir) a pensar en ella términos de la construcción lambda semánticamente equivalentes (en este caso, el parámetro c toma el lugar del elemento 0):

a = (function(c) { b = a; return c; })(b); 
Cuestiones relacionadas