Câu trả lời:
Đây là một lớp lót để trao đổi các giá trị của hai biến.
Các biến đã cho a
và b
:
b = [a, a = b][0];
Trình diễn dưới đây:
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
báo lỗi.
ES6 (Firefox và Chrome đã hỗ trợ nó (Kết hợp mảng phân công chuyển nhượng)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Bạn có thể làm được việc này:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Để dễ đọc và duy trì, điều này không thể đánh bại (ít nhất là trong JavaScript). Bất cứ ai duy trì mã (bao gồm cả bạn sáu tháng kể từ bây giờ) sẽ biết chính xác những gì đang diễn ra.
Vì đây là các số nguyên, bạn cũng có thể sử dụng bất kỳ số mẹo thông minh 1 nào để trao đổi mà không cần sử dụng biến thứ ba. Chẳng hạn, bạn có thể sử dụng toán tử xwise bitwise:
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);
Đây được gọi là thuật toán hoán đổi XOR. Lý thuyết hoạt động của nó được mô tả trong bài viết Wikipedia này .
1 "Lập trình viên có năng lực nhận thức đầy đủ về kích thước hạn chế của hộp sọ của chính anh ta. Do đó, anh ta tiếp cận nhiệm vụ của mình với sự khiêm tốn hoàn toàn, và tránh các thủ thuật thông minh như bệnh dịch hạch." - Edsger W. Dijkstra
ToInt32
phương thức bên trong, xem phần 11.10 của tiêu chuẩn ECMAScript ). Nó không tạo ra kết quả chính xác cho các giá trị số không nguyên. Nó cũng chuyển đổi các giá trị không số thành số nguyên 32 bit. Nếu bạn bắt đầu với a = "hi"
và b = "there"
, bạn kết thúc với a == 0
và b == 0
.
typeof a == 'boolean'
hoặc a === false
, ví dụ. Các số thực hoạt động, ngoại trừ chúng trôi về 0 so với làm tròn đến số nguyên gần nhất.
Đừng sử dụng mã dưới đây. Đây không phải là cách được đề xuất để trao đổi giá trị của hai biến (chỉ cần sử dụng biến tạm thời cho điều đó). Nó chỉ hiển thị một thủ thuật JavaScript.
Giải pháp này không sử dụng biến tạm thời, không mảng, chỉ một bổ sung và nhanh chóng . Trong thực tế, đôi khi nó nhanh hơn một biến tạm thời trên một số nền tảng .
Nó hoạt động cho tất cả các số, không bao giờ tràn và xử lý các trường hợp cạnh như Infinity và NaN.
a = b + (b=a, 0)
Nó hoạt động theo hai bước:
(b=a, 0)
thiết lập b
giá trị cũ của a
và sản lượng0
a = b + 0
đặt a
thành giá trị cũ củab
,
và nó đã được gói để đặt quyền ưu tiên. Toán tử dấu phẩy đánh giá cả hai đối số của nó (trong trường hợp này b=a
và 0
) và trả về cuối cùng (trong trường hợp này 0
). Vì vậy, ở đây, nó có tác dụng thiết lập cái mới b
thành giá trị cũ của a
, trong khi mang lại 0
.
Đây là một lớp lót, giả sử a
và b
tồn tại và có các giá trị cần được hoán đổi:
var c=a, a=b, b=c;
Như @Kay đã đề cập, điều này thực sự hoạt động tốt hơn so với cách mảng (gần gấp đôi tốc độ).
var a, b, tmp;
a = 1
; b = 2
; tmp=a, a=b, b=tmp;
Sở thích cá nhân.
Phương pháp ES6 +: Kể từ ES6, bạn có thể trao đổi các biến thanh lịch hơn. Bạn có thể sử dụng hủy kết hợp mảng gán. Nó đơn giản. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Bây giờ bạn cuối cùng cũng có thể làm:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Bạn có thể sử dụng biến trao đổi tạm thời hoặc XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Đây chỉ là một khái niệm logic cơ bản và hoạt động trong mọi ngôn ngữ hỗ trợ hoạt động XOR.
chỉnh sửa: xem các bình luận. Quên nói rằng điều này chỉ hoạt động với số nguyên. Giả sử các biến số nguyên từ chuỗi câu hỏi
Bạn có thể sử dụng phép gán hủy ES6 như vậy:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Vì câu hỏi của bạn rất quý giá "Chỉ có các biến này, không phải bất kỳ đối tượng nào.", Câu trả lời cũng sẽ rất quý giá:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
đó là một mánh khóe
Và như Rodrigo Assis đã nói, nó "có thể ngắn hơn"
b=a+(a=b)-b;
Bản trình diễn: http://jsfiddle.net/abdennour/2jJQ2/
Phá hủy ES6:
Sử dụng một mảng: [a, b] = [b, a]; // my favorite
Sử dụng một đối tượng: {a, b} = {a:b, b:a}; // not bad neither
Làm thế nào chúng ta có thể bỏ lỡ những oneliners cổ điển
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Và
var a = 1, b = 2
a = (_=b,b=a,_);
Cái cuối cùng phơi bày biến toàn cục '_' nhưng điều đó không quan trọng vì quy ước javascript thông thường là sử dụng biến đó là biến 'không quan tâm'.
a = (_=b,b=a,_);
_
có nghĩa là gì? Tại sao nó không cần khai báo?
Tôi thấy loại lập trình olympiad ở đây. Thêm một giải pháp một dòng khó khăn nữa:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, chỉ cần làm b = (function (x){ return x; })(a, a=b)
.
arguments
danh sách cũng sẽ là một biến.
a
đến arguments[0]
bằng cách đi qua nó như một tham số.
arguments
và sự phân công của nó xảy ra "đằng sau hậu trường"
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);
xóa hoặc nhận xét 2 // hoặc của và chạy với một bộ mã
Chúng tôi có thể trao đổi var như thế này:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
Trong ES6 bây giờ có phân công phá hủy và bạn có thể làm:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
một cách tiếp cận dài dòng hơn sẽ là
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
Rất đơn giản, hãy sử dụng cú pháp phá hủy mảng ES6[y, x] = [x, y]
để biết thêm thông tin tham khảo liên kết này https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Desturationuring_assocate
Cho đến ES5, để hoán đổi hai số, bạn phải tạo một biến tạm thời và sau đó trao đổi nó. Nhưng trong ES6, rất dễ dàng để hoán đổi hai số bằng cách sử dụng tính năng phá hủy mảng. Xem ví dụ.
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
Bởi vì tôi nghe thấy phương pháp này chạy chậm hơn:
b = [a, a = b][0];
Nếu bạn có kế hoạch lưu trữ các vars của bạn trong một đối tượng (hoặc mảng), chức năng này sẽ hoạt động:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Sử dụng:
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'}
Chúng ta có thể sử dụng IIFE để trao đổi hai giá trị mà không cần thêm tham số
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
Phá hủy mảng ES6 được sử dụng để trao đổi hai biến. Xem ví dụ
var [x,y]=[1,2];
[x,y]=[y,x];
Cách dễ dàng hơn có thể với:
x === 1
và y === 2
; Nhưng sau destructuring, x
là y
, ví dụ 2
, và y
là x
, tức là 1
.
Trao đổi bằng Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Hoán đổi dòng đơn "bằng cách sử dụng Mảng"
[a, b] = [b, a]
(hàm (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));