【问题标题】:Array.prototype.find() unexpected behaviorArray.prototype.find() 意外行为
【发布时间】:2016-03-24 12:32:03
【问题描述】:

根据MDN link,find() 方法接受一个回调函数,该函数可以接受三个参数:当前数组元素、当前数组元素的索引和调用该方法的数组。

所以:

var r = [2, 9, 11]; console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return e; }))

如我所料,返回 2。

但是:

var r = [2, 9, 11];
console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return i;
}))

返回未定义(当我期望为 0 时),

var r = [2, 9, 11];
console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return r;
}))

返回 2(当我期望 [2, 9, 11] 时)。

谁能解释一下我不理解的地方?

【问题讨论】:

    标签: javascript arrays find


    【解决方案1】:

    假定您传递给.find() 的回调返回一个布尔值(真或假)。从.find() 返回的值是回调为其返回非假值的第一个元素的值。

    在你的第一个例子中:

    var r = [2, 9, 11]; console.log(r.find(function(e, i, r) {
        if (e % 2 === 0)
            return e; }))
    

    返回值是2 不是因为return e;返回值2,而是因为2是真实的。您可以通过将return e 更改为return true 或任何其他真实值来验证这一点。

    同样,在第二个例子中:

    var r = [2, 9, 11];
    console.log(r.find(function(e, i, r) {
        if (e % 2 === 0)
            return i;
    }))
    

    您的回调在第一个元素上返回 0(因为 i0),但这不是真实的。

    【讨论】:

      【解决方案2】:

      find 方法对每个元素执行一次回调函数 存在于数组中 直到找到一个回调返回 true 价值。

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

      回调返回仅用于指示当前值是否应为结果。这有点像 find 向您的回调询问当前值的“是或否”问题。

      在您的第二种情况下,2 次通过 e % 2 === 0 并且您返回了 i。然而i0,这是一个虚假值,所以find 跳过它并继续。其他值(9 和 11)不通过 e % 2 === 0。没有显式返回值的函数会返回 undefined,这是一个虚假值。最后没有回调返回真值,findreturns undefined

      第三种情况,2 传递了e % 2 === 0,你返回了r,一个数组,它是一个真值。这使得find 立即返回第一个项目,即2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-10
        • 2019-05-01
        • 2011-07-15
        • 2011-04-27
        • 2019-12-07
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多