JavaScript에서 두 변수를 스왑하는 방법
다음 두 가지 변수가 있습니다.
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>";
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 에서는).코드를 유지하는 사람(앞으로 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"유능한 프로그래머는 자신의 두개골 크기가 제한적이라는 것을 충분히 알고 있습니다. 따라서 그는 자신의 일에 겸손하게 임하고 전염병 같은 교묘한 계략을 피한다." - 에드거 W. 다이크스트라
아래 코드는 사용하지 마십시오.두 변수의 값을 스왑하는 방법은 권장되지 않습니다(단순히 임시 변수를 사용).JavaScript 트릭만 보여줍니다.
이 솔루션에서는 일시적인 변수나 어레이를 사용하지 않고 1개의 추가만 사용합니다.또, 고속입니다.실제로 여러 플랫폼에서 임시 변수보다 빠를 수 있습니다.
모든 번호에 대해 동작하며 오버플로우가 발생하지 않으며 Infinity 및 NaN 등의 엣지 케이스를 처리합니다.
a = b + (b=a, 0)
2단계로 동작합니다.
(b=a, 0)
놓다b
의 오래된 가치로a
및 산출량0
a = b + 0
놓다a
의 오래된 가치로b
ES6 이후로는 변수를 보다 우아하게 교환할 수도 있습니다.
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배 빠릅니다).
이제 다음 작업을 수행할 수 있습니다.
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
임시 스왑 변수 또는 XOR을 사용할 수 있습니다.
a = a ^ b
b = a ^ b
a = a ^ b
이는 기본적인 논리 개념일 뿐이며 XOR 연산을 지원하는 모든 언어로 작동합니다.
edit: 코멘트를 참조해 주세요.이것은 반드시 정수에서만 작동한다는 것을 말하는 것을 잊었습니다.질문의 스레드에서 정수 변수를 가정했습니다.
다음과 같은 세 번째 변수를 사용합니다.
var a = 1,
b = 2,
c = a;
a = b; // must be first or a and b end up being both 1
b = c;
데모 - 세 번째 변수 사용
당신의 질문이 소중했기 때문에 "이 변수만, 어떤 객체도 아니다."라는 대답도 소중할 것입니다.
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
는 할 수 " "더 짧게는 할 수 있다"
b=a+(a=b)-b;
데모: http://jsfiddle.net/abdennour/2jJQ2/
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,_);
마지막은 글로벌 변수 '_'를 공개하지만 일반적인 자바스크립트 규약은 '돈트케어' 변수로 사용하는 것이기 때문에 중요하지 않습니다.
프로그래밍 올림피아드 같은 게 보이네요또 하나의 까다로운 솔루션:
b = (function(){ a=b; return arguments[0]; })(a);
바이올린: http://jsfiddle.net/cherniv/4q226/
단일 회선 스왑
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개 //or를 제거하거나 주석을 달아 하나의 코드 세트로 실행합니다.
다음과 같이 var를 스왑할 수 있습니다.
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
이 방법은 실행 속도가 느리다고 들었기 때문에:
b = [a, a = b][0];
개체(또는 배열)에 변수를 저장할 계획인 경우 이 기능이 작동해야 합니다.
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'}
IIFE를 사용하여 추가 파라미터 없이2개의 값을 교환할 수 있습니다.
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
ES5까지 두 숫자를 교환하려면 온도 변수를 만든 다음 교환해야 합니다.그러나 ES6에서는 어레이 파괴 기능을 사용하여 2개의 번호를 쉽게 교환할 수 있습니다.예를 참조해 주세요.
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
JavaScript ES6 파괴에 대해 자세히 알아보기
첫 번째 방법은
var a = 5, b = 9;
a = a - b;
b = a + b;
a = b - a;
console.log(a, b);
세컨드웨이
var a = 19, b = 22;
[a, b] = [b, a];
console.log(a, b);
간단 명료한 대답
let a = 2, b = 4;
[b, a] = [a, b];
좀 더 장황한 접근법은
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
이전에도 같은 답변을 드렸지만, 여기에 그것을 설명하는 png가 있습니다.
가장 간단한 형식:
언급URL : https://stackoverflow.com/questions/16201656/how-to-swap-two-variables-in-javascript
'source' 카테고리의 다른 글
MySQL은 하나의 열과 대응하는 다른 열을 선택합니다. (0) | 2022.10.13 |
---|---|
System.out.println 출력 컬러링 방법 (0) | 2022.10.13 |
PHP: bool vs boolean type 힌트 (0) | 2022.10.13 |
React js onClick은 메서드에 값을 전달할 수 없습니다. (0) | 2022.10.13 |
X분마다 cronjob을 실행하는 방법 (0) | 2022.10.13 |