1.数组常用的迭代方法
- for 迭代素组最快的方法,不能接受返回值
- for of 可以迭代任何可迭代的,数组只可迭代的其中一种,不能接受返回值
- map 接受参数(value, index, array),项目值、索引、和项目本身 可以接受返回值
- forEach 接受参数(value, index, array),项目值、索引、和项目本身 不能接受返回值
- filter 接受参数(value, index, array),项目值、索引、和项目本身,返回符合条件的元素
- reduce 接受参数(total, value, index, array),每次循环的返回值,项目值、索引、和项目本身,可以接受返回值,返回值是total
- every 接受参数(value, index, array),项目值、索引、和项目本身,返回值是布尔值,&&的意思
- some 接受参数(value, index, array),项目值、索引、和项目本身,返回值是布尔值,||的意思
这么多方法哪个快呢??
测试条件:循环一个10万长度的素组看看速度
//数组迭代方法
let arr = [...new Array(10000000).keys()]
// for
let date1 = new Date()
for (let i = 0; i < arr.length; i++) {
arr[i] * 2
}
console.log(`for循环需要的时间:${new Date() - date1}`);
// for of
let date2 = new Date()
for (let k of arr) {
k * 2
}
console.log(`for of 循环需要的时间:${new Date() - date2}`);
// forEach
let date3 = new Date()
arr.forEach(item => {
item * 2
})
console.log(`forEach 循环需要的时间:${new Date() - date3}`);
// map
let date4 = new Date()
arr.map(item => {
item * 2
})
console.log(`map 循环需要的时间:${new Date() - date4}`);
// filter
let date5 = new Date()
arr.filter(item => {
item * 2
})
console.log(`filter 循环需要的时间:${new Date() - date5}`);
let arr2 = [...new Array(10).keys()]
// reduce
let date6 = new Date()
arr.reduce((val, item) => {
item * 2
})
console.log(`reduce 循环需要的时间:${new Date() - date6}`);
// every
let date7 = new Date()
arr.every((item) => {
item * 2
})
console.log(`every 循环需要的时间:${new Date() - date7}`);
// some
let date8 = new Date()
arr.some((item) => {
item * 2
})
console.log(`some 循环需要的时间:${new Date() - date8}`);
结果:
for 最快,forEach要比map快很多,经常用map的小伙伴注意了,当然它们每个方法都有自己的特点,根据场景选择方法。
这些方法会不会改变原来的数组的值呢???
这里我直接写结论,, 对于数组里面的基本元素,以上方法都不会改变,但是对于数组里面的引用类型数据会改变,因为这些方法都是将素组元素浅拷贝传给你调用的
let arr1 = [{}, {}]
arr1.forEach(item => {
item.name = "forEach"
});
console.log(arr1)
arr1.map(item => {
item.name = "map"
})
console.log(arr1)
for (let i of arr1) {
i.name = "of"
}
console.log(arr1)
arr1.filter(item => {
item.name = "filter"
})
console.log(arr1)
arr1.reduce((t, item) => {
item.name = "reduce"
})
console.log(arr1)
arr1.some(item => {
item.name = "some"
})
console.log(arr1)
arr1.every(item => {
item.name = "every"
})
console.log(arr1)
结果如下:
可以看到都会改变.