我有这两个变量:
var a = 1,
b = 2;
我的问题是如何交换呢? 只有这个变量,而不是任何对象。
我有这两个变量:
var a = 1,
b = 2;
我的问题是如何交换呢? 只有这个变量,而不是任何对象。
这里有一个一行交换两个变量的值。
b = [a, a = b][0];
片段:
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>
ES6(Firefox和Chrome已经支持它(解构赋值矩阵匹配)):
let a = 5, b = 6; [a, b] = [b, a]; console.log(`${a} ${b}`);
你可以这样做:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
对于可读性和可维护性,这不能(在JavaScript中至少)击败。 任何人维护代码(包括你从现在起半年)就会知道到底发生了什么事情。
由于这些都是整数,你也可以使用任意数量的聪明的技巧1至互换,而无需使用第三个变量。 例如,您可以使用按位异或运算符:
var a = 1,
b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
这就是所谓的XOR交换算法。 它的工作原理中描述这个维基百科文章 。
1“的能力的程序员是完全知道自己的头骨大小的限制。因此,他接近他的任务具有完全谦卑,避免像瘟疫一样聪明的技巧。” - 艾兹赫尔·戴克斯特拉
不要使用下面的代码。 这是不交换两个变量的值的推荐的方法(简单地用一个临时变量为)。 它只是显示了一个JavaScript的伎俩。
该解决方案不使用临时变量,没有数组,只有一此外,它的速度快 。 事实上,这是有时比一个临时变量在几个平台更快 。
它适用于所有的数字,从来没有溢出,并处理边缘情况下,如无限大和NaN。
a = b + (b=a, 0)
它工作在两个步骤:
(b=a, 0)
设定b
到的旧值a
与产率0
a = b + 0
套a
到的旧值b
这里有一个一行,假设a
和b
已经存在,并且具有值需要被交换:
var c=a, a=b, b=c;
如@Kay提到的,这实际上执行大于阵列方式(几乎2倍的速度) 更好 。
由于ES6,你也可以交换变量更优雅:
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1
使用这样的第三个变量:
var a = 1,
b = 2,
c = a;
a = b; // must be first or a and b end up being both 1
b = c;
DEMO -使用第三个变量
你可以使用一个临时交换变量或XOR。
a = a ^ b
b = a ^ b
a = a ^ b
这仅仅是一个基本的逻辑概念,并在支持XOR操作的每一种语言的作品。
编辑:看到评论。 忘了告诉大家,这个工程肯定只能用整数。 假设从问题的线程的整数变量
ES6 +方法:由于ES6,你可以换变量更优雅。 你可以用解构赋值阵列匹配。 这是简单的。 VAR A = 10 B = 20;
[A,B] = [B,A]
的console.log(A,B)// 20 10
至于你的问题是珍贵的。“仅此变量,而不是任何对象”,答案也将珍贵的:
有A = 1,B = 2
a=a+b;
b=a-b;
a=a-b;
这是一招
随着罗德里戈阿西斯说,它“可以短”
b=a+(a=b)-b;
演示: http://jsfiddle.net/abdennour/2jJQ2/
现在,您终于可以这样做:
var a = 5; var b = 10; [a, b] = [b, a]; // ES6 console.log(a, b);
ES6解构:
使用阵列: [a, b] = [b, a]; // my favorite
[a, b] = [b, a]; // my favorite
使用对象{a, b} = {a:b, b:a}; // not bad neither
{a, b} = {a:b, b:a}; // not bad neither
我们怎么能错过这些经典oneliners
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
和
var a = 1, b = 2
a = (_=b,b=a,_);
最后一个公开的全局变量“_”,但作为典型的JavaScript的惯例是把它作为“不关心”的变量,不应该的问题。
单行交换
a = a^b^(b^=(a^b));
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);
删除或注释2家//或公司,并与一组代码运行
http://jsfiddle.net/USdv8/57/
在ES6现在有解构赋值,你可以这样做:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
我看到那种这里编程竞赛。 还有一个棘手的一个在线的解决方案:
b = (function(){ a=b; return arguments[0]; })(a);
小提琴: http://jsfiddle.net/cherniv/4q226/
我们能够交换VAR是这样的:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
let a = 2, b = 4;
[b, a] = [a, b];
一个更详细的方法是
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
这是非常简单的,使用ES6阵列解构语法其是[y, x] = [x, y]
以获取更多信息请参阅本链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /运营/ Destructuring_assignment
(功能(A,B){B = A; A = B;})(parseInt函数(a)中,parseInt函数(B));