现代 JavaScript 从头再来(四):语句

36 阅读2分钟

语句

条件分支

可以使用 ifelseelse if 语句或条件运算符 ? (三元运算符)来实现:

let year = prompt('输入年份', '');
if (year < 2019) {
    // ...
} else if (year >= 2019 && year <= 2025) {
    // ...
} else {
    // ...
}
​
let age = prompt('输入年龄', '');
let isAdult = age >= 18 ? true : false;

循环

基础循环:whiledo..while、和 for

while

let i = 3;
while (i < 0) {
    console.log(i);
    i--;
}
// 只有一条语句可以省略大括号
// while (i) console.log(i--);

do..while

一般很少使用,除非希望不管条件是否为真,循环体至少执行一次

let i = 0;
do {
    conosle.log(i);
    i++;
} while (i < 3)

for

for 循环的任何语句段都可以被省略:

let i = 0;
​
// i 已经声明并被赋值
for(; i < 3; i++) {
    console.log(i);
}
​
// 相当于 while(i < 3)
for(; i < 3;) {
    console.log(i++);
}
​
// 无限循环
for(;;) {}

跳出循环

使用 break 指令强制退出循环

let sum = 0;
while (true) {
  let value = +prompt("Enter a number", '');
  if (!value) break;
  sum += value;
}

继续下一次迭代

使用 continue 停止当前这一次迭代,并强制启动新一轮循环

for (let i = 0; i < 10; i++) {
  if (i % 2 === 0) continue;
  console.log(i); // 1,3,5,7,9
}

不建议 ? 代替 if 的一个原因是,非表达式的语法结构(如:break/continue 指令)不能与三元运算符 ? 一起使用

if (i > 0) {
  console.log(i);
} else {
  continue;
}
​
// 报错
(i > 0) ? console.log(i) : continue;

break/continue 标签

有时候需要一次从多层嵌套循环中跳出来:

for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    let input = prompt(`Value at coords (${i},${j})`, '');
    // 这里如果用户输入为空或者点取消,想直接跳出这两个循环输出 done
  }
}
console('Done');

普通的 break 只会打破内层循环,而标签可以直接跳出循环至标签处

标签是在循环之前带有冒号的标识符:

labelName: for(...) {
    ...
}
outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    let input = prompt(`Value at coords (${i},${j})`, '');
    if (!input) break outer;
  }
}
console.log('done');

标签也可以单独一行:

outer:
for (let i = 0; i < 3; i++) {}

switch

用于代替多个 if 判断

switch(x) {
  case 1:  // if (x === 1)
    console.log(1);
  case 2:  // if (x === 2)
    console.log(2);
    break;
  case 3:  // 没有 break 程序将继续往下执行
  case 4:
    conosle.log(34); // if (x === 1 || x === 2)
    break;
  default:
    console.log(0);
    break;
}