답변:
다음은 두 변수의 값을 바꾸는 하나의 라이너입니다.
주어진 변수 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
오류가 발생 하여 ECMAScript 6 버전을 테스트 할 수 없었습니다 .
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에서는 이길 수 없습니다. 6 개월 후부터 코드를 유지 관리하는 사람이라면 무슨 일이 일어나고 있는지 정확히 알 수 있습니다.
이것들은 정수이므로, 많은 영리한 트릭 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
예를 들어,. 실수는 0에 가깝고 가장 가까운 정수로 반올림되는 것을 제외하고 작동합니다.
아래 코드를 사용하지 마십시오. 두 변수의 값을 바꾸는 것이 권장되는 방법 은 아닙니다 ( 일시적으로 임시 변수 를 사용하십시오 ). 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
있습니다.
여기서 한 라이너 가정이다 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;
개인적인 취향.
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 작업을 지원하는 모든 언어에서 작동합니다.
편집 : 의견을 참조하십시오. 이것이 정수로만 작동한다는 것을 잊어 버렸습니다. 질문의 스레드에서 정수 변수를 가정
귀하의 질문이 소중했던 것처럼 "이 변수들만이 아니라 다른 변수들"입니다.
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
트릭입니다.
Rodrigo Assis가 말했듯이 "더 짧을 수 있습니다"
b=a+(a=b)-b;
우리는 어떻게이 고전적인 oneliners를 놓칠 수 있을까
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
과
var a = 1, b = 2
a = (_=b,b=a,_);
마지막은 전역 변수 '_'를 노출하지만 일반적인 자바 스크립트 규칙은이 변수를 '무관심'변수로 사용하는 것이 중요하지 않습니다.
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를 제거하거나 주석을 달고 한 세트의 코드로 실행하십시오.
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까지 두 숫자를 바꾸려면 임시 변수를 만든 다음 바꿔야합니다. 그러나 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
; 그러나 destructuring 후, x
이다 y
예 2
,하고 y
있습니다 x
즉 1
.
(함수 (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));