forEach
- 第一个参数:
cb(value, index, array)
- 第二个参数:指定回调中 this 指向
原生
var arr = [
{
name: 'Lance',
age: 20,
},
{
name: 'GC',
age: 23
},
{
name: 'Shank',
age: 25
}
];
var obj = {
name: 'Lance',
age: 23
}
arr.forEach(function(value, index, arr) {
console.log(this); // 默认window
console.log(value, index, arr);
}, obj);
实现
Array.prototype.myForEach = function(cb) {
var _arr = this,
_len = _arr.length,
_caller = arguments[1] || window;
for (var i = 0; i < _len; i++) {
cb.call(_caller, _arr[i], i, _arr);
}
}
map
- 和 forEach 类似,但是返回新数组
- 如果数组成员是复杂类型(对象),那么在 cb 中修改 item,会改变原数组;如果数组成员是基本类型,则不会修改原数组
- map没实现深拷贝
原生
var arr = [
{
name: 'Lance',
age: 20,
},
{
name: 'GC',
age: 23
},
{
name: 'Shank',
age: 25
}
];
var obj = {
name: 'Lance',
age: 23
}
var newArr = arr.map(function(item, index, arr) {
item.name = this.name;
return item; // 必须返回,否则数组里边成员都是 undefined
}, obj);
console.log(newArr, arr);
实现
Array.prototype.myMap = function(cb) {
var _arr = this,
_len = _arr.length,
_caller = arguments[1] || window,
newArr = [];
for (var i = 0; i < _len; i++) {
// var item = deepClone(_arr[i]); // 如果要实现深拷贝,可以加此行代码,同时把下边 _arr[i] 替换为 item
newArr.push(cb.call(_caller, _arr[i], i, _arr));
}
return newArr;
}
filter
- 返回新数组
- 原数组成员是复杂类型,cb 中修改也会影响原数组