# 13.遍历数据的方法
编程思想、推荐使用
# for 和 while
- 可以 continue 和 break
- 可以改变原数组
# for...in 和 for...of
for in 一般用来遍历对象的 key、for of 一般用来遍历数组的 value 因为 for … in 语法是第一个能够迭代对象键的 JavaScript 语句,循环对象键({})与在数组([])上进行循环不同,引擎会执行一些额外的工作来跟踪已经迭代的属性。因此不建议使用 for...in 来遍历数组
- for...in
- 迭代可枚举属性
- 可以获取对象的原型方法
- for...of
- 遍历可迭代属性(可迭代对象,包括 Array,Map,Set,String,TypedArray,arguments 对象)
- for of 不可以遍历普通对象(xxx is not iterable)
以遍历 Array 作为例子
Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};
let iterable = [3, 5, 7];
iterable.foo = "hello";
for (let i in iterable) {
console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}
for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // logs 0, 1, 2, "foo"
}
}
for (let i of iterable) {
console.log(i); // logs 3, 5, 7
}
Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};
let iterable = [3, 5, 7];
iterable.foo = "hello";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# foreach 和 map
- foreach
- 可以改变原数组
- 不能 continue 和 break
- 返回 undefined
- map
- 不可以改变原数组
- 不能 continue 和 break
- 返回一个新的数组
# filter、every、some、reduce(类 foreach)
- filter:筛选,返回符合条件的数组列表
- every(some):该方法测试一个数组内的所有(只要有)元素是否都能通过某个指定函数的测试,默认是 return false
# reduce(类 map)
# 遍历方法性能对比
- for 循环遍历 < for...of 遍历、forEach 遍历 < for...in 遍历、map 遍历
原因:
- map 要生成新数组,push 等操作。
- for...in 要迭代原型链