자바스크립트에서 정수 범위 켜기
이런 거 하고 싶어요.
switch (this.dealer) {
case 1-4:
// Do something.
break;
case 5-8:
// Do something.
break;
case 9-11:
// Do something.
break;
default:
break;
}
이것에 알맞은 구문은 무엇입니까?자바스크립트로 가능합니까?
그렇게this.dealer
정수이고, 그 값 사이에 있으면 어떻게든 해보세요.
제가 알아낸 다른 방법은 다음과 같습니다.
const x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x < 9):
alert("between 5 and 8");
break;
case (x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
}
MarvinLabs가 답변한 내용을 보다 깨끗하게 개선:
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x < 9):
alert("between 5 and 8");
break;
case (x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
범위의 하단을 확인할 필요는 없습니다.break
문은 실행이 나머지 경우를 건너뛰게 하므로, 실행이 확인될 때까지 값이 5 이상이어야 함을 알 수 있습니다. (x < 9).
물론 출력은 케이스가 원래 순서대로 유지되는 경우에만 정확하며, 정수 값(문제에 명시된 것)을 가정합니다. js의 모든 숫자가 실제로는 두 배의 고정밀 부동 소수점 숫자이기 때문에 엄밀히 말하면 범위는 5에서 8.9999999999 정도입니다.
사례를 이동할 수 있거나 각 사례 문에 전체 범위를 표시할 수 있도록 보다 판독성이 높은 경우 각 사례의 하위 범위에 대해 동일하지 않은 검사를 추가하면 됩니다.
var x = this.dealer;
switch (true) {
case (x < 5):
alert("less than five");
break;
case (x >= 5 && x < 9):
alert("between 5 and 8");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
default:
alert("none");
break;
}
이것은 추가적인 인간 오류를 추가합니다. - 누군가가 범위를 업데이트하려고 할 수 있지만 두 위치 모두에서 범위를 변경하는 것을 잊어버려 중복이나 공백을 남기지 않습니다. 예를 들어, 여기서 8과 일치하던 경우를 편집하면 8의 경우는 이제 아무것도 일치하지 않습니다.
case (x >= 5 && x < 8):
alert("between 5 and 7");
break;
case (x >= 9 && x < 12):
alert("between 9 and 11");
break;
switch(this.dealer) {
case 1:
case 2:
case 3:
case 4:
// Do something.
break;
case 5:
case 6:
case 7:
case 8:
// Do something.
break;
default:
break;
}
사건의 연속이 마음에 들지 않으면, 그냥 가보세요.if/else if/else
진술들.
스위치 문은 필요 없습니다.보다 명확하고, 보다 간결하고, 보다 빠르고, 보다 최적화할 수 있습니다. 다른 경우에는...
var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
if (d <= 4) {
alert("1 to 4");
} else if (d <= 8) {
alert("5 to 8");
} else {
alert("9 to 11");
}
} else {
alert("not in range");
}
스피드 테스트
좀 더 단순한 스위치 대신 스위치를 사용하는 것에 대한 부담이 궁금해서 jsFiddle을 조립해서 조사해봤습니다.http://jsfiddle.net/17x9w1eL/
크롬: 스위치 속도가 다른 경우보다 약 70% 느렸습니다.
Firefox: 스위치 속도가 다른 경우보다 약 5% 느렸습니다.
IE: 스위치가 다른 경우보다 약 5% 느렸습니다.
Safari: 스위치 속도가 다른 경우보다 약 95% 느렸습니다.
주의:
특히 코드가 나중에 자동으로 최적화되는 경우 로컬 변수에 할당하는 것은 선택 사항입니다.
숫자 범위의 경우, 이런 구조를 사용하는 것이 좋습니다.
if (1 <= d && d <= 11) {...}
... 수학에서 범위를 표현하는 방식(1 <= d <= 11)에 더 가깝기 때문에 코드를 읽을 때 "d가 1과 11 사이에 있다면"으로 읽을 수 있습니다.
더 선명한
몇몇 사람들은 이것이 더 명확하다고 생각하지 않습니다.스위치 옵션과 구조가 거의 동일하기 때문에 덜 명확하지 않다고 말하고 싶습니다.이것이 더 명확한 주요 이유는 모든 부분이 읽을 수 있고 단순한 직관적인 이해가 가능하기 때문입니다.
"스위치(참)"에 대한 제 우려는 그것이 무의미한 코드 라인으로 보일 수 있다는 것입니다.많은 코더들은 어떻게 해야할지 모르는 책을 읽습니다.
저만의 코드를 위해, 저는 때때로 모호한 구조를 사용할 의향이 있지만, 다른 사람이 그것을 본다면, 저는 더 명확한 구조를 사용하려고 노력합니다.나는 그들이 의도한 것을 위해 그 구성품들을 사용하는 것이 더 좋다고 생각합니다.
최적화
현대 환경에서 코드는 제작을 위해 종종 최소화되기 때문에 읽기 쉬운 변수 이름과 유용한 코멘트를 포함한 명확한 간결한 코드를 작성할 수 있습니다.스위치를 이런 식으로 사용해야 하는 명확한 이유가 없습니다.
저는 또한 두 구조물을 모두 미니머를 통해 넣으려고 시도했습니다.if/else 구조가 잘 압축되어 중첩된 3항 연산자를 사용하는 단일 짧은 식이 됩니다.최소화할 때 스위치 문은 스위치로 남아 "스위치", "케이스" 및 "브레이크" 토큰으로 완성되며 결과적으로 코드가 상당히 길어집니다.
스위치(참) 작동 방식
"스위치(사실)는 잘 알려져 있지 않지만, 어떤 사람들은 그냥 스위치를 사용하고 싶어하는 것 같아요. 그래서 작동하는 이유에 대한 설명이 있습니다.
스위치/케이스 문은 스위치의 부품과 각 케이스를 일치시킨 다음 첫 번째 일치 시 코드를 실행하는 방식으로 작동합니다.대부분의 사용 사례에서는 스위치에 변수 또는 일정하지 않은 식이 있고, 이와 일치합니다.
"switch(true)"를 사용하면 case statement에서 true인 첫 번째 식을 찾을 수 있습니다."switch (true)"를 "find the first expression for true"로 읽으면 코드가 더 가독성이 높아집니다.
체크 범위가 필요하다면 당신은 아마도 당신과 함께 하는 것이 더 나을 것입니다.if
그리고.else if
다음과 같은 문장:
if (range > 0 && range < 5)
{
// ..
}
else if (range > 5 && range < 9)
{
// ..
}
else
{
// Fall through
}
스위치는 더 큰 범위에서 커질 수 있습니다.
아니요, 이건 불가능합니다.가장 가까이 접근할 수 있는 방법은 다음과 같습니다.
switch(this.dealer) {
case 1:
case 2:
case 3:
case 4:
// DO SOMETHING
break;
case 5:
case 6:
case 7:
case 8:
// DO SOMETHING
break;
하지만 이것은 매우 다루기 힘든 것입니다.
이와 같은 경우에는 일반적으로 a를 사용하는 것이 더 좋습니다.if
/else if
구조.
더 읽기 쉬운 트라이너리 버전은 다음과 같습니다.
var x = this.dealer;
alert(t < 1 || t > 11
? 'none'
: t < 5
? 'less than five'
: t <= 8
? 'between 5 and 8'
: 'Between 9 and 11');
빠르고 효율적이며 가독성이 뛰어난 작업을 수행하고자 한다면, 다음과 같은 구조일 경우 표준을 사용하십시오.
var d = this.dealer;
if (d < 12) {
if (d < 5) {
alert("less than five");
}else if (d < 9) {
alert("between 5 and 8");
}else{
alert("between 9 and 11");
}
}else{
alert("none");
}
난독화시켜 엉망으로 만들고 싶다면 다음을 시도해 보십시오.
var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");
그건 그렇고, 위 코드는 자바스크립트라면...그러면... 다른 속기문입니다.난독화나 코드 축소가 목표가 아닌 이상 코드를 작성하지 않는 방법을 보여주는 좋은 예입니다.이런 식으로 작성할 경우 코드 유지보수가 문제가 될 수 있음을 유의하십시오.아주 적은 사람들만이 그것을 쉽게 읽을 수 있습니다.그러나 코드 크기는 표준보다 50% 작으며, 그 외에는 성능 저하가 없습니다.이는 대규모 코드베이스에서 이와 같은 최소화를 통해 대역폭이 제한되거나 대기 시간이 긴 네트워크에 걸쳐 코드 전달 속도를 크게 높일 수 있음을 의미합니다.
그러나 이것이 좋은 대답으로 여겨져서는 안됩니다.그것은 무엇을 할 수 있는지에 대한 예시일 뿐이지, 무엇을 해야 하는지에 대해서는 아닙니다.
언급URL : https://stackoverflow.com/questions/5619832/switch-on-ranges-of-integers-in-javascript
'source' 카테고리의 다른 글
이점 vs.로컬에서 jQuery를 호스팅하는 것의 함정 (0) | 2023.10.24 |
---|---|
Oracle 데이터베이스가 UPDATE 쿼리에 무한히 걸려 있습니다. (0) | 2023.10.19 |
여러 개의 동일한 서비스를 tnsname.ora에서 Oracle 씬 드라이버에서 지원함을 선언합니다. (0) | 2023.10.19 |
xml 파일에 '<' 같은 문자 쓰기 (0) | 2023.10.19 |
"_vti_cnf", "_vti_pvt", "_vti_script" 및 "_vti_txt" 폴더란 무엇입니까? (0) | 2023.10.19 |