js各种数组循环方法和效率等对比
<script>
function op(item) {
item.name = item.name + W
}
function normalFor(arr) {
let start = new Date().getTime()
for (let j = 0; j < arr.length; j++) {
op(arr[j])
}
let end = new Date().getTime()
console.log(normalfor:, end - start, arr[arr.length / 2 - 1].name)
}
function opNormalFor(arr) {
let start = new Date().getTime()
let len = arr.length
for (let j = 0; j < len; j++) {
op(arr[j])
}
let end = new Date().getTime()
console.log(opNormalfor:, end - start, arr[arr.length / 2 - 1].name)
}
// cant use break,无法中断循环,函数返回数据越复杂时间越长
function eachFor(arr) {
let start = new Date().getTime()
arr.forEach((item, index, arr) => {
op(item)
return {} //返回数据越复杂时间越长
})
let end = new Date().getTime()
console.log(Eachfor:, end - start, arr[arr.length / 2 - 1].name)
}
// cant use break,无法中断循环
function mapFor(arr) {
let start = new Date().getTime()
arr.map((item, index, arr) => {
op(item)
})
let end = new Date().getTime()
console.log(mapfor:, end - start, arr[arr.length / 2 - 1].name)
}
function inFor(arr) {
let start = new Date().getTime()
for (let val in arr) {
op(val)
}
let end = new Date().getTime()
console.log(inFor:, end - start, arr[arr.length / 2 - 1].name)
}
function ofFor(arr) {
let start = new Date().getTime()
for (let val of arr) {
op(val)
}
let end = new Date().getTime()
console.log(ofFor:, end - start, arr[arr.length / 2 - 1].name)
}
// cant use break, 返回true就中断循环
function someFor(arr) {
let start = new Date().getTime()
arr.some(function (item, index, array) {
op(item);
return false //true就中断循环
})
let end = new Date().getTime()
console.log(someFor:, end - start, arr[arr.length / 2 - 1].name)
}
// cant use break,返回false就中断循环
function everyFor(arr) {
let start = new Date().getTime()
arr.every(function (item, index, array) {
op(item);
return true //false就中断循环
})
let end = new Date().getTime()
console.log(everyFor:, end - start, arr[arr.length / 2 - 1].name)
}
let arr = []
for (j = 0, len = 2000000; j < len; j++) {
arr.push({
id: j,
name: name + j,
age: j + 1
})
}
normalFor(arr) //修改val会影响原始数组
opNormalFor(arr) //修改val会影响原始数组
eachFor(arr) //item是对象会影响原始数组,如果是数字或字符不会影响原始数组
mapFor(arr) //item是对象会影响原始数组,如果是数字或字符不会影响原始数组
inFor(arr) //修改item不会影响原始数组, item理解为数组成员的深拷贝
ofFor(arr) //item是对象会影响原始数组,如果是数字或字符不会影响原始数组
someFor(arr) //item是对象会影响原始数组,如果是数字或字符不会影响原始数组
everyFor(arr) //item是对象会影响原始数组,如果是数字或字符不会影响原始数组
</script>
效率对比:for in方式循环效率最低
