지난 며칠 동안 친구가 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). 또한, 실제로이 글을 읽는다면, 고마워요.
다른 모든 것이 실패하면 항상 [11.14 Comma Operator (,)] (http://www.ecma-international.org/ecma-262/5.1/#sec-11.14) – RobG
입니다. 쉼표 연산자에 대한 설명이 있지만 표시된 코드는 구문 적으로 유효하지만 FizzBuzz 문제를 해결하지는 않습니다. (아니면 올바른 해결책을 제시하는 단계에 불과하다고 말 했나요?) – nnnnnn