分支语句和循环语句

逐步解决方案

步骤 1:理解分支语句

条件判断:使用 if 和 else if 进行多层条件判断。
嵌套结构:可以将分支语句嵌入到其他分支中,实现复杂的逻辑。

步骤 2:理解循环语句
重复执行:使用 for, while 或 do…while 循环控制程序的执行次数。
条件判断:根据特定条件决定是否继续执行循环体。

步骤 3:结合分支与循环
嵌套结构:将分支语句嵌入到循环体内,或者反过来使用循环来处理分支中的逻辑。

步骤 4:应用示例 - 计算最大公约数(GCD)

1
2
3
4
5
6
7
8
function gcd(a, b) {
while (b !== 0) {
let temp = b;
b = a % b;
a = temp;
}
return a;
}

显示全部 (9)
步骤 5:应用示例 - 统计元音字母数量

1
2
3
4
5
6
7
8
9
10
function countVowels(str) {
const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
let count = 0;
for (const char of str) {
if (vowels.has(char)) {
count++;
}
}
return count;
}

显示全部 (11)
步骤 6:应用示例 - 计算阶乘

1
2
3
4
5
6
7
8
9
10
function factorial(n) {
if (n < 0) {
throw new Error("Factorial not defined for negative values.");
}
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}

显示全部 (11)
最终答案
通过掌握分支语句和循环语句的使用,可以有效地解决问题。以下是对问题的逐步解答:

分支语句:用于在程序运行中根据条件执行不同的代码块。
循环语句:用于重复执行同一段代码,直到满足特定条件。
嵌套结构:将分支和循环嵌入到其他结构中,实现复杂的逻辑控制。

switch

什么是 Switch 语句?

Switch 语句是一种控制结构,用于根据一个表达式的结果来执行不同的代码块。它类似于其他编程语言中的多路选择(如 C 语言的 switch-case)。

基本语法

1
2
3
4
5
6
7
8
9
10
11
switch (expression) {
case value1:
// 执行的代码块
break;
case value2:
// 执行的代码块
break;
default:
// 默认执行的代码块
break;
}

功能说明
expression:一个表达式,其结果决定了执行哪个 case。
value1, value2 等:可能是一个具体的值或一个模式匹配的结果。
break;:结束当前的 case,并执行下一个代码块。
与 if-else 的区别
Switch 语句允许多个 case,并且每个 case 可以有复杂的模式匹配(如正则表达式)。此外,switch 语句还能使用 default 标识符来处理所有未匹配的情况。

示例 1:简单 switch 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
let age = 20;

switch (age) {
case 0-19:
console.log("小于20岁的人");
break;
case 20-29:
console.log("20岁到29岁的年轻人");
break;
default:
console.log("其他人");
break;
}

输出:

TEXT
20岁到29岁的年轻人
示例 2:使用正则表达式

1
2
3
4
5
6
7
8
9
10
let str = "Hello";

switch(str) {
case /^H/:
console.log("以H开头的字符串");
break;
default:
console.log("不以H开头的字符串");
break;
}

输出:

TEXT
以H开头的字符串
示例 3:组合 switch 和 if

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let score = 85;

switch(score) {
case 100:
case 90-100:
console.log("满分");
break;
case 80-89:
console.log("优秀");
break;
default:
console.log("一般");
break;
}

if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}

示例 4:使用 switch 处理不同类型的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let data = "integer";

switch(data) {
case 'integer':
case 'float':
console.log("数据类型为 number");
break;
case 'string':
console.log("数据类型为 string");
break;
default:
console.log("未知的数据类型");
break;
}

输出:

1
数据类型为 number

总结

Switch 语句非常适合处理需要根据多个条件执行不同代码块的场景,尤其是当这些条件可以使用正则表达式或复杂的模式匹配时。它使得代码更加清晰和易于维护。

在实际项目中,switch 语句通常用于:

根据数据类型(如 number, string, object 等)进行分类。
根据输入的值范围(如年龄、分数等)进行分组处理。
处理需要多个分支条件的情况,且这些条件可以复用。

三元运算符

三元运算符是一种在JavaScript中用于在两种情况之间选择一个值的运算符。它是一种简洁的条件表达式,可以将一个 if 语句压缩为一行代码。

语法

1
condition ? expression_if_true : expression_if_false

condition:一个需要进行判断的表达式(通常是布尔值)。
expression_if_true:如果 condition 为真时执行的表达式。
expression_if_false:如果 condition 为假时执行的表达式。

功能

三元运算符可以将一个复杂的 if…else 结构简化为一行代码,同时保持逻辑清晰。

