Array.prototype._map = function (callback, thisArg) {
let len = this.length
let result = []
for (let i = 0; i < len; i++) {
// 通过调用call方法,将callback的this指向thisArg,// 后面依次传入当前处理的元素、当前元素下标、调用map方法的数组// 当thisArg为undefined或者null时,this就指向全局的window了.这正好与原生的map方法一致.let temp = callback.call(thisArg, arr[i], i, arr)
result[i] = temp
}
return result
}
let arr = [1, 2, 3]
let result = arr._map(function (value, index, arr) {
return value + 1
})
console.log(result) // [2, 3, 4]
这样就实现了一个数组的map方法,但是这样实现的与原生的有很多区别:
原生的map方法会跳过被用delete删除或者未定义的元素
// 注意: 这里的arr[3]就是一个未定义的元素let arr = [1, 2, 3, , undefined]
let result = arr._map(function (value, index, arr) {
return value + '1'
})
Array.prototype._map = function (callback, thisArg) {
let result
// callback必须是一个函数,否则抛出异常if (Object.prototype.toString.call(callback) !== '[object Function]') {
thrownewError(callback + 'is not a function')
}
let len = this.length
// 创建结果数组,长度和原数组相同
result = newArray(len)
for (let i inthis) {
let currentVal, mappedVal
currentVal = this[i]
mappedVal = callback.call(thisArg, currentVal, i, this)
result[i] = mappedVal
}
return result
}
测试功能
let arr = [1, 2, 3, , undefined]
let result = arr._map(function (value) {
return value + '1'
})
console.log(arr) // [1, 2, 3, empty, undefined]console.log(result) // ["11", "21", "31", empty, "undefined1"]