【if语句】

  最常见的条件语句是if语句。if语句的条件必须放在if后面的圆括号内,条件的求值结果永远是一个布尔值,即只能是true或false。花括号中的语句,不管它们有多少条,只有在给定条件的求值结果是true的情况下才会执行

if(expression){
    statements;
}

  [注意]if语句中,括住expression的圆括号在语法上是必需的

  实际上,if语句中的花括号不是必不可少的。如果if语句中的花括号部分只包含一条语句,可以不使用花括号。但因为花括号可以提高脚本的可读性,所以在if语句中总是使用花括号是个好习惯

//可行,但不推荐
if(1>2)alert('1');

//推荐写法
if(1>2){
    alert('1');
}

if语句根据表达式的值改变程序流程。当expression的值为true时执行跟在其后的代码块,当expression的值为false时,执行else的逻辑

if(expression)
    statement1
else
    statement2

当在if/else语句中嵌套使用if语句时,必须注意确保else语句匹配正确的if语句

//错误暗示
if( i == j)
    if(j == k)
        console.log('i == k');
else console.log('i != j');

javascript中的if/else匹配规则是:else总是和就近的if语句匹配

//实际解释
if( i == j){
    if(j == k)
        console.log('i == k');
    else
        console.log('i != j');//错误
}
//使用花括号
if(i == j){
    if(j == k){
        console.log('i == k');
    }
}else{
    console.log('i != j');
}

当代码有多条分支时,需要使用else if语句。else if语句并不是真正的javascript语句,它是多条if/else语句连在一起时的一种惯用写法

if(n == 1){
    //代码1
}else if(n == 2){
    //代码2
}else if(n == 3){
    //代码3
}else{
    //其他代码
}

可以用if语句的嵌套形式来完成在语法上等价的代码,但没有else if语句清晰

if(n == 1){
    //代码1
}else{
    if(n == 2){
        //代码2
    }else{
        if(n == 3){
            //代码3
        }else{
           //其他代码
        }
    }
}

【switch语句】

  当所有的分支都依赖于同一个表达式的值时,else if并不是最佳解决方案。在这种情况下,重复计算多条if语句中的条件表达式是非常浪费的做法,而switch语句正适合处理这种情况
  switch语句执行一个多路分支,首先计算expression的值,然后查找case子句的表达式是否和expression的值相同。如果找到匹配的case,那么将会执行这个case对应的代码块。如果找不到匹配的case,那么将会执行default标签中的代码块。如果没有default标签,switch语句将跳过它的所有代码块

switch (expression)
  case value1: statement1;
    break;
  case value2: statement2;
    break;
  case value3: statement3;
    break;
  default: statement4;
if(n == 1){
    //代码1
}else if(n == 2){
    //代码2
}else if(n == 3){
    //代码3
}else{
    //其他代码
}
//等价于
switch(n){
    case 1:
        //代码1
        break;
    case 2:
        //代码2
        break;
    case 3:
        //代码3
        break;
    default:
        //代码4
}

  每一个case语句块的结尾处都使用了关键字break。break语句可以使解释器跳出switch语句或循环语句
  在switch语句中,case只是指明了要执行的代码起点,但并没有指明终点。如果没有break语句,那么switch语句就会从与expression的值相匹配的case标签处的代码块开始执行,依次执行后续的语句,一直到整个switch代码块的结尾

//如果没有break语句,若switch语句匹配1,则不仅执行代码1,也会执行代码2和代码3
switch(n){
    case 1:
        //代码1
    case 2:
        //代码2
    default:
        //代码3
}

  如果确实需要混合几种情形,要在代码中添加注释,说明是有意省略了break关键字

switch(i){
    //合并两种情形
    case 25:
    case 35:
        console.log('25 or 35');
        break;
    case 45:
        console.log('45');
        break;
    default:
        console.log('other');
}

  如果在函数中使用switch语句,可以使用return来代替break,return和break都用于终止switch语句,也会防止一个case语句块执行完后继续执行下一个case语句块

//函数中使用switch语句
function convert(x){
    switch(typeof x){
        case 'number':
            return x.toString(16);
        case 'string':
            return '"' + x + '"';
        default:
            return String(x);
    }
}

  虽然ECMAScript中的switch语句借鉴自其他语言,但这个语句也有自己的特色。可以在switch语句中使用任何数据类型(在很多其他语言中只能使用数值),而且每个case的值不一定是常量,可以是变量或表达式

var num = 25;
switch(true){
    case num < 0:
        console.log('less than 0.');
        break;
    case num >=0 && num <=10:
        console.log('between 0 and 10.');
        break;
    case num >10 && num <=20:
        console.log('between 10 and 20.');
        break;
    default:
        console.log('more than 20.');
}

  使用switch语句时,要注意以下几点:

  【1】由于每次执行switch语句时,并不是所有的case表达式都能执行到,因此,应该避免使用带有副作用的case表达式,比如函数调用表达式和赋值表达式,最安全的做法是在case表达式中使用常量表达式

  【2】default标签一般都出现在switch的末尾,位于所有case标签之后,当然这是最合理也是最常用的写法,实际上,default标签可以放置在switch语句内的任何地方

  【3】switch语句中,对每个case的匹配操作实际上是'==='恒等运算符比较,而不是'=='相等运算符比较,因此,表达式和case的匹配并不会做任何类型转换

//由于1并不会转换为'1',所以结果是3
var n = 1;
switch(n){
    case '1':
        console.log(1);
        break;
    case 2:
        console.log(2);
        break;
    default:
        console.log(3);
}

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注