JavaScript:了解切换中的情况

时间:2019-01-26 10:03:26

标签: javascript scope

我使用JavaScript已有一段时间了,但是仍然有很多东西要学习。

现在,我发现了有关 Switch语句的一些有趣事实。

我知道当您使用 case someValue而没有 break; 时,它将在下一种情况下执行代码。

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

因此,当 x 01时,它会执行 doThis() 甚至是 { {1}} 但是为什么?
JavaScript会将其解释为如下内容:

doSomethingElse()

或为每种情况创建代码块,直到出现brek为止,如下所示:

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

语句会很容易,而不是这样:switch (x) { case 0: { case 1: { doThis(); case 2: { doSomethingElse(); } } } }

如果我显示的是第一种情况,那么在这些条件下编写时为什么不起作用?而我展示的第二种情况只是一个非常不清楚的想法,即它如何工作。

有人可以向我解释吗?谢谢。

2 个答案:

答案 0 :(得分:4)

基本上,switch statement是具有三个通道的流,其中一个通道是外部程序流检查通道案例车道

使用case语句会发生车道更改,这会产生true,其中switch表达式的表达式和{{ 1}}子句,然后您进入 case lane 并停留,直到您未到达casebreak语句的结尾。

只要您仍在检查通道中,其他检查之间或末尾的任何switch语句都不会起作用。

break

答案 1 :(得分:2)

审查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 。< / p>

  

示例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中进行切换的比较

要进行比较,我们必须使用相等和同一性比较器,并且如果需要逻辑(请参见Operators 中的更多信息):

  

示例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)或以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

===! ==运算符是 strict 比较运算符。这意味着如果操作数具有不同的类型,则它们是不同的。例如,

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

运算符==! =是比较运算符放松。也就是说,如果操作数具有不同的类型,JavaScript会尝试将它们转换为可比较的。例如,

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

值得一提的是,与==不同,运算符===不是transitive

"0" == 0 // true
0 == "" // true
"0" == "" // false