JavaScript基础阶段二
分支语句和循环语句
逐步解决方案
步骤 1:理解分支语句
条件判断:使用 if 和 else if 进行多层条件判断。
嵌套结构:可以将分支语句嵌入到其他分支中,实现复杂的逻辑。
步骤 2:理解循环语句
重复执行:使用 for, while 或 do…while 循环控制程序的执行次数。
条件判断:根据特定条件决定是否继续执行循环体。
步骤 3:结合分支与循环
嵌套结构:将分支语句嵌入到循环体内,或者反过来使用循环来处理分支中的逻辑。
步骤 4:应用示例 - 计算最大公约数(GCD)
1 | function gcd(a, b) { |
显示全部 (9)
步骤 5:应用示例 - 统计元音字母数量
1 | function countVowels(str) { |
显示全部 (11)
步骤 6:应用示例 - 计算阶乘
1 | function factorial(n) { |
显示全部 (11)
最终答案
通过掌握分支语句和循环语句的使用,可以有效地解决问题。以下是对问题的逐步解答:
分支语句:用于在程序运行中根据条件执行不同的代码块。
循环语句:用于重复执行同一段代码,直到满足特定条件。
嵌套结构:将分支和循环嵌入到其他结构中,实现复杂的逻辑控制。
switch
什么是 Switch 语句?
Switch 语句是一种控制结构,用于根据一个表达式的结果来执行不同的代码块。它类似于其他编程语言中的多路选择(如 C 语言的 switch-case)。
基本语法
1 | switch (expression) { |
功能说明
expression:一个表达式,其结果决定了执行哪个 case。
value1, value2 等:可能是一个具体的值或一个模式匹配的结果。
break;:结束当前的 case,并执行下一个代码块。
与 if-else 的区别
Switch 语句允许多个 case,并且每个 case 可以有复杂的模式匹配(如正则表达式)。此外,switch 语句还能使用 default 标识符来处理所有未匹配的情况。
示例 1:简单 switch 语句
1 | let age = 20; |
输出:
TEXT
20岁到29岁的年轻人
示例 2:使用正则表达式
1 | let str = "Hello"; |
输出:
TEXT
以H开头的字符串
示例 3:组合 switch 和 if
1 | let score = 85; |
示例 4:使用 switch 处理不同类型的数据
1 | let data = "integer"; |
输出:
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 | let a = 5; |
注意事项
优先级:三元运算符的优先级低于算术运算符(如 +, -, *, / 等),但高于比较运算符。因此,在复杂的表达式中,可能需要使用括号来明确运算顺序。
1 | console.log(3 + 5 > 2 ? "真" : "假"); // 输出:"真" |
简洁性:虽然三元运算符可以简化代码,但它并不总是更适合所有情况。在复杂的逻辑中,if…else 结构可能更清晰易读。
总结
三元运算符是一种非常有用的工具,可以帮助我们将 if…else 结构压缩为一行代码,并且保持逻辑清晰。它特别适合简单的条件判断场景,但在处理复杂的逻辑时,可能会显得不够直观。因此,在使用三元运算符时,请注意以下几点:
使用括号明确运算顺序。
在复杂的逻辑中,优先选择清晰的 if…else 结构。
三元运算符可以与数组或对象进行结合(如练习题中的 map 或 filter 方法)。
遍历数组
循环遍历
使用循环结构逐个访问数组中的每个元素。
步骤:
初始化一个变量作为索引,通常从0开始。
确定循环结束条件,通常是索引小于数组长度。
在每次迭代中,访问当前索引对应的元素,并执行需要的操作。
更新索引值,继续下一个循环。
示例代码:
1 | let array = [1, 2, 3, 4, 5]; |
递归遍历
通过函数自身调用来逐层处理数组中的每个元素。
步骤:
定义一个递归函数,接受数组和当前索引作为参数。
在函数中检查是否完成了所有元素的遍历(结束条件)。
如果未完成,执行当前操作,并递归调用自己,处理下一个元素。
更新递归时使用的索引值。
示例代码:
1 | function recursiveLoop(array, index = 0) { |
总结
循环遍历适合处理大部分数组操作,因为它简单且效率高。而递归遍历适用于需要逐层处理或分阶段完成任务的情况,但需注意避免栈溢出问题。
通过理解和实践这两种方法,可以更好地掌握数组遍历的实现与应用。
增删改查
- 增(Insert)
push(): 将元素添加到数组末尾。
1 | let arr = [1, 2, 3]; |
unshift(): 将元素插入到数组最前面。
1 | let arr = [1, 2, 3]; |
splice(index, [number]): 删除指定索引处的元素,并将新元素插入到该位置之前的位置。
1 | let arr = [1, 2, 3]; |
- 删(Delete)
pop(): 删除并返回数组的最后一个元素。
1 | let arr = [1, 2, 3]; |
indexOf(element): 返回指定元素的第一个索引位置。如果找不到该元素,则返回-1。
1 | let arr = [1, 2, 3]; |
splice(index, removeItemCount=0): 删除指定索引处的元素。
1 | let arr = [1, 2, 3]; |
- 改(Update)
直接赋值: 访问数组中特定索引的位置并将其值修改。
1 | let arr = [1, 2, 3]; |
使用slice()和concat(): 复制数组的一部分,修改后的内容再合并回原数组。
1 | let arr = [1, 2, 3]; |
arr = updatedPart.concat(arr.slice(1)); // 现在arr是[5, 3]
- 查(Search)
indexOf(element): 返回指定元素的第一个索引位置,或-1表示不存在。
1 | let arr = [1, 2, 3]; |
includes(element): 返回布尔值,判断数组中是否存在该元素。
1 | let arr = [1, 2, 3]; |
通过这些方法的学习和实践,可以高效地进行数组的增删改查操作。选择合适的方法根据具体需求,既能提高代码效率,也能让代码更加简洁易懂。