Saya punya dua variabel ini:
var a = 1,
b = 2;
Pertanyaan saya adalah bagaimana cara menukar mereka? Hanya variabel ini, bukan objek apa pun.
javascript
variables
swap
Lukas
sumber
sumber
Jawaban:
Berikut ini adalah satu-liner untuk menukar nilai dua variabel.
Variabel yang diberikan
a
danb
:Demonstrasi di bawah ini:
sumber
[a, b] = [b, a];
.Invalid left-hand side in assignment
kesalahan.ES6 (Firefox dan Chrome sudah mendukungnya (Pencocokan Susunan Tugas Penentuan)):
sumber
Kamu bisa melakukan ini:
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:
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
sumber
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 dengana = "hi"
danb = "there"
, Anda berakhir dengana == 0
danb == 0
.typeof a == 'boolean'
ataua === 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.
Ini bekerja dalam dua langkah:
(b=a, 0)
setb
ke nilaia
dan hasil lama0
a = b + 0
seta
ke nilai lama darib
sumber
,
, dan telah dibungkus untuk mengatur hak yang diutamakan. Operator koma mengevaluasi kedua argumennya (dalam hal inib=a
dan0
) dan mengembalikan yang terakhir (dalam kasus ini0
). Jadi di sini, ia memiliki efek menetapkan nilai barub
ke nilai lamaa
, sambil menghasilkan0
.a = b + (b=a, "")
Sejak ES6, Anda juga dapat menukar variabel dengan lebih elegan:
sumber
Ini adalah one-liner, dengan asumsi
a
danb
sudah ada dan memiliki nilai yang perlu ditukar:Seperti yang disebutkan oleh @Kay, ini sebenarnya berkinerja lebih baik daripada cara array (hampir 2x lebih cepat).
sumber
var a, b, tmp;
a = 1
:;b = 2
;tmp=a, a=b, b=tmp;
Selera pribadi.Gunakan variabel ketiga seperti ini:
DEMO - Menggunakan variabel ketiga
sumber
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
sumber
Sekarang Anda akhirnya dapat melakukan:
sumber
Anda bisa menggunakan variabel swap sementara atau XOR.
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
sumber
Anda dapat menggunakan penugasan penghancuran ES6 seperti:
sumber
Karena pertanyaan Anda berharga "Hanya variabel ini, bukan objek apa pun.", Jawabannya juga akan berharga:
var a = 1, b = 2
itu tipuan
Dan seperti yang dikatakan Rodrigo Assis, "bisa lebih pendek"
Demo: http://jsfiddle.net/abdennour/2jJQ2/
sumber
ES6 Destrukturisasi:
Menggunakan array:
[a, b] = [b, a]; // my favorite
Menggunakan objek:
{a, b} = {a:b, b:a}; // not bad neither
sumber
Bagaimana kita bisa melewatkan oneliners klasik ini
Dan
Yang terakhir memperlihatkan variabel global '_' tetapi yang seharusnya tidak menjadi masalah seperti konvensi javascript biasa adalah menggunakannya sebagai variabel 'tidak peduli'.
sumber
a = (_=b,b=a,_);
_
? Mengapa tidak perlu deklarasi?Saya melihat semacam olimpiade pemrograman di sini. Satu solusi satu-baris yang lebih rumit:
Fiddle: http://jsfiddle.net/cherniv/4q226/
sumber
arguments
, lakukan sajab = (function (x){ return x; })(a, a=b)
.arguments
daftar juga akan menjadi variabel.a
untukarguments[0]
dengan melewatkan sebagai parameter.arguments
dan penugasannya terjadi "di belakang layar"Swapping baris tunggal
sumber
hapus atau komentari 2 // atau dan jalankan dengan satu set kode
http://jsfiddle.net/USdv8/57/
sumber
Kami dapat menukar var seperti ini:
sumber
Di ES6 sekarang ada tugas penataan dan Anda dapat melakukan:
sumber
pendekatan yang lebih verbal akan
sumber
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_assignmentsumber
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.
sumber
Karena saya mendengar metode ini berjalan lebih lambat:
Jika Anda berencana menyimpan vars di objek (atau larik), fungsi ini akan berfungsi:
Pemakaian:
sumber
Kita dapat menggunakan IIFE untuk menukar dua nilai tanpa parameter tambahan
sumber
Destrukturisasi array ES6 digunakan untuk menukar dua variabel. Lihat contoh
Cara yang lebih mudah dengan:
x === 1
dany === 2
; Tapi setelah destructuring,x
adalahy
, yaitu2
, dany
inix
, yaitu1
.sumber
Tukar menggunakan Bitwise
Swap baris tunggal "menggunakan Array"
sumber
(fungsi (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
sumber