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方式循环效率最低