Respuestas:
Aquí hay una línea para intercambiar los valores de dos variables.
Variables dadas a
y b
:
b = [a, a = b][0];
Demostración a continuación:
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>
[a, b] = [b, a];
.
Invalid left-hand side in assignment
error.
ES6 (Firefox y Chrome ya lo admiten (Destructuring Assignment Array Matching)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Puedes hacerlo:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Para facilitar la lectura y la mantenibilidad, esto no puede ser mejor (al menos en JavaScript). Cualquiera que mantenga el código (incluido usted dentro de seis meses) sabrá exactamente lo que está sucediendo.
Dado que estos son enteros, también puede usar cualquier número de trucos inteligentes 1 para intercambiar sin usar una tercera variable. Por ejemplo, puede usar el operador xor bit a bit:
let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);
Esto se llama 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
ToInt32
método interno; consulte la Sección 11.10 del estándar ECMAScript ). No produce los resultados correctos para valores numéricos no enteros. También convierte valores no numéricos en enteros de 32 bits. Si comienzas con a = "hi"
y b = "there"
, terminas con a == 0
y b == 0
.
typeof a == 'boolean'
o a === false
, por ejemplo. Los números reales funcionan, excepto que se mueven hacia cero frente a redondeados al entero más cercano.
No use el código a continuación. Es no la forma recomendada para intercambiar los valores de dos variables (simplemente utilizar una variable temporal para eso). Simplemente muestra un truco de JavaScript.
Esta solución no utiliza variables temporales, ni matrices, solo una adición, y es rápida . De hecho, a veces es más rápido que una variable temporal en varias plataformas .
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
el valor anterior de a
y rinde0
a = b + 0
establece a
el valor anterior deb
,
, y se ha ajustado para establecer la prioridad correcta. El operador de coma evalúa sus dos argumentos (en este caso b=a
y 0
) y devuelve el último (en este caso 0
). Entonces, aquí tiene el efecto de establecer lo nuevo b
en el valor anterior de a
, al tiempo que cede 0
.
Aquí hay una sola línea, asumiendo a
y b
ya existen y tienen valores que necesitan ser intercambiado:
var c=a, a=b, b=c;
Como @Kay mencionó, esto realmente funciona mejor que la forma de matriz (casi 2 veces más rápido).
var a, b, tmp;
a = 1
; b = 2
; tmp=a, a=b, b=tmp;
Gusto personal.
Método ES6 +: desde ES6, puede intercambiar variables de manera más elegante. Puede usar la desestructuración de la asignación de matriz de asignación. Es simplemente. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Ahora puedes finalmente hacer:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Puede 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. Olvidé decir que esto funciona con seguridad solo con un entero. Asumimos las variables enteras del hilo de la pregunta
Puede usar la asignación de desestructuración de ES6 de esta manera:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Como su pregunta era preciosa "Solo estas variables, no ningún 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/
Desestructuración de ES6:
Usando una matriz: [a, b] = [b, a]; // my favorite
Usando un objeto: {a, b} = {a:b, b:a}; // not bad neither
¿Cómo podríamos perder estos clásicos de línea?
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Y
var a = 1, b = 2
a = (_=b,b=a,_);
La última expone la variable global '_', pero eso no debería importar, ya que la convención típica de JavaScript es usarla como variable 'no importa'.
a = (_=b,b=a,_);
_
? ¿Por qué no necesita declaración?
Veo una especie de olimpiada de programación aquí. Una solución más complicada de una línea:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, solo hazlo b = (function (x){ return x; })(a, a=b)
.
arguments
lista también sería una variable.
a
a arguments[0]
pasándolo como parámetro.
arguments
y su asignación ocurre "detrás de escena"
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 // o y ejecutar con un conjunto de código
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);
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
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];
Es muy simple, use la sintaxis de desestructuración de la matriz ES6 que es [y, x] = [x, y]
para más información consulte este enlace https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Hasta ES5, para intercambiar dos números, debe crear una variable temporal y luego intercambiarla. Pero en ES6, es muy fácil intercambiar dos números usando la desestructuración de matrices. Ver ejemplo.
let x,y;
[x,y]=[2,3];
console.log(x,y); // return 2,3
[x,y]=[y,x];
console.log(x,y); // return 3,2
Porque escuché que este método funciona más lento:
b = [a, a = b][0];
Si planea almacenar sus variables en un objeto (o matriz), esta función debería funcionar:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Uso:
let test = {a: 'test 1', b: 'test 2'};
console.log(test); //output: {a: 'test 1', b: 'test 2'}
swapVars(test, 'a', 'b');
console.log(test); //output: {a: 'test 2', b: 'test 1'}
Podemos usar el IIFE para intercambiar dos valores sin parámetro adicional
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
La desestructuración de la matriz ES6 se utiliza para intercambiar dos variables. Ver ejemplo
var [x,y]=[1,2];
[x,y]=[y,x];
La forma más fácil posible con:
x === 1
y y === 2
; Pero después de la desestructuración, x
es , es y
decir 2
, y y
es x
, es decir 1
.
Cambiar usando Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Intercambio de una sola línea "con matriz"
[a, b] = [b, a]
(función (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));