下划线包含从头开始?

Underscore contains from scratch?

为了练习,我正在从头开始学习下划线包含。代码的一部分我无法表达或理解。这行是做什么的:

"return item === target;"

代码:

_.contains = function(collection, target) {

    return _.reduce(collection, function(wasFound, item) { 
      if (wasFound) { 
        return true;
  }
      return item === target;
    }, false); 

};

它只是 return 从回调到 reduce 的布尔值。表达式 item === target 的结果是一个布尔值(即 truefalse)。这是执行以下操作的一种速记和(IMO)更优雅的方式:

if(item === target) {
    return true;
} else {
    return false;
}

=== 是 "strict equals",这意味着它不会执行任何类型强制转换。这就是为什么 "2" == 2 会 return true 因为 "2" 可以被强制转换为数字 2(反之亦然)。但是 "2" === 2 会 return false 因为它不执行任何类型强制转换,而且两个参数是不同的类型。

reduce 函数通过遍历集合中的每个元素并计算每次迭代中也使用的某种值来工作。

reduce 函数的初始调用期间,wasFound 设置为 false(注意 false 传递给 reduce 的调用回调后)。第一个 if 将不满足,因此函数将执行 return 语句。 returned 的这个值将是 next 迭代中 wasFoundnew 值。

这意味着只要wasFoundfalse,我们就会尝试看下一个元素是否与传入的元素匹配。如果是true,则意味着我们已经找到了我们想要的元素,所以我们可以保持 returning true.

IMO 这个函数有点低效,因为一旦找到它要查找的元素,它就不会提前退出,而是无论如何遍历整个集合。

if (wasFound) { 
    return true;
}

您正在浏览 collection,如果物品已经找到,您 return 正确。

return item === target;

否则,你return如果当前item等于target正在搜索的是你,false如果不是。