Javascript Array.prototype.find()异常行为

Javascript Array.prototype.find()异常行为,javascript,arrays,find,Javascript,Arrays,Find,根据这一点,find()方法接受一个回调函数,该函数可以接受三个参数:当前数组元素、当前数组元素的索引和调用该方法的数组 因此: 如我所料,返回2 然而: var r = [2, 9, 11]; console.log(r.find(function(e, i, r) { if (e % 2 === 0) return i; })) 返回未定义(当我预期为0时) 及 返回2(当我期望[2,9,11]时) 有人能解释一下我没有正确理解的地方吗?您传递给.find()的回调

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

因此:

如我所料,返回2

然而:

var r = [2, 9, 11];
console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return i;
}))
返回未定义(当我预期为0时)

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


有人能解释一下我没有正确理解的地方吗?

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

在您的第一个示例中:

var r = [2, 9, 11]; console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return e; }))
返回值为
2
不是因为
返回e
返回值
2
,但因为
2
是真实的。您可以通过将
return e
更改为
return true
或任何其他truthy值来验证

类似地,在第二个示例中:

var r = [2, 9, 11];
console.log(r.find(function(e, i, r) {
    if (e % 2 === 0)
        return i;
}))
您的回调在第一个元素上返回
0
(因为
i
0
),但这不是真的

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

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

在第二种情况下,2次通过
e%2==0
,然后返回
i
。但是
i
0
,这是一个错误的值,因此
find
跳过该值并继续。其他值(9和11)不通过
e%2==0
。不显式返回值的函数返回一个
未定义的
,一个伪值。最后,没有回调返回truthy值,
find
返回
undefined

第三种情况是,
2
通过
e%2===0
,然后返回
r
,一个数组,它是真实值。这使得
find
,立即返回第一项,即
2

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