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

经验分享 程序员 微信小程序 职场和发展