Array.prototype.find()意外行为

ana*_*tta 0 javascript arrays find

根据这个MDN链接,find()方法采用一个可以带三个参数的回调函数:当前数组元素,当前数组元素的索引以及调用该方法的数组.

所以:

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

如我所料,返回2.

然而:

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

return undefined(当我期望0时),

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

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

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

Poi*_*nty 5

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

在你的第一个例子中:

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

返回值2 不是因为return e;返回值2,而是因为2真实.您可以通过更改return ereturn true或任何其他truthy值来验证.

同样,在第二个例子中:

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

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