for in 和 for of 的区别?
在 JavaScript 前端开发中,for...in
和 for...of
循环都是用来迭代的,但它们迭代的对象和方式有所不同,导致适用场景也不同。
for...in
循环:
- 迭代对象: 迭代对象的可枚举属性的键名(字符串)。 这包括对象自身的属性以及继承自原型链的属性。
- 迭代方式: 按任意顺序迭代键名。 虽然通常按照属性添加的顺序迭代,但这并非规范保证的。
- 适用场景: 主要用于遍历对象的属性名。 不适合用于数组,因为迭代顺序不保证,而且会迭代原型链上的属性,可能导致非预期的结果。
for...of
循环:
- 迭代对象: 迭代可迭代对象的值。 可迭代对象包括数组、字符串、Map、Set、arguments 对象等实现了
Symbol.iterator
方法的对象。 - 迭代方式: 按顺序迭代值。 对于数组,按照索引顺序迭代;对于字符串,按照字符顺序迭代;对于 Map 和 Set,按照插入顺序迭代。
- 适用场景: 主要用于遍历数组、字符串等的值。 尤其适合需要按顺序处理元素的场景。
总结:
特性 | for...in |
for...of |
---|---|---|
迭代对象 | 可枚举属性的键名 | 可迭代对象的值 |
迭代方式 | 任意顺序 (通常是添加顺序) | 顺序迭代 |
适用场景 | 遍历对象的属性名 | 遍历数组、字符串等的值 |
示例:
const obj = { a: 1, b: 2, c: 3 };
const arr = [1, 2, 3];
// for...in 迭代对象的属性名
for (const key in obj) {
console.log(key, obj[key]); // 输出 a 1, b 2, c 3 (顺序可能不同)
}
// for...of 迭代数组的值
for (const value of arr) {
console.log(value); // 输出 1, 2, 3
}
// for...in 迭代数组 (不推荐)
for (const index in arr) {
console.log(index, arr[index]); // 输出 0 1, 1 2, 2 3 (index 是字符串类型)
// 可能会迭代到原型链上的属性,例如 arr.hasOwnProperty
}
// for...of 迭代字符串
for (const char of "hello") {
console.log(char); // 输出 h, e, l, l, o
}
最佳实践:
- 使用
for...in
遍历对象的属性名。 - 使用
for...of
遍历数组、字符串等的值。 - 避免使用
for...in
遍历数组。
希望这个解释能够帮助你理解 for...in
和 for...of
的区别。