Answers:
这是交换两个变量的值的单行代码。
给定变量a
和b
:
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>
[a, b] = [b, a];
。
Invalid left-hand side in assignment
。
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进行交换,而无需使用第三个变量。例如,您可以使用按位xor运算符:
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
。
typeof a == 'boolean'
或a === false
。实数有效,只不过它们的底数是零而不是四舍五入到最接近的整数。
不要使用下面的代码。这是不交换两个变量的值是推荐的方式(简单地用一个临时变量为)。它只是显示了一个JavaScript技巧。
该解决方案不使用临时变量,不使用数组,仅使用一个加法,并且速度很快。实际上,有时它比几个平台上的临时变量要快。
它适用于所有数字,永不溢出,并处理诸如Infinity和NaN之类的边缘情况。
a = b + (b=a, 0)
它分两个步骤工作:
(b=a, 0)
套b
到旧的价值a
和收益率0
a = b + 0
设置a
为的旧值b
,
,并且已经包装好以设置优先权。逗号运算符在它的两个参数(在这种情况下,b=a
和0
),并返回最后一个(在这种情况下0
)。因此,在这里,它的作用是将新b
值设置为的旧值a
,同时产生0
。
ES6 +方法:从ES6开始,您可以更优雅地交换变量。您可以使用解构分配数组匹配。很简单 var a = 10 b = 20;
[a,b] = [b,a]
console.log(a,b)// 20 10
您可以使用临时交换变量或XOR。
a = a ^ b
b = a ^ b
a = a ^ b
这只是一个基本的逻辑概念,并且可以在支持XOR操作的每种语言中使用。
编辑:请参阅注释。忘了告诉我们这只能在整数时有效。假设来自问题线程的整数变量
您可以使用ES6 解构分配,如下所示:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
由于您的问题很宝贵,“只有这个变量,没有任何对象。”,答案也很重要:
var a = 1,b = 2
a=a+b;
b=a-b;
a=a-b;
这是一招
而作为罗德里戈阿西斯说,它“可以短”
b=a+(a=b)-b;
ES6解构:
使用数组: [a, b] = [b, a]; // my favorite
使用对象: {a, b} = {a:b, b:a}; // not bad neither
我们怎么会错过这些经典的单线客
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
和
var a = 1, b = 2
a = (_=b,b=a,_);
最后一个公开了全局变量“ _”,但这并不重要,因为典型的javascript约定是将其用作“ dont care”变量。
a = (_=b,b=a,_);
_
是什么意思?为什么不需要声明?
我在这里看到一种编程奥林匹克。一种更棘手的单行解决方案:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
,就做b = (function (x){ return x; })(a, a=b)
。
arguments
列表也将是一个变量。
a
可以arguments[0]
通过将其作为参数传递给它。
arguments
并且其分配发生在“幕后”
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个“或”并使用一组代码运行
我们可以像这样交换var:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
在ES6中,现在有解构分配,您可以执行以下操作:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
这很简单,请使用ES6数组解构语法,[y, x] = [x, y]
有关更多信息,请参阅此链接https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
直到ES5,要交换两个数字,您必须创建一个temp变量,然后交换它。但是在ES6中,使用数组解构很容易交换两个数字。参见示例。
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 = [a, a = b][0];
如果您计划将var存储在对象(或数组)中,则此函数应该起作用:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
用法:
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'}
ES6数组解构用于交换两个变量。看例子
var [x,y]=[1,2];
[x,y]=[y,x];
使用以下更简单的方法:
x === 1
和y === 2
; 但拆解后,x
是y
的,即2
,和y
为x
,即1
。
(function(A,B){b = A; a = B;})(parseInt(a),parseInt(b));