JavaScript中的循环结构是编写程序时用于重复执行代码块的一种控制结构。主要的循环结构包括for循环和while循环。递归是另外一种控制流程,它允许函数调用自身,适用于解决可以分解为更小相似问题的任务。
for循环是一种预设循环控制结构,它在循环开始之前初始化一个计数器,然后在每次循环结束时进行更新,直到指定的条件不再为真时停止。在JavaScript中,for循环的基本语法是:
```javascript
for (初始化表达式; 循环条件表达式; 更新表达式) {
// 循环体代码
}
```
例如,使用for循环遍历一个数组:
```javascript
var fruits = ["apple", "banana", "cherry"];
for (var i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
```
其中,`i` 是计数器变量,初始化为0,循环条件是 `i < fruits.length`,更新表达式是 `i++`。
while循环是一个条件控制循环,它会重复执行代码块直到给定条件不再为真。它的基本语法是:
```javascript
while (条件表达式) {
// 循环体代码
}
```
例如,使用while循环执行相同的操作:
```javascript
var i = 0;
var fruits = ["apple", "banana", "cherry"];
while (i < fruits.length) {
console.log(fruits[i]);
i++;
}
```
在使用while循环时需注意,如果条件一直为真,则会形成死循环,导致浏览器“hang掉”。
递归是一种通过函数自己调用自己来解决问题的方法。它通常用于解决那些可以将问题规模缩小的场景。递归函数必须有一个基本情况(base case),这是不需要递归调用的点,以避免无限循环。同时,每次递归调用都应该使问题规模变得更小。例如,使用递归来实现字符串的substring方法:
```javascript
function substring(str, start, end) {
if (start >= end) {
return str[start];
} else {
return str[start] + substring(str, start + 1, end);
}
}
console.log(substring("eclipse", 1, 4)); // 输出 "cli"
```
在这个例子中,基本情况是当 `start` 等于 `end` 时,返回对应的字符。
循环访问对象的属性通常使用for-in循环结构。它遍历对象的所有可枚举属性,包括那些继承的属性。例如:
```javascript
var person = {
name: "Morgan Jones",
telephone: "(650)777-7777",
email: "morgan.***"
};
for (var propertyName in person) {
console.log(propertyName + ":" + person[propertyName]);
}
```
上述代码会输出对象person的所有属性及其值。
循环查找数组内的数据可以使用嵌套的for循环来实现,如示例所示:
```javascript
var table = [
["Person", "Age", "City"],
["Sue", 22, "San Francisco"],
["Joe", 45, "Halifax"]
];
for (var r = 0; r < table.length; r++) {
var rowText = "";
for (var c = 0; c < table[r].length; c++) {
rowText += table[r][c];
if (c < table[r].length - 1) {
rowText += "\t";
}
}
console.log(rowText);
}
```
这段代码会遍历二维数组 `table` 并输出每一行的内容。
使用 `break` 关键字可以立即退出循环,无论是在for循环还是while循环中。它通常用于跳出最内层的循环,但也可以与标签一起使用来跳出外层循环:
```javascript
for (var i = 0; i < 10; i++) {
if (i > 5) {
break;
}
}
```
上述代码在 `i` 大于5时退出循环。
以上内容涵盖了JavaScript中for循环、while循环以及递归的基本用法。掌握这些基本结构对编写高效、可维护的JavaScript代码至关重要。在实际开发中,合理选择和使用这些控制流结构能够帮助开发者解决各种编程问题,并优化代码的可读性和性能。