Array.prototype.find()意外行为

时间:2016-03-24 12:32:04

标签: javascript arrays find

根据这个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;
}))

返回undefined(当我期望0时),

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

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

有人可以解释一下我没有正确理解的内容吗?

2 个答案:

答案 0 :(得分:5)

假设传递给.find()的回调返回布尔值(true或false)。从.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),但那个不是真实的。

答案 1 :(得分:2)

  

find方法为每个元素执行一次回调函数   出现在数组中,直到找到一个回调返回true的地方   值。

     

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

回调返回仅用于指示当前值是否应该是结果。它有点像find要求你的回调a"是或否"对当前价值的质疑。

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

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