我有这两个变量:
var a = 1,
b = 2;
我的问题是如何交换它们?仅限这些变量,而不是任何对象。
我有这两个变量:
var a = 1,
b = 2;
我的问题是如何交换它们?仅限这些变量,而不是任何对象。
以下是将两个变量的值交换的一行代码。
给定变量a
和b
:
b = [a, a = b][0];
下面是演示:
var a=1,
b=2,
output=document.getElementById('output');
output.innerHTML="<p>Original: "+a+", "+b+"</p>";
// swap values for variables "a" and "b"
b = [a, a = b][0];
output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>
[a, b] = [b, a];
。意思与原文相同,只是表述更加通俗易懂。 - dfsqInvalid left-hand side in assignment
错误。 - NopeES6(Firefox和Chrome已支持它(Destructuring Assignment Array Matching)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
[a, b] = [b, a]
之前的行中省略了;
,那么这里有一个陷阱:JS会做一些奇怪的事情™,可能是因为它与前一行合并为数组/对象索引或类似的东西。 - Martin Tournoij您可以这样做:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
为了提高可读性和可维护性,这是无与伦比的(至少在 JavaScript 中是如此)。任何维护代码的人(包括六个月后的您)都会清楚地知道正在发生什么。
由于这些是整数,您还可以使用许多巧妙的技巧1来在不使用第三个变量的情况下进行交换。例如,您可以使用按位异或运算符:
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);
这被称为XOR交换算法。它的操作理论在这篇维基百科文章中有描述。
1"优秀的程序员完全意识到自己头脑的局限性。因此,他们以充分的谦虚态度来完成任务,并避免像瘟疫一样的聪明技巧。" — Edsger W. Dijkstra
ToInt32
内部方法进行转换——请参见ECMAScript标准第11.10节)。它不能正确处理非整数数字值,并将非数字值转换为32位整数。如果你从 a = "hi"
和 b = "there"
开始,最终结果是 a == 0
和 b == 0
。 - Ted Hopptypeof a == 'boolean'
或 a === false
等方式进行判断。实数也可以工作,但它们向零取整而不是四舍五入到最近的整数。 - Beejor,
”,它被括起来以调整优先级。逗号运算符会评估它的两个参数(在这种情况下是b=a
和0
),并返回最后一个(在这种情况下是0
)。因此,在这里,它的作用是将新的b
设置为旧的a
值,同时返回0
。 - Ruben Verborgha = b + (b=a, "")
- user1106925现在你终于可以做到:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1
假设a
和b
已经存在并且需要交换值,这是一个一行代码的解决办法:
var c=a, a=b, b=c;
正如 @Kay 提到的那样,这种方法比数组方式表现得更好(快近 2 倍)。
var a,b,tmp;
a = 1
;b = 2
;tmp=a,a=b,b=tmp;
个人口味。 - Johnny Wong你可以使用一个临时交换变量或异或操作。
a = a ^ b
b = a ^ b
a = a ^ b
这只是一个基本的逻辑概念,在支持异或运算的每种语言中都可以使用。
编辑:请参见评论。我忘了告诉大家,这仅适用于整数。假设来自问题线程的整数变量。
使用第三个变量如下:
var a = 1,
b = 2,
c = a;
a = b; // must be first or a and b end up being both 1
b = c;
演示 - 使用第三个变量
a=a+b;
b=a-b;
a=a-b;
这是一个技巧
正如Rodrigo Assis所说,它“可以更短”
b=a+(a=b)-b;