根据这个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]时)。
有人可以解释一下我没有正确理解的内容吗?
答案 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
(因为i
是0
),但那个不是真实的。
答案 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
。但是i
是0
,这是一个假值,因此find
会跳过该值并继续。其他值(9和11)不会通过e % 2 === 0
。不显式返回值的函数返回undefined
,即假值。最后,没有回调返回真值,find
返回undefined
。
第三种情况,2
传递e % 2 === 0
并返回r
,这是一个数组,这是一个真值。这使得find
立即返回第一项2
。