Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

原生JS中 forEach 和 Map 区别 #12

Open
Hancoson opened this issue Apr 2, 2017 · 1 comment
Open

原生JS中 forEach 和 Map 区别 #12

Hancoson opened this issue Apr 2, 2017 · 1 comment

Comments

@Hancoson
Copy link
Owner

Hancoson commented Apr 2, 2017

最近看到关于数组遍历的东西,顺便总结一下 forEach()map() 遍历数组方法的区别。这两个方法都是 ES5 中新增的,当然说到新增方法,不能不提它们的兼容性:IE 9+,哈哈……又是 IE

原生JS forEach()和map()遍历

共同点:

  • 都可以用来便利数组的每一项
  • forEach()map() 都支持3个参数,即(item,index,Array),第一个是遍历的当前项,第二个是当前项的下标,第三个是原数组
  • 匿名函数中的this都是指windown
  • 都是智能遍历数组

forEach()

  • 没有返回值
  • forEach方法中的this是ary,匿名回调函数中的this默认是window;
  • 数组中有几项,那么传递进去的匿名回调函数就需要执行几次
  • 理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是可以自己通过数组的索引来修改原来的数组
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);//--> 通过数组索引改变了原数组;  

map()

[].map(); 基本用法跟forEach方法类似:

  • 回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了)
var ary = [1,2,3,4,5];  
var res = ary.map(function (item,index,input) {  
    return item*10;  
})  
console.log(res);//-->[10,20,30,40,50];  原数组拷贝了一份,并进行了修改
console.log(ary);//-->[1,2,3,4,5];  原数组并未发生变化

兼容

结下来安利一下浏览器兼容的问题:

  • 不管是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;  
}  

jQuery $.each()和$.map()遍历

共同点:

  • 即可遍历数组,又可遍历对象。

$.each()

  • 没有返回值。$.each()里面的匿名函数支持2个参数:当前项的索引i,数组中的当前项v。如果遍历的是对象,k 是键,v 是值。

$.map()

有返回值,可以return 出来。$.map()里面的匿名函数支持2个参数和$.each()里的参数位置相反:数组中的当前项v,当前项的索引 i。如果遍历的是对象,k 是键,v 是值。

原文地址

@Hancoson
Copy link
Owner Author

Hancoson commented Jan 3, 2018

借用网上一张图片来拓展一下:
map拓展

来源:水乙

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant