var new_array = arr.map(function callback(currentValue[, index[,array]]) {
// Return element for new_array
}[, thisArg])
以前没注意的点
- thisArgs 指的是回调函数的this
- thisArg 有指定时 不能用箭头函数
原因是箭头函数没有this隐式指向。箭头函数在定义时候就已经绑定了上层上下文中非箭头函数this
- map 方法处理数组元素的范围是在 callback 方法第一次调用之前就已经确定了。调用map方法之后追加的数组元素不会被callback访问。
- 如果存在的数组元素改变了,那么传给callback的值是map访问该元素时的值。在map函数调用后但在访问该元素前,该元素被删除的话,则无法被访问到。
手写map:
Array.prototype.myMap = function(callback, thisArg) {
let arr = this;
const result = [];
const callbackThis = thisArg || Window.document;
for (let i = 0; i < arr.length; i++) {
result.push(callback.call(callbackThis, arr[i], i, arr));
}
return result;
}
let arr = [1, 2, 3];
let arr1 = [2, 3, 4]
console.log(arr.myMap(function(value, index, arr) {
console.log(this); //[2,3,4]
return value + 3
}, arr1)); //[4,5,6]
优化一下:
对callback 进行判断
if (typeof(callback) !== 'function') {
throw new TypeError(`${callback} is not functipn`)
}
思考:
既然都写了map
那不写写reduce
array.reduce( function(total, currentValue, currentIndex, arr), initialValue)
Array.prototype.myReduce = function(callback, initvalue) {
let initValue = initvalue || 0
let arr = this;
if (typeof(callback) !== 'function') {
throw new TypeError(`${callback} is not functipn`)
}
for (let i = 0; i < arr.length; i++) {
initValue = callback.call(this, initValue, arr[i], i, arr);
}
return initValue;
}
let y = arr.myReduce((total, curvalue, index, arr) => {
return total + curvalue;
}, 10)
console.log(y);//20
原理都差不多。
再来个filter吧。
Array.prototype.myFilter = function(callback, thisArg) {
let arr = this;
const result = [];
if (typeof(callback) !== 'function') {
throw new TypeError(`${callback} is not functipn`)
}
const callbackThis = thisArg || Window.document;
for (let i = 0; i < arr.length; i++) {
if (callback.call(callbackThis, arr[i], i, arr)) {
result.push(arr[i])
}
}
return result;
}
let arr = [1, 2, 3, 4];
let arr1 = [2]
let x = arr.myFilter(function(value, index, arr) {
console.log(this);
return value > 1;
}, arr1)
console.log(x);
要是早点学到这,某面试咋会挂呢气抖冷。。。。。。。