Array.prototype.find()

319 阅读1分钟

find() 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。

const array = [5, 12, 8, 130, 44]

const found = array.find(element => element > 10)

console.log(found)  // 12

find方法对数组中的每一项元素执行一次 callback 函数,直至有一个 callback 返回 true。当找到了这样一个元素后,该方法会立即返回这个元素的值,否则返回 undefined。注意 callback 函数会为数组中的每个索引调用即从 0 到 length - 1,而不仅仅是那些被赋值的索引,这意味着对于稀疏数组来说,该方法的效率要低于那些只遍历有值的索引的方法。

callback函数带有3个参数:当前元素的值、当前元素的索引,以及数组本身。

在第一次调用 callback函数时会确定元素的索引范围,因此在 find方法开始执行之后添加到数组的新元素将不会被 callback函数访问到。如果数组中一个尚未被callback函数访问到的元素的值被callback函数所改变,那么当callback函数访问到它时,它的值是将是根据它在数组中的索引所访问到的当前值。被删除的元素仍旧会被访问到,但是其值已经是undefined了。

实现Array.prototype.find()

Array.prototype.myFind = function(cb) {
    if (this === null) {
        throw new TypeError('Type Error')
    }
    if (typeof cb !== 'function') {
        throw new TypeError('CallBack must be function Type')
    
    const obj = Object(this)
    const len = obj.length >>> 0
    const arg2 = arguments[1]
    let step = 0
    
    while(step < len) {
        let value = obj[step]
        if (cb.apply(arg2, [obj[step], step, obj]) {
        return value
      }
      step++
    }
    return undefined
}

const arr = [1, 2, 3, 4, 5]
const res = arr.myFind(function(item) {
    return item > 2
})