<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)
}
// can't 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)
}
// can't 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)
}
// can't 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)
}
// can't 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方式循环效率最低