使用示例
简单条件判断:

1
2
let a = 5;
console.log(a > 0 ? "a is positive" : "a is not positive"); // 输出:"a is positive"

注意事项
优先级:三元运算符的优先级低于算术运算符(如 +, -, *, / 等),但高于比较运算符。因此,在复杂的表达式中,可能需要使用括号来明确运算顺序。

1
console.log(3 + 5 > 2 ? "真" : "假"); // 输出:"真"

简洁性:虽然三元运算符可以简化代码,但它并不总是更适合所有情况。在复杂的逻辑中,if…else 结构可能更清晰易读。

总结

三元运算符是一种非常有用的工具,可以帮助我们将 if…else 结构压缩为一行代码,并且保持逻辑清晰。它特别适合简单的条件判断场景,但在处理复杂的逻辑时,可能会显得不够直观。因此,在使用三元运算符时,请注意以下几点:

使用括号明确运算顺序。
在复杂的逻辑中,优先选择清晰的 if…else 结构。
三元运算符可以与数组或对象进行结合(如练习题中的 map 或 filter 方法)。

遍历数组

循环遍历

使用循环结构逐个访问数组中的每个元素。

步骤:

初始化一个变量作为索引,通常从0开始。
确定循环结束条件,通常是索引小于数组长度。
在每次迭代中,访问当前索引对应的元素,并执行需要的操作。
更新索引值,继续下一个循环。
示例代码:

1
2
3
4
let array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
}

递归遍历

通过函数自身调用来逐层处理数组中的每个元素。

步骤:

定义一个递归函数,接受数组和当前索引作为参数。
在函数中检查是否完成了所有元素的遍历(结束条件)。
如果未完成,执行当前操作,并递归调用自己,处理下一个元素。
更新递归时使用的索引值。
示例代码:

1
2
3
4
5
6
7
8
9
10
function recursiveLoop(array, index = 0) {
if (index >= array.length) {
return;
}
console.log(array[index]);
recursiveLoop(array, index + 1);
}

let array = [1, 2, 3, 4, 5];
recursiveLoop(array);

总结
循环遍历适合处理大部分数组操作,因为它简单且效率高。而递归遍历适用于需要逐层处理或分阶段完成任务的情况,但需注意避免栈溢出问题。

通过理解和实践这两种方法,可以更好地掌握数组遍历的实现与应用。

增删改查

  1. 增(Insert)
    push(): 将元素添加到数组末尾。
1
2
let arr = [1, 2, 3];
arr.push(4); // 现在arr是[1, 2, 3, 4]

unshift(): 将元素插入到数组最前面。

1
2
let arr = [1, 2, 3];
arr.unshift(0); // 现在arr是[0, 1, 2, 3]

splice(index, [number]): 删除指定索引处的元素,并将新元素插入到该位置之前的位置。

1
2
let arr = [1, 2, 3];
arr.splice(1, 0, 4); // 现在arr是[1, 4, 2, 3]
  1. 删(Delete)
    pop(): 删除并返回数组的最后一个元素。
1
2
let arr = [1, 2, 3];
poppedValue = arr.pop(); // poppedValue是3,现在arr是[1, 2]

indexOf(element): 返回指定元素的第一个索引位置。如果找不到该元素,则返回-1。

1
2
let arr = [1, 2, 3];
index = arr.indexOf(2); // index是1

splice(index, removeItemCount=0): 删除指定索引处的元素。

1
2
let arr = [1, 2, 3];
arr.splice(0, 1); // 现在arr是[2, 3]
  1. 改(Update)
    直接赋值: 访问数组中特定索引的位置并将其值修改。
1
2
let arr = [1, 2, 3];
arr[0] = 4; // 现在arr是[4, 2, 3]

使用slice()和concat(): 复制数组的一部分,修改后的内容再合并回原数组。

1
2
3
let arr = [1, 2, 3];
let updatedPart = arr.slice(0, 1); // 取前两个元素
updatedPart[0] = 5; // 修改第一个元素为5

arr = updatedPart.concat(arr.slice(1)); // 现在arr是[5, 3]

  1. 查(Search)

indexOf(element): 返回指定元素的第一个索引位置,或-1表示不存在。

1
2
let arr = [1, 2, 3];
index = arr.indexOf(2); // index是1

includes(element): 返回布尔值,判断数组中是否存在该元素。

1
2
let arr = [1, 2, 3];
console.log(arr.includes(4)); // 输出false

通过这些方法的学习和实践,可以高效地进行数组的增删改查操作。选择合适的方法根据具体需求,既能提高代码效率,也能让代码更加简洁易懂。