Jawaban:
Berikut ini adalah satu-liner untuk menukar nilai dua variabel.
Variabel yang diberikan a
dan b
:
b = [a, a = b][0];
Demonstrasi di bawah ini:
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
kesalahan.
ES6 (Firefox dan Chrome sudah mendukungnya (Pencocokan Susunan Tugas Penentuan)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Kamu bisa melakukan ini:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Untuk keterbacaan dan pemeliharaan, ini tidak dapat dikalahkan (setidaknya dalam JavaScript). Siapa pun yang memelihara kode (termasuk Anda enam bulan dari sekarang) akan tahu persis apa yang terjadi.
Karena ini adalah bilangan bulat, Anda juga dapat menggunakan sejumlah trik pintar 1 untuk bertukar tanpa menggunakan variabel ketiga. Misalnya Anda dapat menggunakan bitor xor operator:
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);
Ini disebut algoritma swap XOR. Teori operasinya dijelaskan dalam artikel Wikipedia ini .
1 "The programmer yang kompeten sepenuhnya menyadari keterbatasan ukuran tengkorak sendiri. Karena itu ia mendekati tugasnya dengan kerendahan hati penuh, dan menghindari trik pintar seperti wabah." - Edsger W. Dijkstra
ToInt32
metode internal — lihat Bagian 11.10 dari standar ECMAScript ). Itu tidak menghasilkan hasil yang benar untuk nilai numerik non-integer. Ini juga mengkonversi nilai-nilai non-numerik ke integer 32-bit. Jika Anda mulai dengan a = "hi"
dan b = "there"
, Anda berakhir dengan a == 0
dan b == 0
.
typeof a == 'boolean'
atau a === false
, misalnya. Bilangan real bekerja, kecuali mereka didasarkan pada nol versus dibulatkan ke bilangan bulat terdekat.
Jangan gunakan kode di bawah ini. Ini bukan cara yang disarankan untuk menukar nilai dua variabel (cukup gunakan variabel sementara untuk itu). Itu hanya menunjukkan trik JavaScript.
Solusi ini tidak menggunakan variabel sementara, tidak ada array, hanya satu tambahan, dan cepat . Bahkan, kadang - kadang lebih cepat daripada variabel sementara di beberapa platform .
Ini bekerja untuk semua angka, tidak pernah meluap, dan menangani kasus tepi seperti Infinity dan NaN.
a = b + (b=a, 0)
Ini bekerja dalam dua langkah:
(b=a, 0)
set b
ke nilai a
dan hasil lama0
a = b + 0
set a
ke nilai lama darib
,
, dan telah dibungkus untuk mengatur hak yang diutamakan. Operator koma mengevaluasi kedua argumennya (dalam hal ini b=a
dan 0
) dan mengembalikan yang terakhir (dalam kasus ini 0
). Jadi di sini, ia memiliki efek menetapkan nilai baru b
ke nilai lama a
, sambil menghasilkan 0
.
Ini adalah one-liner, dengan asumsi a
dan b
sudah ada dan memiliki nilai yang perlu ditukar:
var c=a, a=b, b=c;
Seperti yang disebutkan oleh @Kay, ini sebenarnya berkinerja lebih baik daripada cara array (hampir 2x lebih cepat).
var a, b, tmp;
a = 1
:; b = 2
; tmp=a, a=b, b=tmp;
Selera pribadi.
Metode ES6 +: Sejak ES6, Anda dapat bertukar variabel dengan lebih elegan. Anda dapat menggunakan pencocokan susunan tugas penataan. Sederhana saja. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Sekarang Anda akhirnya dapat melakukan:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Anda bisa menggunakan variabel swap sementara atau XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Ini hanya konsep logis dasar dan berfungsi dalam setiap bahasa yang mendukung operasi XOR.
edit: lihat Komentar. Lupa memberi tahu bahwa ini hanya berfungsi dengan integer. Diasumsikan variabel integer dari utas pertanyaan
Anda dapat menggunakan penugasan penghancuran ES6 seperti:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Karena pertanyaan Anda berharga "Hanya variabel ini, bukan objek apa pun.", Jawabannya juga akan berharga:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
itu tipuan
Dan seperti yang dikatakan Rodrigo Assis, "bisa lebih pendek"
b=a+(a=b)-b;
ES6 Destrukturisasi:
Menggunakan array: [a, b] = [b, a]; // my favorite
Menggunakan objek: {a, b} = {a:b, b:a}; // not bad neither
Bagaimana kita bisa melewatkan oneliners klasik ini
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Dan
var a = 1, b = 2
a = (_=b,b=a,_);
Yang terakhir memperlihatkan variabel global '_' tetapi yang seharusnya tidak menjadi masalah seperti konvensi javascript biasa adalah menggunakannya sebagai variabel 'tidak peduli'.
a = (_=b,b=a,_);
_
? Mengapa tidak perlu deklarasi?
Saya melihat semacam olimpiade pemrograman di sini. Satu solusi satu-baris yang lebih rumit:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, lakukan saja b = (function (x){ return x; })(a, a=b)
.
arguments
daftar juga akan menjadi variabel.
a
untuk arguments[0]
dengan melewatkan sebagai parameter.
arguments
dan penugasannya terjadi "di belakang layar"
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);
hapus atau komentari 2 // atau dan jalankan dengan satu set kode
Kami dapat menukar var seperti ini:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
Di ES6 sekarang ada tugas penataan dan Anda dapat melakukan:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
pendekatan yang lebih verbal akan
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
Ini sangat sederhana, gunakan sintaksis susunan array ES6 yang [y, x] = [x, y]
untuk informasi lebih lanjut lihat tautan ini https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructure_assignment
Hingga ES5, untuk menukar dua angka, Anda harus membuat variabel temp dan kemudian menukarnya. Tetapi dalam ES6, sangat mudah untuk menukar dua angka menggunakan array yang merusak. Lihat contoh.
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
Karena saya mendengar metode ini berjalan lebih lambat:
b = [a, a = b][0];
Jika Anda berencana menyimpan vars di objek (atau larik), fungsi ini akan berfungsi:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Pemakaian:
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'}
Kita dapat menggunakan IIFE untuk menukar dua nilai tanpa parameter tambahan
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
Destrukturisasi array ES6 digunakan untuk menukar dua variabel. Lihat contoh
var [x,y]=[1,2];
[x,y]=[y,x];
Cara yang lebih mudah dengan:
x === 1
dan y === 2
; Tapi setelah destructuring, x
adalah y
, yaitu 2
, dan y
ini x
, yaitu 1
.
Tukar menggunakan Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Swap baris tunggal "menggunakan Array"
[a, b] = [b, a]
(fungsi (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));