这个Array.prototype.find()如何工作?

时间:2016-10-18 09:53:15

标签: javascript

我不理解的是函数及其参数fruit,因为它没有传递任何东西。

var inventory = [
  {name: 'apples', quantity: 2},
  {name: 'bananas', quantity: 0},
  {name: 'cherries', quantity: 5}
];

function findCherries(fruit) { 
  return fruit.name === 'cherries';
}

console.log(inventory.find(findCherries));

3 个答案:

答案 0 :(得分:2)

  

...因为它没有传递任何东西。

正在传递某些东西,你只是看不到代码在做什么,这是里面 Array.prototype.find方法的代码。请记住,这一行:

console.log(inventory.find(findCherries));

...将findCherries(函数引用)的传递给find,它不会调用 {{1} }。 findCherries为数组中的每个条目执行一次,提供三个参数(find中只使用其中一个参数)。这些参数中的第一个是该调用的数组条目。

findCherries的完整polyfill会让人难以理解,所以让我们做类似但更简单的事情,这样你就可以看到这些调用:

Array.prototype.find

实时复制:

// A bit like Array.prototype.find, but **not** the same; much simplified
function fakeFind(callback) {
  for (var index = 0; index < this.length; ++index) {
    var entry = this[index];
    //  vvvvvvvvvvvvvvvvvvvvvvvvvvvv---- This is where findCherries is called
    if (callback(entry, index, this)) {
      return entry;
    }
  }
  return undefined;
}

答案 1 :(得分:0)

如果你扩展函数使它使用匿名函数,那就更有意义了。

如果你看一下下面的代码片段,它可以解释一下......

var inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];

function findCherries(fruit) { 
  return fruit.name === 'cherries';
}

//this kind of does the same, apart from the extra anonymous function
//but here you can see this `item` that's getting passed
console.log(inventory.find(
  function (item) { return findCherries(item); }
));

//because in the above the anonymous function has the same
//signature, it's made redunant, so we may as well
//call findCherries direct..
console.log(inventory.find(findCherries));

答案 2 :(得分:0)

  

find()方法返回数组中的值,如果是元素中的元素   数组满足提供的测试功能。否则未定义   回。 Array.prototype.find()

在您的代码段中fruit是原始数组中的项目,我的值是数组中的项目。findCherries将比较数组中的每个元素以匹配属性{{ 1}}(这是提供的测试功能)。

您的name回调将对阵列中的每个值执行。找到匹配项后,将返回结果。