【发布时间】:2019-09-21 20:35:43
【问题描述】:
我偶然发现 this great function 从数组中删除 falsy values:
let other = array.filter(item => item);
但我不明白这是如何工作的。据我了解在MDN上找到的Array.prototype.filter()的解释:
filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。
以下代码应该与上面找到的代码相同(并且确实提供了相同的输出):
function foo(item) {
return item;
}
let other = array.filter(foo);
但是foo() 只返回所有虚假值,正如您在下面的 sn-p 中看到的(如预期的那样)。 如果虚假值确实通过了提供的函数,什么时候进行过滤?
let array = ['foo', undefined, false, 'bar'];
function foo(item) {
return item;
}
array.forEach(item => console.log(foo(item)));
编辑:对我的问题存在一些误解:我知道我没有在 sn-p 中使用filter()。这是因为它的唯一目的是显示所有值通过foo()-函数,这在当时似乎与:[...]通过提供的函数实现的测试。
查看 Polyfill 和描述,我现在明白了它为什么会这样工作。谢谢你,@adiga。我不完全理解 [...] 返回一个强制为 true 的值,因为英语不是我的第一语言,但我想这意味着类似于 [...] 的返回值只有真实的价值观。
【问题讨论】:
-
它检查返回的值,如果为真,则元素通过。
-
在
Array.prototype.filter的Description中明确提到:“filter()为数组中的每个元素调用一次提供的回调函数,并构造一个包含所有值的新数组对于哪个回调返回一个强制为 true 的值" -
@Seblor 这是故意的。它表明
foo()根本没有改变值。 -
您是否检查了
filter的 Polyfill 在与问题引用相同的页面上 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
“通过所提供函数实现的测试的所有元素” 仅表示所提供函数为其返回真值的所有元素。这就是这里的每个人都想告诉你的!