2013-09-05 1 views
18

지난 며칠 동안 친구가 Javascript를 배우도록 돕고 있습니다. 수년 동안 그의 첫 번째 언어이며 거의 아무것도 기억하지 않으므로 처음부터 거의 완전히 시작되었습니다. 그는 간단한 튜토리얼을 진행하고 있으며 연습을 돕기 위해 연습 문제를 제공했습니다. 내가받은 가장 최근의 훈련은 (분명히) 클래식 FizzBuzz problem입니다. 그는 약간의 도움으로 문제를 해결했지만 해결책을 찾기 위해 뭔가 흥미로운 일을했습니다.쉼표는 Javascript if 문에서 구문 적으로 유효합니까?

for (var x = 1; x <= 100; x++) { 
    if (x%3 == 0, x%5 != 0) { 
     console.log("Fizz"); 
    } 
    else if (x%3 != 0, x%5 == 0) { 
     console.log("Buzz"); 
    } 
    else if (x%3 == 0, x%5 == 0) { 
     console.log("FizzBuzz"); 
    } 
    else { 
     console.log(x); 
    } 
} 

그는 부울 비교 연산자에 익숙하지 않은, 그래서 그는 && 대신 사용 쉼표를 사용하지 않은 : 그는 다음 코드를 내놓았다. 내 예상은 구문 오류에 대해 무언가를 말하며 충돌 할 것이지만 놀랍게도 "FizzBuzz"또는 숫자가없는 "Fizz"및 "Buzz"행을 여러 개 인쇄하는 것으로 끝났습니다. 말할 것도없이, 나는 혼란 스러웠다. 그래서 나는 약간의 실험을했다. 나에게 2 줄의 출력이 준

if (true, true) console.log('true, true'); 
if (true, false) console.log('true, false'); 
if (false, true) console.log('false, true'); 
if (false, false) console.log('false, false'); 

: 그에서

'true, true' 
'false, true' 

, 나는 그것이 마지막만을 평가하지하게했다 쉼표 모든 것을 추측을 만들어 내 첫 번째 테스트는이를 실행하는 것이 었습니다 표현식. 나는 다음이 코드를 실행 시도 :

for (var i = 0; i < 16; i++) { 
    if ((Math.floor(i/8) == 1), (Math.floor(i/4) == 1), (Math.floor(i/2) == 1), (i % 2 == 1)) { 
     console.log(i); 
    } 
} 

나는 쉼표로 구분 된 목록의 마지막 부울 모든 틀지 이후 (내 첫 번째 테스트에서 내 생각을 확인 1-15, 모든 홀수 번호였다있어 출력 다른 반복).

장황한 컨텍스트가 끝나면 내 질문은 다음과 같습니다.이 쉼표 구문은 Javascript 엔진의 알려진 의도적 인 조각입니까, 아니면 간과하고있는 인터프리터의 간과입니까? 쉼표는 몇 가지 다른 것들 (한 줄에 여러 변수를 초기화하고, 배열을 선언하고, 매개 변수를 분리하는 것을 염두에 두어야 함)을 위해 사용될 수 있다는 것을 알고 있습니다. 그러나 어떤 언어에서도 이와 같은 조건문에 사용되는 것을 들어 보지 못했습니다. 나는이 코드가 실행되어야하는지 여부를 다른 사람이 알고 있다면 궁금하다.

참고로

의 FizzBuzz 코드와 내가 모두 노드를 사용하여 수행 한 실행 두 번째 테스트, 나는 크롬의 자바 스크립트 콘솔에서 수행 된 실행 첫 번째 테스트는, 그래서 그냥 반드시 브라우저 될 것 같지 않습니다 또는 노드 독점의 버크 (실제로는 1). 또한, 실제로이 글을 읽는다면, 고마워요.

+0

다른 모든 것이 실패하면 항상 [11.14 Comma Operator (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG

+0

입니다. 쉼표 연산자에 대한 설명이 있지만 표시된 코드는 구문 적으로 유효하지만 FizzBuzz 문제를 해결하지는 않습니다. (아니면 올바른 해결책을 제시하는 단계에 불과하다고 말 했나요?) – nnnnnn

답변

26

쉼표는 실제 운영자입니다. 두 피연산자를 왼쪽에서 오른쪽으로 평가하고 두 번째 피연산자의 값을 반환합니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

그것의 가장 일반적인 사용은 for 루프에서 여러 매개 변수를 제공하는 것입니다,하지만 다른 목적으로도 사용될 수 있습니다.

+2

허. 명백하게 나는 그 다음 인터넷 검색에서 나쁘다. 나는 그것을 운영자로보고 완전히 실패했다. 빠른 답변 감사합니다. – Alex