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"]複製程式碼