JavaScript: понимание случаев в switch - PullRequest
0 голосов
/ 26 января 2019

Я нахожусь в JavaScript некоторое время, но есть еще много вещей, которые нужно изучить.

Теперь я обнаружил несколько интересных фактов о Switch switch .

Я знаю, что когда вы используете case someValue: без break; , он выполняет код в следующем случае.

switch (x) {
  case 0:
  case 1:
    doThis();
  case 2:
    doSomethingElse();
    break;
}

Итак, когда x равен 0 или 1, он выполняет doThis() и даже doSomethingElse(), , но почему? .
Будет ли JavaScript интерпретировать это примерно так:

switch (x) {
  case (0 == x || 1 == x): 
    doThis();
    doSomethingElse();
    break;
  case (2 == x):
    doSomethingElse();
    break;
}

или создает блок кода для каждого случая, пока не появится brek, например:

switch (x) {
  case 0: {
    case 1: {
      doThis();
      case 2: {
        doSomethingElse();
      }
    }
  }
}

Заявления будут скорее всего такими: (x === 0 && x == 0) || x === 1 && x == 1)

Если это первый случай, который я показываю, то почему он не работает, когда вы пишете с этими условиями? И второй случай, который я показываю, - только очень неясная идея, как это может работать.

Кто-нибудь может мне это объяснить? Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Обзор структуры switch 1

Стоит вспомнить структуру switch

switch (expression) {
case value1:
    //Statements executed when the
    //result of expression matches value1
    [break;]
case value2:
    //Statements executed when the
    //result of expression matches value2
    [break;]
...
case valueN:
    //Statements executed when the
    //result of expression matches valueN
    [break;]
[default:
    //Statements executed when none of
    //the values match the value of the expression
    [break;]]
}

Чтопроизойдет, если я забуду перерыв на выключателе?(JS) 1

Если вы забудете break, сценарий выполнит с того места, где выполняется условие, и выполнит следующее case независимо, выполняется ли это условие или нет .

? Пример 01

// EXAMPLE01
    var x = 1;
    switch (x) {
        case 0:
        case 1: // x is 1, therefore the condition is fulfilled and the next block is executed
            doThis ();
            // NOTE: the forgotten "break" should be here
        case 2: // There is no "break" sentence in the 'case 12:', therefore this case will also be executed
            doSomethingElse ();
            break; // When finding a "break", the 'case 2:' will not be executed.
        default:
            console.log ('default');
    }

    /**
    * Testing functions
    */

    function doThis () {
        console.log ('This case is one');
    }

    function doSomethingElse () {
        console.log ('This case is two');
    }

Status Советы


При каждом переключении его следует ставить
defaultтак что если он не найдет ожидаемое в финализации case с требуемым действием.

Сравнения в JS в переключателе

Для сравнения мы должны использовать равенство иИдентификаторы сравнения и, если необходима логика ( Подробнее см. в Операторы ):

? Пример 02-A

    // EXAMPLE 02.A
    var x = 2;
    switch (true) {
        case (x === 1 || x === 0): // Not true when x = 2;
            doThis ();
            doSomethingElse ();
            break;
        case (x === 2): // Will be executed
            doSomethingElse ();
            break;
        default:
            console.log ('default');
    }

    /**
    * Testing functions
    */

    function doThis () {
        console.log ('This case is one');
    }

    function doSomethingElse () {
        console.log ('This case is two');
    }

Или мы также можем использовать операторы < или >:

? Пример 02-B

    // EXAMPLE 02.B
    x = 2;
    switch (true) {
        case (x === 1 || x === 0): // Not true when x = 2;
            doThis ();
            doSomethingElse ();
            break;
        case (x> 1 || x> 3): // Will be executed
            doSomethingElse ();
            break;
        default:
            console.log ('default');
    }
    /**
     * Testing functions
     */

    function doThis () {
        console.log ('This case is one');
    }

    function doSomethingElse () {
        console.log ('This case is two');
    }

Запустить вложенный переключатель

Чтобы сделать переключатель с более продвинутым уровнем в плане сравнения, вы можете использовать условное (if ... else,etc ) или циклы как continue.

? Пример 03

// EXAMPLE 03
var x = 2;
switch (true) {
    case (x === 1 || x === 0):
        doThis ();
        doSomethingElse ();
        break;
    case (x> 1 || x> 4): // Will be executed
        if (x === 1) {
            // It will not run
            console.log ('Its not the desired number');
        } else if (x === 2) {// It will be executed and it will end
            doSomethingElse ()
        }
        break;
    default:
        console.log ('default');
}
/**
 * Testing functions
 */

function doThis () {
    console.log ('This case is one');
}

function doSomethingElse () {
    console.log ('This case is two(2)');
}

✏️ Аннотации

Различия между === и == 3

Операторы === и ! == являются строгими операторами сравнения .Это означает, что если операнды имеют разные типы, они не одинаковы.Например,

1 === "1" // false
1! == "1" // true
null === undefined // false

Операторы == и ! = являются операторами сравнения relaxed .То есть, если операнды имеют разные типы, JavaScript пытается преобразовать их в сопоставимые.Например,

1 == "1" // true
1! = "1" // false
null == undefined // true

Стоит отметить, что оператор == не является транзитивным , в отличие от ===.

"0" == 0 // true
0 == "" // true
"0" == "" // false
0 голосов
/ 26 января 2019

По существу, оператор switch представляет собой поток с тремя полосами, где одна полоса - это внешний программный поток , контрольная полоса и case lane .

Изменение переулка происходит с оператором case, что приводит к true с строгой проверкой выражения оператора switch и значения условия case, затем вы переходите на case lane и остаетесь до тех пор, пока не достигнете break или конца оператора switch.

Пока вы все еще находитесь на полосе проверки , любая инструкция break между другими проверками или окончанием не оказывает никакого влияния.

                        out    lane  lane
code                    side  check  case  comment
---------------------  -----  -----  ----  -------------------------------------------------
                          v
switch (x) {              v >>>  v       
  case 0:                        ? >>> v   if case is true, change lane
  case 1:                        ? >>> v   if case is true, change lane
    doThis();                    v     v
  case 2:                        ? >>> v   if case is true, change lane
    doSomethingElse();           v     v
    break;                v <<<<<<<<<< .   break statement, back to program flow
  default:                v      ? >>> v   change lane if value is not in other case clauses
                          v      v
}                         v <<<  .         end of switch
                          v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...