Tengo estas dos variables:
var a = 1,
b = 2;
Mi pregunta es cómo intercambiarlos? Solo estas variables, no ningún objeto.
javascript
variables
swap
Lukas
fuente
fuente
Respuestas:
Aquí hay una línea para intercambiar los valores de dos variables.
Variables dadas
a
yb
:Demostración a continuación:
fuente
[a, b] = [b, a];
.Invalid left-hand side in assignment
error.ES6 (Firefox y Chrome ya lo admiten (Destructuring Assignment Array Matching)):
fuente
Puedes hacerlo:
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:
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
fuente
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 cona = "hi"
yb = "there"
, terminas cona == 0
yb == 0
.typeof a == 'boolean'
oa === 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.
Funciona en dos pasos:
(b=a, 0)
estableceb
el valor anterior dea
y rinde0
a = b + 0
establecea
el valor anterior deb
fuente
,
, y se ha ajustado para establecer la prioridad correcta. El operador de coma evalúa sus dos argumentos (en este casob=a
y0
) y devuelve el último (en este caso0
). Entonces, aquí tiene el efecto de establecer lo nuevob
en el valor anterior dea
, al tiempo que cede0
.a = b + (b=a, "")
Desde ES6, también puede intercambiar variables de manera más elegante:
fuente
Aquí hay una sola línea, asumiendo
a
yb
ya existen y tienen valores que necesitan ser intercambiado:Como @Kay mencionó, esto realmente funciona mejor que la forma de matriz (casi 2 veces más rápido).
fuente
var a, b, tmp;
a = 1
;b = 2
;tmp=a, a=b, b=tmp;
Gusto personal.Use una tercera variable como esta:
DEMO - Usando una tercera variable
fuente
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
fuente
Ahora puedes finalmente hacer:
fuente
Puede usar una variable de intercambio temporal o XOR.
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
fuente
Puede usar la asignación de desestructuración de ES6 de esta manera:
fuente
Como su pregunta era preciosa "Solo estas variables, no ningún objeto", la respuesta también será preciosa:
var a = 1, b = 2
es un truco
Y como dijo Rodrigo Assis, "puede ser más corto"
Demostración: http://jsfiddle.net/abdennour/2jJQ2/
fuente
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
fuente
¿Cómo podríamos perder estos clásicos de línea?
Y
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'.
fuente
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:
Violín: http://jsfiddle.net/cherniv/4q226/
fuente
arguments
, solo hazlob = (function (x){ return x; })(a, a=b)
.arguments
lista también sería una variable.a
aarguments[0]
pasándolo como parámetro.arguments
y su asignación ocurre "detrás de escena"Intercambio de una línea
fuente
eliminar o comentar los 2 // o y ejecutar con un conjunto de código
http://jsfiddle.net/USdv8/57/
fuente
Podemos intercambiar var así:
fuente
En ES6 ahora hay una tarea de desestructuración y puedes hacer:
fuente
un enfoque más detallado sería
fuente
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_assignmentfuente
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.
fuente
Porque escuché que este método funciona más lento:
Si planea almacenar sus variables en un objeto (o matriz), esta función debería funcionar:
Uso:
fuente
Podemos usar el IIFE para intercambiar dos valores sin parámetro adicional
fuente
La desestructuración de la matriz ES6 se utiliza para intercambiar dos variables. Ver ejemplo
La forma más fácil posible con:
x === 1
yy === 2
; Pero después de la desestructuración,x
es , esy
decir2
, yy
esx
, es decir1
.fuente
Cambiar usando Bitwise
Intercambio de una sola línea "con matriz"
fuente
(función (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
fuente