• js中 forEach 和 map 区别


    共同点:

    1、都是循环遍历数组中的每一项。
    
    2、forEach()和map()里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input。
    
    3、匿名函数中的this都是指Window。
    
    4、只能遍历数组。

    不同点:

    1.forEach():

    没有返回值,即返回值为undefined

    arr[].forEach(function(value,index,array){
    
      //do something
    
    })

    参数:value数组中的当前项, index当前项的索引, array原始数组;
    数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
    理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是可以自己通过数组的索引来修改原来的数组,或当数组项为对象时修改对象中的值;

    forEach方法只是操作数据而已,数组里的数据是如何引用的呢? js的数据有基本数据类型和引用数据类型,同时引出堆内存和栈内存的概念。对于基本数据类型:Number、String 、Boolean、Null和Undefined,它们在栈内存中直接存储变量名和值。而Object对象的真实数据存储在堆内存中,它在栈内存中存储的是变量名和堆内存的位置。 而在forEach方法里操作了obj对象,实际操作的是对象本身,而数据只是引用了对象的栈内存地址,所以数组里的数据相应改变。 那么为什么forEach方法不能改变数组里的基本变量呢?因为数组内的基本变量,在栈内存内生成了自己的值,并非引用栈内存的地址。

    var ary = [12,23,24,42,1];  
    var res = ary.forEach(function (item,index,input) {  
           input[index] = item*10;  
    })  
    console.log(res);//--> undefined;  
    console.log(ary);//--> 通过数组索引改变了原数组;  

    2.map():

    有返回值,可以return 出来。

    arr[].map(function(value,index,array){
    
      //do something
    
      return XXX
    
    })

    参数:value数组中的当前项,index当前项的索引,array原始数组;

    区别:map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);
    
    var ary = [12,23,24,42,1];  
    var res = ary.map(function (item,index,input) {  
        return item*10;  
    })  
    console.log(res);//-->[120,230,240,420,10];  原数组拷贝了一份,并进行了修改
    console.log(ary);//-->[12,23,24,42,1];  原数组并未发生变化

    兼容写法:

    不管是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;  
    }  
  • 相关阅读:
    微信小程序 单选按钮 最佳
    微信小程序 单选按钮的实现
    微信小程序 单选框实现
    Java Code To Create Pyramid and Pattern
    Java language
    npm Err! Unexpected end of JSON input while parsing near
    Node.js Express FrameWork Tutorial
    Higher-Order Function Examples
    Create First HTTP Web Server in Node.js: Complete Tutorial
    Node.js NPM Tutorial: Create, Publish, Extend & Manage
  • 原文地址:https://www.cnblogs.com/momo798/p/11649974.html
Copyright © 2020-2023  润新知