循环与迭代

JavaScript提供了以下循环语句:

  • for语句

    形式:

    1
    2
    for([initialExpression]; [condition]; [incrementExpression])
    statement

    当一个for语句执行的时候,会发生以下过程:

    1. 如果存在初始化表达式initialExpression则会被执行,该表达式通常会初始化一个或多个循环计数器,还可以声明变量。
    2. 计算condition表达式的值,如果condition的值是true,则执行循环中的语句,如果是false,则终止循环。如果condition表达式被忽略了,则值默认为true。
    3. 循环中的statement被执行,如果有多个statement,可以使用代码块{}包裹起来。
    4. 如果存在更新表达式incrementExpression则执行。
    5. 回到步骤2。

    例子:

    1
    2
    3
    for(let i=0;i<10;i++) {
    console.log(i);
    }
  • do...while语句

    形式:

    1
    2
    3
    do
    statement
    while(condition)

    statement在检查condition之前会被执行一次,如果condition的值为true,则会再次执行statement,直到condition的值为false。

    例子:

    1
    2
    3
    4
    let i = 0;
    do {
    console.log(i++);
    } while(i < 10)
  • while语句

    形式:

    1
    2
    while (condition)
    statement

    条件检测会在每次statement执行前发生,如果condition返回为true,statement会被再次执行并紧接着再次检测condition,如果condition为false,则退出循环。

    例子:

    1
    2
    3
    4
    5
    6
    var n = 0;
    var x = 0;
    while (n < 3) {
    n++;
    x += n;
    }
  • labeled语句

    label提供了带有标识符的语句,可以在程序的其他位置引用它。可以使用label标识循环,然后使用break或者continue语句让程序在指定处中断或是继续循环。

    形式:

    1
    2
    label: 
    statement

    label的值可以是非保留字的任意标识符,例:

    1
    2
    3
    4
    5
    markLoop:
    while (theMark === true) {
    doSomething();
    }
    break
  • break语句

    break语句可以用来终止循环和switch分支语句,或者链接到label语句。

    • break后不带label时,它会立即终止当前所在的循环或switch语句。
    • break后带label时,它会终止指定的带label的语句。

    形式:

    1
    break [label];

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var x = 0;
    var z = 0
    labelCancelLoops: while (true) {
    console.log("外部循环: " + x);
    x += 1;
    z = 1;
    while (true) {
    console.log("内部循环: " + z);
    z += 1;
    if (z === 10 && x === 10) {
    break labelCancelLoops;
    } else if (z === 10) {
    break;
    }
    }
    }
  • continue语句

    形式:

    1
    continue [label];

    continue语句可以重新启动(跳过代码块的剩余部分并进入下一个循环)一个whiledo-whilefor或者label语句。

    • 当使用不带labelcontinue语句时,终止当前这次的循环并执行下一次循环。
    • 当使用带labelcontinue语句时,它会应用于lebel标识的循环语句。

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    let i = 0;
    let n = 0;
    while (i < 5) {
    i++;
    if (i === 3) {
    continue;
    }
    n += i;
    console.log(n);
    }
    //1,3,7,12

    let i = 0;
    let j = 10;
    checkiandj:
    while (i < 4) {
    console.log(i);
    i += 1;
    checkj:
    while (j > 4) {
    console.log(j);
    j -= 1;
    if ((j % 2) === 0) {
    continue checkj;
    }
    console.log(j + ' is odd.');
    }
    console.log('i = ' + i);
    console.log('j = ' + j);
    }
  • for...in语句

    for...in语句指定一个变量名来迭代对象上的所有可枚举属性的属性名。

    形式:

    1
    2
    for (variable in object)
    statement

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    function dump_props(obj, obj_name) {
    let result = '';
    for (let i in obj) {
    result += obj_name + '.' + i + ' = ' + obj[i] + '<br>';
    }
    result += '<hr>';
    return result;
    }

    若使用for...in语句迭代数组,则有可能除了数字索引之外,还有其他自定义的属性。因此不建议使用for...in语句迭代数组。

  • for...of语句

    for...of语句在可迭代对象(ArrayMapSetarguments等)上创建一个循环,并为每个属性不同的值调用一次迭代(迭代的是属性值)。

    形式:

    1
    2
    for (variable of object)
    statement

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    const arr = [3, 5, 7];
    arr.foo = 'hello';
    for (let i in arr) {
    console.log(i); // logs "0", "1", "2", "foo"
    }
    for (let i of arr) {
    console.log(i); // logs 3, 5, 7
    }

本文参考资料

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • © 2019-2021 musi

请我喝杯咖啡吧~

支付宝
微信