js数组遍历的常用的几种方法以及差异和性能优化

<script type="text/javascript">
            /*对比:
            1、map速度比foreach快
            2、map会返回一个新数组,不对原数组产生影响,foreach不会产生新数组,foreach返回undefined
            3、map因为返回数组所以可以链式操作,foreach不能
            4, map里可以用return ,而foreach里用return不起作用,foreach不能用break,会直接报错*/
            /*方法一:*/
            var arr1 = [1, 2, 3, 4, 5, 6];
            for(var i = 0, len = arr1.length; i < len; i++) { //优化性能处理
                console.log(arr1[i], 'for遍历出来的数据'); //每个item  1,2,3,4,5,6
            }
            /*方法二:*/
            /*forEach方法中的function回调支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身*/
            var arr2 = [{
                    name: 'bob',
                    age: 20
                },
                {
                    name: 'tom',
                    age: 18
                },
                {
                    name: 'sos',
                    age: 19
                }
            ]
            arr2.forEach((val, i) => { //没有返回值的,对原来数组也没有影响
                console.log(val, '遍历出来的每个obj')
            });
            /*方法三:*/
            var fruits = [1, 2, 3, 4, 5, 6, 7, 8];
            let arr = fruits.map((item, index) => {
                console.log(item, 'top')
                console.log(index, 'top')
                return item * 8
            })
            console.log(arr, 'newarr') //[8, 16, 24, 32, 40, 48, 56, 64] "newarr"
            var a = fruits.indexOf("Apple", 4);
            console.log(a)
            //for 和 forEach都是普通循环,map 带返回值并且返回一个新数组;
            /*
             *当前元素的值,当期元素的索引值,当期元素属于的数组对象;
            语法:array.map(function(currentValue,index,arr), thisValue)
            map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
            map() 方法按照原始数组元素顺序依次处理元素。
            注意: map() 不会对空数组进行检测。
            注意: map() 不会改变原始数组。
             * */
            /*方法四:*/
            /*兼容写法:
            不管是forEach还是map在IE6 - 8 下都不兼容( 不兼容的情况下在Array.prototype上没有这两个方法), 那么需要我们自己封装一个都兼容的方法:*/
            /**
             * forEach遍历数组
             * @param callback [function] 回调函数;
             * @param context [object] 上下文;
             */
            Array.prototype.myForEach = function myForEach(callback, context) {
                context = context || window;
                if('forEach' in Array.prototye) {
                    this.forEach(callback, context);
                    return;
                }
                //IE6-8下自己编写回调函数执行的逻辑
                for(var i = 0, len = this.length; i < len; i++) {
                    callback && callback.call(context, this[i], i, this);
                }
            }
            /**
             * map遍历数组
             * @param callback [function] 回调函数;
             * @param context [object] 上下文;
             */
            Array.prototype.myMap = function myMap(callback, context) {
                context = context || window;
                if('map' in Array.prototye) {
                    return this.map(callback, context);
                }
                //IE6-8下自己编写回调函数执行的逻辑var newAry = [];
                for(var i = 0, len = this.length; i < len; i++) {
                    if(typeof callback === 'function') {
                        var val = callback.call(context, this[i], i, this);
                        newAry[newAry.length] = val;
                    }
                }
                return newAry;
            }
        </script>

猜你喜欢

转载自www.cnblogs.com/lhl66/p/9098126.html