其中一个重要的区别是,each返回的是原来的数组,并不会新创建一个数组。而map方法会返回一个新的数组。如果在没有必要的情况下使用map,则有可能造成内存浪费。
例如:
var items = [1,2,3,4];
$.each(items, function() {
alert('this is ' + this);
});
var newItems = $.map(items, function(i) {
return i + 1;
});
// newItems is [2,3,4,5]
使用each时,改变的还是原来的items数组,而使用map时,不改变items,只是新建一个新的数组。
例如:
var items = [0,1,2,3,4,5,6,7,8,9];
var itemsLessThanEqualFive = $.map(items, function(i) {
// removes all items > 5
if (i > 5)
return null;
return i;
});
// itemsLessThanEqualFive = [0,1,2,3,4,5]
当需要对数组进行删除时也是如此,所以删除时错误使用each或map后果还是蛮严重的。
each的js实现
function each(obj, fn) {
if (!fn) {
return;
}
if (obj instanceof Array) {//数组
var i = 0, len = obj.length;
for (; i < len; i++) {
if (fn.call(obj[i],i)==false) {
break;
}
}
}
else if (typeof obj === 'object') {//对象
var j = null;
for (j in obj) {
if (fn.call(obj[j],j)==false) {
break;
}
}
}
}
//调用
var arry = [1, 2, 3, 4, 5, 6, 7];
var user = { name: '念在三角湖畔', site: 'http://www.111cn.net', addr: '湖北武汉', _salary: '1w', age: 22 };
each(arry, function(index) {
if (index>4) {
return false;
}
console.log(index + '=>' + this);
});
each(user, function (key) {//输出公共属性/方法(约定"_"开头的属性或者方法为私有)
if (!/^_/.test(key)) {
if (typeof this==='function') {
console.log(key + '=>function[Function]');
} else {
console.log(key + '=>' + this);
}
}
});
map的js实现
function mymap(arr, fn) {
var arr1 = new Array();
for (var i = 0; i < arr.length; i++) {
arr1[i] = fn(arr[i]);
}
return arr1;
}
var t = [4, 5, 6];
var arr = mymap(t, function(n) { return n + 5; })