source

자바스크립트에서 정수 범위 켜기

ittop 2023. 10. 19. 22:46
반응형

자바스크립트에서 정수 범위 켜기

이런 거 하고 싶어요.

    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

반응형