2016-07-06 2 views
-2

예를 들어 FizzBuzz를 사용하면 for 루프 내부의 스위치 케이스가 각 대소 문자 뒤에 break를 사용합니다. 모질라의 docs에서 스위치 케이스 루프에서 브레이크를 사용해야합니까?

for (num = 1; num <= 100000; num ++) { 
    switch (true) { 
     case (num % 15 == 0): 
      console.log("FizzBuzz"); 
      break; 
     case (num % 3 == 0): 
      console.log("Fizz"); 
      break; 
     case (num % 5 == 0): 
      console.log("Buzz"); 
      break; 
     default: 
      console.log(num); 
      break; 
    } 
} 

, 그들은

각각의 경우 라벨과 관련된 옵션 break 문이 일치하는 진술 한 번 스위치 중 프로그램 중단이 가 실행 보장과 계속 ... 말 switch 다음 문에서 실행. 중단이 생략 된 경우 스위치 설명에있는 문에서 프로그램이 계속 실행됩니다.

내가 의미하는 바는 스크립트가 num % 15 == 0을 검사 할 때 휴식 및 이벤트가 발생해도 true 인 경우 num % 3 == 0으로 이동한다는 것입니다. 그래서 나는 100,000 개의 숫자로 2 개의 테스트를했다. 하나는 휴식 시간이고 다른 하나는 휴식 시간입니다.

휴식 시간과 휴식 시간 사이에 약 2 초의 차이가 있으며, 은 짧고 빠릅니다.하지만 많은 반복이 있습니다.

제 질문은, 작은 규모의 응용 프로그램을 만드는 대부분의 개발자가 루프에서 나누기를 사용하는 것이 중요합니까? 습관과 취향의 문제입니까? 생각?

+0

아니요, '중단'이 없으면 첫 번째 '중단'이 충족되거나 '차단'블록이 종료 될 때까지 다음 모든 '사례'본문을 무조건 실행합니다. – zerkms

+6

이것은 성능의 문제가 아니며 기능상의 차이입니다. –

답변

2

(break 또는 return 생각). 따라서 break은 성능 속도를 변화시킬뿐만 아니라 기능을 변경합니다.

switch 문에 대해 생각하는 쉬운 방법은 if - else 문을 연결하는 것입니다. 당신은 당신이 변경거야 break; 문을 제거하면

은 당신의 switch 코드는 그냥 간단하게

if (num % 15 == 0) { 
    console.log("FizzBuzz"); 
} else if (num % 3 == 0) { 
    console.log("Fizz"); 
} else if (num % 5 == 0) { 
    console.log("Buzz"); 
} else { 
    console.log(num); 
} 

기록 할 수있는 방법을 실제로 코드가 작동합니다. 더 많은 것을 수행 할 것입니다

if (num % 15 == 0) { 
    console.log("FizzBuzz"); 
} 

if (num % 3 == 0 || num % 15 == 0) { 
    console.log("Fizz"); 
} 

if (num % 5 == 0 || num % 3 == 0 || num % 15 == 0) { 
    console.log("Buzz"); 
} 

console.log(num); 

가장 큰 차이점은 else 조건이 없다는 것입니다.

+0

*을 사용하여 커스텀 빌더로 Sublime Text 3을 실행 중입니다. 고맙습니다. –

+0

캘럼 (Callum)을 넣을 때 jsfiddle입니다. 진술이 사실이라면 기대하지 않습니다 : https://jsfiddle.net/kty48k6p/.예를 들어 숫자 15는 "FizzBuzz", "Fizz"및 "Buzz"를 산출하지 않습니다. –

+0

@ ka-mok 제 2 코드 블록은 _ "FizzBuzz", "Fizz", "Buzz", 15_을 산출해야합니다. 당신의 jsfiddle처럼. 당신이 혼동을 줄 수있는 이유는 그 숫자가 관련 "Fizz"와 "Buzz"물건들 후에 기록된다는 것입니다. 이것은'default : console.log (num);'가 마지막으로 실행 된 블록이기 때문입니다. –

2

break의 유무에 관계없이 다른 결과가 나옵니다. break이 없으면 num = 15을 통해 전달됩니다. 예를 들어 "FizzBuzz", "Fizz", "Buzz""15"이 인쇄됩니다. 반면에 break으로 인쇄하면 "FizzBuzz"이 인쇄됩니다. default 케이스 뒤에서 휴식을 필요로하지 않는다고 말했을 때, 스위치가 끝나면.

+0

친절하게이 댓글을 다시 읽으십시오! ** " 'break'문을 생략하면 프로그램 논리가 * 다른 ***이며, 틀림없이 *** ***!"*** –

+1

* "기본 사례 다음에 중단 할 필요가 없습니다. "* ... 기본값은 끝에 있다고 가정하지만 스위치의 어느 위치 에나있을 수 있습니다. 그래서 끝이 아니라면 휴식을 취해야합니다. – charlietfl

+2

@MikeRobinson, 이것이 내가 말한 것과 무슨 상관이 있습니까? –

0

당신이 할 경우하지break 문을 포함, 당신은 의심 할 여지없이 을 도입 가지고버그 (!) 프로그램에! 당신이 할 경우하지break 문을 포함

, 논리는 "단순히 가을 스루"할 추가 조건의 코드로 : 왜

는 여기에 있습니다. . . 하지만 이 아님 (!) 이러한 조건을 평가하십시오! 속담의 중국 상점에 속한 속담처럼 황폐화 될 것입니다. break 문이없는 즉

, ,(num % 15 == 0)console.log()넷 (!) (하지 "하나") 메시지의 경우. 마찬가지로 (num % 3 == 0)세, 등과 같이 기록됩니다.

"Heh ... 거기에 가지 마세요."

===== 편집 : 원래 것을 고려하는 것이 도움이 될 수 ("C ... ") switch 개념이었다 그"는에서 발생하는 여러 방법 goto " 신체 내에서 case -points 중 하나에 분기 구조물의 최고.는 break 문은 switch의 끝을 보낸 goto를 생성합니다. 당신이 하지이 포함 한 경우 "도움"가정 당신이 을 의도한다면은 다르게 일어날 일을했습니다 :   중 하나는 case이 단순히 다음 단계로 넘어갈 것입니다. (어느 쪽 이건, break가 정확히 무엇인지는 입니다.)"Caveat Coder!" case 조건이 종료 명령을 명중 할 때까지 그 스위치를 문 내에서 코드 블록을 모두 실행됩니다 switch 문에 충족

+1

그건 전혀 버그가 아니야. 원하는 기능이 될 수 있습니다. –

+0

그게 문제 야. 깨지기도하고 깨지도 않으면 서 똑같은 결과를 낳는다. Node.JS –