这一篇博文继续分享《高程四》第三章的内容,估计第三章快要结束了。
3.6.2 do-while 语句
do-while 语句是一种后测试循环语句,即循环体中的代码执行后才会对退出条件进行求值。换句话说,循环体内的代码至少执行一次。
do-while 的语法如下:
do {
statement
} while (expression);
注意 后测试循环经常用于这种情形:循环体内代码在退出前至少要执行一次。
3.6.3 while 语句
while 语句是一种先测试循环语句,即先检测退出条件,再执行循环体内的代码。因此, while 循环体内的代码有可能不会执行。下面是 while 循环的语法:
while(expression) statement
3.6.4 for 语句
for 语句也是先测试语句,只不过增加了进入循环之前的初始化代码,以及循环执行后要执行的表达式,语法如下
for (initialization; expression; post-loopexpression)
statement
循环体也可能不会被执行。如果循环体被执行了,则循环后表达式也会执行,以便递增循环变量。
无法通过 while 循环实现的逻辑,同样也无法使用 for 循环实现。因此 for 循环只是将循环相关的代码封装在了一起而已。
在 for 循环的初始化代码中,其实是可以不使用变量声明关键字的。(也就是for(let i = 0; i < 10; i ++) 也可以写成for(i = 0; i < 10; i ++))不过,初始化定义的迭代器变量在循环执行完成后几乎不可能再用到了。因此,最清晰的写法是使用 let 声明迭代器变量,这样就可以将这个变量的作用域限定在循环中。
初始化、条件表达式和循环后表达式都不是必需的。因此,下面这种写法可以创建一个无穷循环:
for (;;) { // 无穷循环
doSomething();
}
如果只包含条件表达式,那么 for 循环实际上就变成了 while循环:
let count = 10;
let i = 0;
for (; i < count; ) {
console.log(i);
i++;
}
3.6.5 for-in 语句
for-in 语句是一种严格的迭代语句,用于枚举对象中的非符号键属性,语法如下:
for (property in expression) statement
下面是一个例子:
for (const propName in window) {
document.write(propName);
}
这个例子使用 for-in 循环显示了BOM对象 window 的所有属性。每次执行循环,都会给变量 propName 赋予一个 window 对象的属性作为值,直到 window 的所有属性都被枚举一遍。与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const 。
ECMAScript中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。换句话说,所有可枚举的属性都会返回一次,但返回的顺序可能会因浏览器而异。
如果 for-in 循环要迭代的变量是 null 或 undefined ,则不执行循环体。
3.6.6 for-of 语句
for-of 语句是一种严格的迭代语句,用于遍历可迭代对象的元素,语法如下:
for (property of expression) statement
下面是示例:
for (const el of [2,4,6,8]) {
document.write(el);
}
在这个例子中,我们使用 for-of 语句显示了一个包含4个元素的数组中的所有元素。循环会一直持续到将所有元素都迭代完。与for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const 。
for-of 循环会按照可迭代对象的 next() 方法产生值的顺序迭代元素。(并不是所有的对象都可以使用for of循环遍历)如果尝试迭代的变量不支持迭代,则 for-of 语句会抛出错误。
3.6.7 标签语句
标签语句用于给语句加标签,语法如下:
label: statement
下面是一个例子:
start: for (let i = 0; i < count; i++) {
console.log(i);
}
在这个例子中, start 是一个标签,可以在后面通过 break或 continue 语句引用。标签语句的典型应用场景是嵌套循环。(本来用break只能跳出内层循环,如果需要跳出外层循环,可以在外层循环前面加上标签名,然后“break 标签名”, 跳出外层循环)