流程控制
条件语句
// if 条件语句
if (表达式) {
// do something
} else { };
// switch 条件语句
switch (表达式) {
case value1:
yuju1;
break; // 如果 case 里面没有 break,则不会退出,而是继续执行下一个 case
case value2:
yuju2;
break;
default:
yuju3;
三元表达式
条件表达式 ? 表达式1 : 表达式2
如果条件表达式结果为真,则返回表达式 1 的值,如果条件表达式结果为假,则返回表达式 2 的值
循环语句
// for 循环
for (let i = 1; i <= 100; i++) {
// 语句;
}
// while 循环
while (表达式) {
// 循环体;
// 更新表达式;
}
do {
// 循环体;
// 更新表达式;
} while (条件表达式);
🔁 for...in 循环
✅ 用途:
- 遍历对象的可枚举属性的键名(字符串)
- 包括该对象自身的属性和继承自原型链的属性
⚠️ 注意点:
- 返回的是 属性名(key),而不是值
- 在遍历数组时,也会返回字符串类型的下标(如 "0"、"1"),不推荐用于数组
✅ 示例:
const obj = { a: 1, b: 2 };
for (const key in obj) {
console.log(key); // 输出: 'a', 'b'
}
const arr = [10, 20, 30];
for (const index in arr) {
console.log(index); // 输出: '0', '1', '2'(是字符串类型)
console.log(arr[index]); // 输出: 10, 20, 30
}
🔁 for...of 循环
✅ 用途:
- 遍历可迭代对象(实现了 Symbol.iterator 接口的对象)
✅ 可迭代的常见对象:
- Array、String、Map、Set、arguments、NodeList 等
❌ 普通对象不能直接用 for...of
:
const obj = { a: 1, b: 2 };
for (const value of obj) {
// ❌ TypeError: obj is not iterable
console.log(value);
}
✅ 示例:
const arr = [10, 20, 30];
for (const value of arr) {
console.log(value); // 输出: 10, 20, 30
}
const str = "hello";
for (const char of str) {
console.log(char); // 输出: 'h', 'e', 'l', 'l', 'o'
}
🆚 总结对比表:
特性 | for...in | for...of |
---|---|---|
遍历内容 | 键名(key) | 值(value) |
遍历目标 | 对象、数组、字符串(会返回索引) | 可迭代对象(数组、字符串、Map、Set) |
是否遍历原型链 | ✅ 是 | ❌ 否(只遍历自身可迭代项) |
是否推荐遍历数组 | ❌ 否 | ✅ 是 |
是否能遍历对象 | ✅ 是 | ❌ 否(除非你手动实现 Symbol.iterator ) |
如果你想遍历对象的键值对并且只遍历自己的属性(不含原型链),推荐这样用:
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
如果有数组、字符串这类结构,直接使用 for...of
更直观清晰。
continue
立即跳出本次循环,继续下一次循环
break
跳出整个循环
错误处理
try
语句允许我们定义在执行时进行错误测试的代码块catch
语句允许我们定义当 try 代码块发生错误时,所执行的代码块throw
语句允许您创建自定义错误,new 一个内置的 Error 对象实例finally
使您能够执行代码,在 try 和 catch 之后,无论结果如何
try {
tryCode; // 尝试执行代码块
} catch (error) {
catchCode; // 捕获错误的代码块
} finally {
finallyCode; // 无论 try|catch 结果如何都会执行的代码块
}
function demo() {
const date = Date.now();
if (date % 2 === 0) {
console.log("OK");
} else {
throw new Error("错误"); // 抛出一个错误对象
}
}
// try catch 通常和 axios 一起使用,配合 async await 处理异步请求
// 不过可以使用请求拦截器批量处理所有错误
async function getDog() {
try {
const result = await axios.get("url");
dogList.push(result.data.message);
} catch (error) {
alert(error);
}
}