javascript variables swap

function swap javascript



Cómo intercambiar dos variables en JavaScript (19)

Tengo estas dos variables:

var a = 1, b = 2;

Mi pregunta es cómo cambiarlos? Solo estas variables, no cualquier objeto.


¿Cómo podríamos extrañar a estos clásicos onelineros?

var a = 1, b = 2 a = ({a:b, _:(b=a)}).a;

Y

var a = 1, b = 2 a = (_=b,b=a,_);

El último expone la variable global ''_'', pero eso no debería importar ya que la convención típica de javascript es usarlo como una variable ''no importa''.


(función (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));


Ahora puedes finalmente hacer:

var a = 5; var b = 10; [a, b] = [b, a]; // ES6 console.log(a, b);


Aquí hay una línea para intercambiar los valores de dos variables.

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

Retazo:

var a=1, b=2, output=document.getElementById(''output''); output.innerHTML="<p>Original: "+a+", "+b+"</p>"; b = [a, a = b][0]; output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";

<div id="output"></div>


Aquí hay una línea, suponiendo que a y b ya existen y tienen que intercambiarse valores:

var c=a, a=b, b=c;

Como @Kay mencionó, esto en realidad funciona mejor que la matriz (casi 2 veces más rápido).


Cambio de una sola línea

a = a^b^(b^=(a^b));


Como su pregunta era preciosa "Solo estas variables, no cualquier objeto", la respuesta también será preciosa:

var a = 1, b = 2

a=a+b; b=a-b; a=a-b;

es un truco

Y como dijo Rodrigo Assis, "puede ser más corto"

b=a+(a=b)-b;

Demostración: http://jsfiddle.net/abdennour/2jJQ2/


Desde ES6, también puede intercambiar variables de forma más elegante:

var a = 1, b = 2; [a, b] = [b, a]; console.log(''a:'', a, ''b:'', b); // a: 2 b: 1


ES6 (Firefox y Chrome ya lo admiten (Destructuring Assignment Array Matching)):

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


En ES6 ahora hay una tarea de desestructuración y puedes hacer:

let a = 1; let b = 2; [b, a] = [a, b] // a = 2, b = 1


Podemos intercambiar var así:

var val1 = 117, val2 = 327; val2 = val1-val2; console.log(val2); val1 = val1-val2; console.log(val1); val2 = val1+val2; console.log(val2);


Podría usar una variable de intercambio temporal o XOR.

a = a ^ b b = a ^ b a = a ^ b

Este es solo un concepto lógico básico y funciona en todos los idiomas que admiten la operación XOR.

editar: ver los comentarios. Se olvidó de decir que esto solo funciona con un entero. Asumió las variables enteras del hilo de la pregunta


Puedes hacerlo:

var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp;

Para legibilidad y mantenibilidad, esto no puede ser mejor (al menos en JavaScript). Cualquiera que mantenga el código (incluyéndolo dentro de seis meses) sabrá exactamente qué está pasando.

Dado que estos son enteros, también puede usar cualquier número de trucos inteligentes 1 para intercambiar sin utilizar una tercera variable. Por ejemplo, puede usar el operador xor bit a bit:

var a = 1, b = 2; a = a ^ b; b = a ^ b; a = a ^ b;

Esto se llama el algoritmo de intercambio XOR. Su teoría de funcionamiento se describe en este artículo de Wikipedia .

1 "El programador competente es plenamente consciente del tamaño limitado de su propio cráneo. Por lo tanto, aborda su tarea con total humildad y evita trucos ingeniosos como la peste". - Edsger W. Dijkstra


Usa una tercera variable como esta:

var a = 1, b = 2, c = a; a = b; // must be first or a and b end up being both 1 b = c;

DEMO - Utilizando una tercera variable


Veo una especie de olimpíada de programación aquí. Una solución más complicada de una sola línea:

b = (function(){ a=b; return arguments[0]; })(a);

Fiddle: http://jsfiddle.net/cherniv/4q226/


Destrucción de ES6:

Usando una matriz: [a, b] = [b, a]; // my favorite [a, b] = [b, a]; // my favorite

Usando un objeto: {a, b} = {a:b, b:a}; // not bad neither {a, b} = {a:b, b:a}; // not bad neither


No use el código a continuación. No es la forma recomendada de intercambiar los valores de dos variables (simplemente use una variable temporal para eso). Simplemente muestra un truco de JavaScript.

Esta solución no usa variables temporales, ni arreglos, solo una adición, y es fast . De hecho, a fast es fast .
Funciona para todos los números, nunca se desborda y maneja casos extremos como Infinity y NaN.

a = b + (b=a, 0)

Funciona en dos pasos:

  • (b=a, 0) establece b al valor anterior de a y arroja 0
  • a = b + 0 establece a a valor anterior de b

let a = 2, b = 4; [b, a] = [a, b];

un enfoque más detallado sería

let a = 2, b = 4; a = [a, b]; b = a[0]; a = a[1];


var a = 5; var b = 10; b = [a, a = b][0]; //or b = [a, a = b]; b = b[0]; //or b = [a, b]; a = b[1]; b = b[0]; alert("a=" + a + '','' + "b=" + b);

eliminar o comentar los 2 // or''s y ejecutar con un conjunto de códigos

http://jsfiddle.net/USdv8/57/