【重走JavaScript之高级程序设计】 流程语句

语句(流控制语句,条件/循环语句)

一、if 条件语句

语法一、

if(condition) statement1 else statement2

语法二、

if(condition1){
  statement1 
} else if (condition2){
  statement2
} else {
  statement3
}

condition可以是任何表达式,会自动调用Boolean()函数将condition转换为布尔值。若为true,则执行statement1;若为false,则只是statement2。statement语句若是一行代码则可以省略代码块{}。连续使用多个if语句如语法2.

二、do-while 循环语句

语法

do {
  statement
} while (expression)

do-while语句是一种《后判断循环语句》。先执行再进行判断。循环体中的代码至少执行一次。

三、while 循环语句

语法

while(expression) statement

不同于do-while语句,while语句是《先判断循环语句》。先判断在执行循环,也就是循环体有可能不会执行。


四、for 循环语句

语法

for (初始变量; 判断变量; 变量循环条件) statement

for(;;){  //无穷循环 
  doSomething()
}

for循环和while循环是一样的。初始变量的申明通常用let,锁死变量的作用域(这个变量没有其他用处)。for循环是灵活的。


五、for-in 循环语句(推荐对象)

语法

for (key in object) statement

例子

// 枚举window对象身上的所有非符号键名,const不是必须的,确保局部变量不被修改,推荐使用const
for (const propKey in window){
    console.log(propKey)
}
// 在循环体内增加判断,只循环object本身的属性,而不去原型上找
for (const key in object) {
    if (Object.hasOwnProperty.call(object, key)) {
        const element = object[key];
        
    }

for-in 是一种严格的迭代语句,用于枚举对象中的非符号键。对象的属性不同于数组,是无序的。所以for-in不能保证返回属性的顺序,不同浏览器会造成返回的顺序不同。

注意for-in还会遍历到对象原型身上的方法,可以使用Object.hasOwnProperty.call判断只循环本身的属性。


六、for-of 数组循环语句(只能可迭代对象)

语法

for (const prop of array) statement,const不是必须的,确保局部变量不被修改,推荐使用const

for-of 是一种严重的迭代语句,用于遍历可迭代对象的元素。什么是可以迭代对象,ES2015规定只有接入了迭代器Iterator接口的才算可迭代对象,数组就是一种常见的可迭代对象。for-of会按照迭代器的next()遍历迭代元素,这也就是为什么for-of不能遍历普通对象的原因。

ES2018增加了for-await-of 循环,支持生成promise的异步可迭代对象。


七、标签语句与break和continue

语法

let num = 0;
outermost:  // 标签使用方法
for(let i = 0; i < 10; i++){
    for(let j = 0; j < 10; j++){
        if (j==5 && j==5){
            break outermost;    // 虽然在第二个j循环里使用break,但是使用标签会直接跳到使用标签的地方
        }
        num++;
    }
} 
console.log(num)    //55
let num = 0;
outermost:  // 标签使用方法
for(let i = 0; i < 10; i++){
    for(let j = 0; j < 10; j++){
        if (j==5 && j==5){
            continue outermost;    // 虽然在第二个j循环里使用break,但是使用标签会直接跳到使用标签的地方
        }
        num++;
    }
} 
console.log(num)    //95

break会直接跳出循环,break后的代码和循环不会执行。continue会跳出本次循环,continue的代码不执行,但是循环还要继续,相当于少了一次循环。

标签是配合break和continue使用的,场景发生在循环嵌套中,使用break和continue会直接跳出到标签后的语句。


八、switch 判断语句

语法

switch (expression) {
    case value1:
        statement
        break;
    case value2:
        statement
        break;
    case value3:
        statement
        break;
    default:    // 当以上条件均没有满足时,走这个默认代码(兜底)
        statement
        break;
}

switch 借鉴于C语言,当if语句嵌套层级过深(屎山)时会变得晦涩难懂。使用swich语句会使代码变得优雅易读,case代码每一个条件的分支,当case匹配到后悔执行代码并使用break跳出switch语句。default则相当于if语句中的else,指上面的条件均没有满足时给一个默认值。

switch语句在比较时会使用全等操作符===,不会强制转换数据类型。

例子1,可以是字符号串,不需要一定是数值

switch ("ni hao") {
    case "ni" + "hao":
        console.log("你好啊");
        break;
    case "zaijian":
        console.log("我没有向你问号");
        break;
    default:
        console.log("歪比巴卜");
}

例子2,可以在条件中直接使用表达式

let num = 25;
switch (true) {
    case num < 0:
        console.log("小于0");
        break;
    case num >=0 && num <= 10:
        console.log("0-10之间");
        break;
    default:
        console.log("大于10");
}

虽然switch借鉴于其他语言,但是ECMA给予了更多的特性。js中的switch语句可以用于所有数据类型(很多语言中,只能用于数值)

posted @ 2022-08-27 14:43  wanglei1900  阅读(32)  评论(0编辑  收藏  举报