概述
JavaScript 数组原型上的方法实现原理(Array.prototype.map/filter/slice/pop/push/shift/unshift/some/every……)
- map
- filter
- slice
- pop
- push
- shift
- unshift
- some
- every
- reduce
- find
map
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 方法不会对空数组进行检测。
注意: map() 方法不会改变原始数组。
/**
* map
*/
Array.prototype.map = function (fn) {
if (typeof fn !== "function") {
throw new TypeError(`${fn} is not a function`)
}
let newArr = []
for (let i = 0; i < this.length; i++) {
newArr.push(fn(this[i]))
}
return newArr
}
filter
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 方法不会对空数组进行检测。
注意: filter() 方法不会改变原始数组。
/**
* filter
*/
Array.prototype.filter = function (fn) {
if (typeof fn !== "function") {
throw new TypeError(`${fn} is not a function`)
}
let newArr = []
for (let i = 0; i < this.length; i++) {
fn(this[i]) && newArr.push(this[i])
}
return newArr
}
slice
slice() 方法可从已有的数组中返回选定的元素。
slice()方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
注意: slice() 方法不会改变原始数组。
/**
* slice
*/
Array.prototype.slice = function () {
let start = 0
let end = this.length
if (arguments.length === 1) {
start = arguments[0]
} else if (arguments.length === 2) {
start = arguments[0]
end = arguments[1]
}
let arr = []
for (let i = start; i < end; i++) {
arr.push(this[i])
}
return arr
}
pop
pop() 方法用于删除数组的最后一个元素并返回删除的元素。
注意:pop() 方法改变数组的长度。
/**
* pop
*/
Array.prototype.pop = function () {
let remove = this[this.length - 1]
this.length--
return remove
}
push
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
注意: push() 方法改变数组的长度。
/**
* push
*/
Array.prototype.push = function () {
let argLen = arguments.length
let thisLen = this.length
for (let i = 0; i < argLen; i++) {
this[thisLen + i] = arguments[i]
}
return this.length
}
shift
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
注意: shift() 方法改变数组的长度。
/**
* shift
*/
Array.prototype.shift = function () {
let thisLen = this.length
let remove = this[0]
for (let i = 1; i < thisLen; i++) {
this[i - 1] = this[i]
}
this.length--
return remove
}
unshift
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
注意: unshift() 方法改变数组的长度。
/**
* unshift
*/
Array.prototype.unshift = function () {
let arr = [...arguments, ...this]
this.length = arr.length
for (let i = 0; i < arr.length; i++) {
this[i] = arr[i]
}
return arr.length
}
/**
* unshift
*/
Array.prototype.unshift = function () {
let argLen = arguments.length
for (let i = this.length; i >= 0; i--) {
this[i + argLen - 1] = this[i - 1]
}
for (let i = 0; i < argLen; i++) {
this[i] = arguments[i]
}
return this.length
}
some
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:
如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
如果没有满足条件的元素,则返回false。
注意: some() 方法不会对空数组进行检测。
注意: some() 不会改变原始数组。
/**
* some
*/
Array.prototype.some = function (fn) {
if (typeof fn !== "function") {
throw new TypeError(`${fn} is not a function`)
}
for (let i = 0; i < this.length; i++) {
if (fn(this[i])) {
return true
}
}
return false
}
every
every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
如果所有元素都满足条件,则返回 true。
注意: every() 方法不会对空数组进行检测。
注意: every() 方法不会改变原始数组。
/**
* every
*/
Array.prototype.every = function (fn) {
if (typeof fn !== "function") {
throw new TypeError(`${fn} is not a function`)
}
for (let i = 0; i < this.length; i++) {
if (!fn(this[i])) {
return false
}
}
return true
}
reduce
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
注意: reduce() 方法不会对空数组进行检测。
/**
* reduce
*/
Array.prototype.reduce = function (reducer, initVal) {
for (let i = 0; i < this.length; i++) {
initVal = reducer(initVal, this[i], i, this)
}
return initVal
}
find
find() 方法返回通过测试(函数内判断)的数组的第一个元素的值。
find() 方法为数组中的每个元素都调用一次函数执行:
当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
如果没有符合条件的元素返回 undefined。
注意: find() 方法不会对空数组进行检测。
注意: find() 方法不会改变原始数组。
/**
* find
*/
Array.prototype.find = function (fn) {
if (typeof fn !== "function") {
throw new TypeError(`${fn} is not a function`)
}
for (let i = 0; i < this.length; i++) {
if (fn(this[i])) {
return this[i]
}
}
}
最后
以上就是明亮乌龟为你收集整理的JavaScript 数组原型上的方法实现原理(Array.prototype.map/filter/slice/pop/push/shift/unshift/some/every……)mapfilterslicepoppushshiftunshiftsomeeveryreducefind的全部内容,希望文章能够帮你解决JavaScript 数组原型上的方法实现原理(Array.prototype.map/filter/slice/pop/push/shift/unshift/some/every……)mapfilterslicepoppushshiftunshiftsomeeveryreducefind所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复