Respostas:
Aqui está uma lista para trocar os valores de duas variáveis.
Dadas variáveis a
e b
:
b = [a, a = b][0];
Demonstração abaixo:
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
erro.
ES6 (o Firefox e o Chrome já o suportam (correspondência de matriz de atribuição de reestruturação)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Você consegue fazer isso:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Para facilitar a leitura e a manutenção, isso não pode ser melhorado (pelo menos em JavaScript). Qualquer pessoa que mantenha o código (incluindo você daqui a seis meses) saberá exatamente o que está acontecendo.
Como esses números são inteiros, você também pode usar qualquer número de truques inteligentes 1 para trocar sem usar uma terceira variável. Por exemplo, você pode usar o 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);
Isso é chamado de algoritmo de troca XOR. Sua teoria da operação é descrita neste artigo da Wikipedia .
1 "O programador competente está plenamente consciente do tamanho limitado de seu próprio crânio. Portanto, ele aborda sua tarefa com total humildade e evita truques inteligentes como a praga". - Edsger W. Dijkstra
ToInt32
método interno - consulte a Seção 11.10 do padrão ECMAScript ). Não produz os resultados corretos para valores numéricos não inteiros. Também converte valores não numéricos em números inteiros de 32 bits. Se você começa com a = "hi"
e b = "there"
, acaba com a == 0
e b == 0
.
typeof a == 'boolean'
ou a === false
, por exemplo. Os números reais funcionam, exceto que são calculados com base no zero e arredondados para o número inteiro mais próximo.
Não use o código abaixo. É não a maneira recomendada para trocar os valores das duas variáveis (simplesmente usar uma variável temporária para isso). Apenas mostra um truque de JavaScript.
Esta solução não usa variáveis temporárias, matrizes, apenas uma adição e é rápida . De fato, às vezes é mais rápido que uma variável temporária em várias plataformas .
Ele funciona para todos os números, nunca transborda e lida com casos extremos, como Infinity e NaN.
a = b + (b=a, 0)
Funciona em duas etapas:
(b=a, 0)
define b
o valor antigo de a
e produz0
a = b + 0
define a
o valor antigo deb
,
e foi moldado para definir a precedência corretamente. O operador de vírgula avalia os dois argumentos (neste caso b=a
e 0
) e retorna o último (neste caso 0
). Portanto, aqui, ele tem o efeito de definir o novo b
para o valor antigo de a
, enquanto produz 0
.
Aqui está uma linha, assumindo a
e b
já existindo e com valores que precisam ser trocados:
var c=a, a=b, b=c;
Como o @Kay mencionou, isso realmente tem um desempenho melhor que o do array (quase duas vezes mais rápido).
var a, b, tmp;
a = 1
:; b = 2
; tmp=a, a=b, b=tmp;
Gosto pessoal.
Método ES6 +: desde o ES6, você pode trocar variáveis de maneira mais elegante. Você pode usar a correspondência de matriz de atribuição de desestruturação. É simplesmente. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Agora você pode finalmente fazer:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Você pode usar uma variável de troca temporária ou XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Este é apenas um conceito lógico básico e funciona em todos os idiomas que suportam a operação XOR.
editar: veja os comentários. Esqueci de dizer que isso funciona com certeza apenas com número inteiro. Assumiu as variáveis inteiras do encadeamento da pergunta
Você pode usar a atribuição de desestruturação do ES6 da seguinte forma:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Como sua pergunta era preciosa "Somente essas variáveis, não objetos", a resposta também será preciosa:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
é um truque
E como Rodrigo Assis disse, "pode ser mais curto"
b=a+(a=b)-b;
Demonstração: http://jsfiddle.net/abdennour/2jJQ2/
ES6 Reestruturação:
Usando uma matriz: [a, b] = [b, a]; // my favorite
Usando um objeto: {a, b} = {a:b, b:a}; // not bad neither
Como poderíamos sentir falta desses oneliners clássicos
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
E
var a = 1, b = 2
a = (_=b,b=a,_);
O último expõe a variável global '_', mas isso não deve importar como convenção javascript típica é usá-lo como variável 'não se importe'.
a = (_=b,b=a,_);
_
? Por que não precisa de declaração?
Eu vejo o tipo de programação olímpica aqui. Mais uma solução complicada de uma linha:
b = (function(){ a=b; return arguments[0]; })(a);
Violino: http://jsfiddle.net/cherniv/4q226/
arguments
, basta fazer b = (function (x){ return x; })(a, a=b)
.
arguments
lista também seria uma variável.
a
a arguments[0]
isso passando-o como um parâmetro.
arguments
e a sua atribuição acontece "nos bastidores"
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);
remova ou comente os 2 // ou's e execute com o conjunto de códigos
Podemos trocar var assim:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
Agora, no ES6, existe uma atribuição de desestruturação e você pode:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
uma abordagem mais detalhada seria
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
É muito simples, use a sintaxe de destruição de matriz do ES6, que é [y, x] = [x, y]
para obter mais informações, consulte este link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Até o ES5, para trocar dois números, você deve criar uma variável temporária e depois trocá-la. Mas no ES6, é muito fácil trocar dois números usando a desestruturação da matriz. Consultar exemplo.
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 eu ouvi dizer que esse método é mais lento:
b = [a, a = b][0];
Se você planeja armazenar seus vars em um objeto (ou matriz), esta função deve 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 o IIFE para trocar dois valores sem parâmetro extra
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
A desestruturação do array ES6 é usada para trocar duas variáveis. consultar exemplo
var [x,y]=[1,2];
[x,y]=[y,x];
Maneira mais fácil possível com:
x === 1
e y === 2
; Mas após a desestruturação, x
é y
, ie 2
, e y
é x
, ie 1
.
Troque usando o Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Troca de linha única "usando matriz"
[a, b] = [b, a]
(função (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));