Eu tenho essas duas variáveis:
var a = 1,
b = 2;
Minha pergunta é como trocá-los? Somente essas variáveis, não quaisquer objetos.
javascript
variables
swap
Lukas
fonte
fonte
Respostas:
Aqui está uma lista para trocar os valores de duas variáveis.
Dadas variáveis
a
eb
:Demonstração abaixo:
fonte
[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)):
fonte
Você consegue fazer isso:
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:
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
fonte
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 coma = "hi"
eb = "there"
, acaba coma == 0
eb == 0
.typeof a == 'boolean'
oua === 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.
Funciona em duas etapas:
(b=a, 0)
defineb
o valor antigo dea
e produz0
a = b + 0
definea
o valor antigo deb
fonte
,
e foi moldado para definir a precedência corretamente. O operador de vírgula avalia os dois argumentos (neste casob=a
e0
) e retorna o último (neste caso0
). Portanto, aqui, ele tem o efeito de definir o novob
para o valor antigo dea
, enquanto produz0
.a = b + (b=a, "")
Desde o ES6, você também pode trocar variáveis de maneira mais elegante:
fonte
Aqui está uma linha, assumindo
a
eb
já existindo e com valores que precisam ser trocados:Como o @Kay mencionou, isso realmente tem um desempenho melhor que o do array (quase duas vezes mais rápido).
fonte
var a, b, tmp;
a = 1
:;b = 2
;tmp=a, a=b, b=tmp;
Gosto pessoal.Use uma terceira variável como esta:
DEMO - Usando uma terceira variável
fonte
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
fonte
Agora você pode finalmente fazer:
fonte
Você pode usar uma variável de troca temporária ou XOR.
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
fonte
Você pode usar a atribuição de desestruturação do ES6 da seguinte forma:
fonte
Como sua pergunta era preciosa "Somente essas variáveis, não objetos", a resposta também será preciosa:
var a = 1, b = 2
é um truque
E como Rodrigo Assis disse, "pode ser mais curto"
Demonstração: http://jsfiddle.net/abdennour/2jJQ2/
fonte
ES6 Reestruturação:
Usando uma matriz:
[a, b] = [b, a]; // my favorite
Usando um objeto:
{a, b} = {a:b, b:a}; // not bad neither
fonte
Como poderíamos sentir falta desses oneliners clássicos
E
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'.
fonte
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:
Violino: http://jsfiddle.net/cherniv/4q226/
fonte
arguments
, basta fazerb = (function (x){ return x; })(a, a=b)
.arguments
lista também seria uma variável.a
aarguments[0]
isso passando-o como um parâmetro.arguments
e a sua atribuição acontece "nos bastidores"Troca de linha única
fonte
remova ou comente os 2 // ou's e execute com o conjunto de códigos
http://jsfiddle.net/USdv8/57/
fonte
Podemos trocar var assim:
fonte
Agora, no ES6, existe uma atribuição de desestruturação e você pode:
fonte
uma abordagem mais detalhada seria
fonte
É 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_assignmentfonte
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.
fonte
Porque eu ouvi dizer que esse método é mais lento:
Se você planeja armazenar seus vars em um objeto (ou matriz), esta função deve funcionar:
Uso:
fonte
Podemos usar o IIFE para trocar dois valores sem parâmetro extra
fonte
A desestruturação do array ES6 é usada para trocar duas variáveis. consultar exemplo
Maneira mais fácil possível com:
x === 1
ey === 2
; Mas após a desestruturação,x
éy
, ie2
, ey
éx
, ie1
.fonte
Troque usando o Bitwise
Troca de linha única "usando matriz"
fonte
(função (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
fonte