我使用JavaScript已有一段时间了,但是仍然有很多东西要学习。
现在,我发现了有关 Switch语句的一些有趣事实。
我知道当您使用 case someValue
:而没有 break; 时,它将在下一种情况下执行代码。
switch (x) {
case 0:
case 1:
doThis();
case 2:
doSomethingElse();
break;
}
因此,当 x
为0
或1
时,它会执行 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();
}
}
}
}
如果我显示的是第一种情况,那么在这些条件下编写时为什么不起作用?而我展示的第二种情况只是一个非常不清楚的想法,即它如何工作。
有人可以向我解释吗?谢谢。
答案 0 :(得分:4)
基本上,switch
statement是具有三个通道的流,其中一个通道是外部程序流,检查通道和案例车道。
使用case
语句会发生车道更改,这会产生true
,其中switch
表达式的表达式和{{ 1}}子句,然后您进入 case lane 并停留,直到您未到达case
或break
语句的结尾。
只要您仍在检查通道中,其他检查之间或末尾的任何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;]]
}
如果您忘记了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');
}
提示
每当执行开关时,都应将其放在default
处,以便在最终完成的case
中找不到所需的动作。
要进行比较,我们必须使用相等和同一性比较器,并且如果需要逻辑(请参见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