2016-09-28 1 views
5

ES6에서 (node-esml을 통해) 간단한 GCD 알고리즘을 구현하면서 while 루프 내의 변수 값을 업데이트하는 이상한 동작이 발생했습니다. 이 코드는 환상적으로 작동합니다ES6 함수에서 while 루프의 소멸 할당이 루프 외부로 전파되지 않습니까?

function gcdWithTemp(x, y) { 
    let [r, rdash] = [x, y] 
    while (r != 0) { 
    q = Math.floor(rdash/r) 
    temp = r 
    r = rdash - q * r 
    rdash = temp 
    } 
    return(rdash) 
} 
console.log(gcdWithTemp(97, 34)) 

1의 예상 답을 반환. 나는 임시 변수를 제거하고 대신 같은 결과를 시도하고 달성하기 위해 destructuring 할당을 사용하는 경우, : 그것은 완료하지

function gcdWithDestructuredAssignment(x, y) { 
    let [r, rdash] = [x, y] 
    while (r != 0) { 
    q = Math.floor(rdash/r) 
    [r, rdash] = [rdash - q * r, r] 
    } 
    return(rdash) 
} 
console.log(gcdWithDestructuredAssignment(97, 34)) 

을 더 디버깅 r은 항상 x에 할당 된 첫 번째 값을있을 것이라는 점을 보여줍니다. 이 두 구현은 동일해야합니다. Swapping variables

또한 대신 let을 사용하지 않으려 고 시도했습니다. 구조 조정 임무를 잘못 이해했거나 뭔가 미묘한 부분을 빠뜨린 것입니까? 아니면 버그입니까?

+1

당신의'q'와'temp' 변수는 [암시 적으로 전역 적입니다] (http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html). 엄격 모드를 사용하십시오! – Bergi

+1

Btw,'function gcd (r, rdash) {'를 쓰고'let [r, rdash] = [x, y]'를 생략하면 어떨까요? – Bergi

답변

7

이것은 구조 지정 지정이 아니라 ASI (자동 세미콜론 삽입)와 관련된 문제입니다. 이 두 라인 :

q = Math.floor(rdash/r) 
[r, rdash] = [rdash - q * r, r] 

실제로이 의미 :

q = Math.floor(rdash/r)[r, rdash] = [rdash - q * r, r] 

을 분명히 당신이 무슨 뜻인지하지 않다.

function gcdWithDestructuredAssignment(x, y) { 
 
    let [r, rdash] = [x, y] 
 
    while (r != 0) { 
 
    q = Math.floor(rdash/r) 
 
    ;[r, rdash] = [rdash - q * r, r] 
 
    } 
 
    return(rdash) 
 
} 
 
console.log(gcdWithDestructuredAssignment(97, 34))

는 물론 이전 라인 대신 (q = Math.floor(rdash/r);)의 끝에서 누락 된 세미콜론을 추가 할 수 있지만 이후 일반적으로 돈 : 그 문제를 해결하려면, [의 앞에 세미콜론을 추가 세미콜론을 사용하지 않으므로 npm coding style을 사용하고 있다고 가정합니다.

+1

누락 된 세미콜론을 찾아 주셔서 감사합니다.하지만 평소와 달리 첫 번째 말미에 두 번째 줄 시작 부분에 추가 하시겠습니까? – Aaron

+2

@Aaron [npm 코딩 스타일] (https://docs.npmjs.com/misc/coding-style#semicolons)입니다. –

+0

고마워, 그걸 배울 기쁩니다. 세미콜론을 일반적으로 생략하고 문제점이 이전 행과 일치하면 문제가있는 행의 시작 부분에 세미콜론을 두는 것이 좋습니다. – Aaron

관련 문제