重新回顾JS的笔记系列(四)

重新回顾JS的笔记系列(四)

1.条件分支
  • if语句

if(...) 语句计算括号里的条件表达式,如果计算结果是 true,就会执行对应的代码块。

示例:

let year = prompt('In which year was ECMAScript-2015 specification published?', '');

if (year == 2015) alert( 'You are right!' );
  • else

if 语句有时会包含一个可选的 “else” 块。如果判断条件不成立,就会执行它内部的代码。

示例:

let year = prompt('In which year was ECMAScript-2015 specification published?', '');

if (year == 2015) {
  alert( 'You guessed it right!' );
} else {
  alert( 'How can you be so wrong?' ); // 2015 以外的任何值
}
  • else if

有时我们需要测试一个条件的几个变体。我们可以通过使用 else if 子句实现。

let year = prompt('In which year was ECMAScript-2015 specification published?', '');

if (year < 2015) {
  alert( 'Too early...' );
} else if (year > 2015) {
  alert( 'Too late' );
} else {
  alert( 'Exactly!' );
}
  • 三目运算符 ? :
let result = condition ? value1 : value2;

计算条件结果,如果结果为真,则返回 value1,否则返回 value2

注意:此处还存在多个?的形式。

示例:

let age = prompt('age?', 18);

let message = (age < 3) ? 'Hi, baby!' :
  (age < 18) ? 'Hello!' :
  (age < 100) ? 'Greetings!' :
  'What an unusual age!';

alert( message );
  1. 第一个问号检查 age < 3
  2. 如果为真 — 返回 'Hi, baby!'。否则,会继续执行冒号 ":" 后的表达式,检查 age < 18
  3. 如果为真 — 返回 'Hello!'。否则,会继续执行下一个冒号 ":" 后的表达式,检查 age < 100
  4. 如果为真 — 返回 'Greetings!'。否则,会继续执行最后一个冒号 ":" 后面的表达式,返回 'What an unusual age!'
2.逻辑运算符

JavaScript 中有四个逻辑运算符:||(或),&&(与),!(非),??(空值合并运算符)。

  • ||(或)

在传统的编程中,逻辑或仅能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 true,否则返回 false

示例:

let hour = 12;
let isWeekend = true;

if (hour < 10 || hour > 18 || isWeekend) {
  alert( 'The office is closed.' ); // 是周末
}

**注意:**JS中的特殊例子

result = value1 || value2 || value3;

或运算符 || 做了如下的事情:

  1. 从左到右依次计算操作数。

  2. 处理每一个操作数时,都将其转化为布尔值。如果结果是 true,就停止计算,返回这个操作数的初始值。

  3. 如果所有的操作数都被计算过(也就是,转换结果都是 false),则返回最后一个操作数。

例子:

alert( 1 || 0 ); // 1(1 是真值)

alert( null || 1 ); // 1(1 是第一个真值)
alert( null || 0 || 1 ); // 1(第一个真值)

alert( undefined || null || 0 ); // 0(都是假值,返回最后一个值)

使用这个性质可以从几个数据当中挑选出真值。

  • &&(与)

在传统的编程中,当两个操作数都是真值时,与运算返回 true,否则返回 false

示例:

let hour = 12;
let minute = 30;

if (hour == 12 && minute == 30) {
  alert( 'Time is 12:30' );
}

注意:类似或,与也有特殊性质。

给出多个参加与运算的值:

result = value1 && value2 && value3;

与运算 && 做了如下的事:

  1. 从左到右依次计算操作数。

  2. 在处理每一个操作数时,都将其转化为布尔值。如果结果是 false,就停止计算,并返回这个操作数的初始值。

  3. 如果所有的操作数都被计算过(例如都是真值),则返回最后一个操作数。

例如:

// 如果第一个操作数是真值,
// 与运算返回第二个操作数:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5

// 如果第一个操作数是假值,
// 与运算将直接返回它。第二个操作数会被忽略
alert( null && 5 ); // null
alert( 0 && "no matter what" ); // 0
  • !(非)

逻辑非运算符接受一个参数,并按如下运作:

  1. 将操作数转化为布尔类型:true/false
  2. 返回相反的值。

例如:

alert( !true ); // false
alert( !0 ); // true

特殊用法:可以使用两个非运算将某个值转换为布尔类型:

alert( !!"non-empty string" ); // true
alert( !!null ); // false
3.空值合并运算符

空值合并运算符的写法为两个问号 ??

a ?? b 的结果是:

  • 如果 a 是已定义的,则结果为 a
  • 如果 a 不是已定义的,则结果为 b

换句话说,如果第一个参数不是 null/undefined,则 ?? 返回第一个参数。否则,返回第二个参数。

例如:

let user;

alert(user ?? "匿名"); // 匿名(user 未定义)

可以看出来它的作用和或有点类似。

但是存在一定的差别:

  • || 返回第一个 值。
  • ?? 返回第一个 已定义的 值。

示例:

let height = 0;

alert(height || 100); // 100
alert(height ?? 100); // 0
  • height || 100 首先会检查 height 是否为一个假值,它是 0,确实是假值。

**注意:**JavaScript 禁止将 ?? 运算符与 &&|| 运算符一起使用

4.基础循环
  • while循环

语法如下:

while (condition) {
  // 代码
  // 所谓的“循环体”
}

condition 为真时,执行循环体的 code

示例:

let i = 0;
while (i < 3) { // 依次显示 0、1 和 2
  alert( i );
  i++;
}
  • do···while循环

语法:

do {
  // 循环体
} while (condition);

循环首先执行循环体,然后检查条件,当条件为真时,重复执行循环体。

例如:

let i = 0;
do {
  alert( i );
  i++;
} while (i < 3);
  • for循环

语法:

for (begin; condition; step) {
  // ……循环体……
}

我们通过示例来了解一下这三个部分的含义。下述循环从 i 等于 03(但不包括 3)运行 alert(i)

for (let i = 0; i < 3; i++) { // 结果为 0、1、2
  alert(i);
}

注意:

  1. for循环的三个部分都是可以删去的。

  2. 三种循环都可以直接使用 break 指令强制退出

  3. continue 指令是 break 的“轻量版”。它不会停掉整个循环。而是停止当前这一次迭代

示例:

for (let i = 0; i < 10; i++) {

  //如果为真,跳过循环体的剩余部分。
  if (i % 2 == 0) continue;

  alert(i); // 1,然后 3,5,7,9
}
  • 标签

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

labelName: for (...) {
  ...
}

break <labelName> 语句跳出循环至标签处:

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; // (*)

    // 用得到的值做些事……
  }
}

alert('Done!');

上述代码中,break outer 向上寻找名为 outer 的标签并跳出当前循环。

因此,控制权直接从 (*) 转至 alert('Done!')


Last modified on 2023-03-04