对于练习,我正在研究下划线包含从头开始。代码的一部分是我无法表达或理解的。这一行做了什么:
“return item === target;”
代码:
_.contains = function(collection, target) {
return _.reduce(collection, function(wasFound, item) {
if (wasFound) {
return true;
}
return item === target;
}, false);
};
答案 0 :(得分:1)
它只是从回调函数返回一个布尔值AND
。表达式reduce
的结果是布尔值(即,item === target
或true
)。它是一种简洁的(IMO)更优雅的方式,可以做到以下几点:
false
if(item === target) {
return true;
} else {
return false;
}
是"严格等于",这意味着它不会执行任何类型强制。这就是===
将返回"2" == 2
的原因,因为true
可以强制转换为数字"2"
(反之亦然)。但2
将返回"2" === 2
,因为它不执行任何类型强制,并且这两个参数的类型不同。
false
函数通过迭代集合中的每个元素并计算在每次迭代中也使用的某种值来工作。
在初次调用reduce
函数期间,reduce
设置为wasFound
(注意false
传入false
后调用reduce
打回来)。第一个if
将不会被满足,因此该函数将执行return
语句。返回的值将是 next 迭代中wasFound
的 new 值。
这意味着只要wasFound
为false
,我们就会尝试查看下一个元素是否与传入的元素匹配。如果是true
,则表示我们找到了我们想要的元素,因此我们可以继续返回true
。
IMO这个函数效率有点低,因为它一旦找到了它正在寻找的元素就不会提前爆发,并且无论如何遍历整个集合。
答案 1 :(得分:1)
if (wasFound) {
return true;
}
您正在浏览该集合,并且已找到该项目,您将返回true。
return item === target;
否则,如果当前item
等于target
正在搜索您,则返回true;如果不是,则返回false
。