2016-03-24 18 views
0

これによると、find()メソッドは、現在の配列要素、現在の配列要素のインデックス、および現在の配列要素のインデックスの3つの引数を取ることができるコールバック関数をとります。メソッドが呼び出されています。だから、Array.prototype.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; 
})) 

リターン(I 0を期待する)、

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

戻り2(I [2、9、11]期待します)。

誰かが私が正しく理解していないことを説明できますか?

答えて

2

それはコールバックが真 値を返すものを見つけるまで検索方法は、各要素に対して一度アレイに 存在するコールバック関数を実行します。

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

コールバックリターンのみ電流値が結果かでなければならないかを示すために使用されます。これは、findのようなもので、あなたのコールバックに現在の値に対する "はい、いいえ"の質問をします。

2番目のケースでは、2がe % 2 === 0になり、iが返されます。しかしi0であり、虚偽の値であるのでfindはスキップし続けます。さらに値(9と11)はe % 2 === 0を渡しません。明示的に値を返さない関数は、undefinedという偽の値を返します。最後に、真偽値を返したコールバックはなく、findundefinedを返します。

第3の場合、2e % 2 === 0になり、真理値である配列rが返されました。 findは、すぐにバットを外して、2という最初のアイテムを返します。

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ないため、値2を返すreturn e;のですが、2ためtruthyです。 return ereturn trueまたは他の真実の値に変更することで確認できます。

同様に、第2の例において:(i0であるため)

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

コールバックは、最初の要素に0を返し、それはない truthyです。