【问题标题】:At which point does Array​.prototype​.filter() check for falsy values?Array​.prototype​.filter() 在什么时候检查虚假值?
【发布时间】: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.filterDescription中明确提到:“filter()为数组中的每个元素调用一次提供的回调函数,并构造一个包含所有值的新数组对于哪个回调返回一个强制为 true 的值"
  • @Seblor 这是故意的。它表明foo() 根本没有改变值。
  • 您是否检查了filter 的 Polyfill 在与问题引用相同的页面上 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • “通过所提供函数实现的测试的所有元素” 仅表示所提供函数为其返回真值的所有元素。这就是这里的每个人都想告诉你的!

标签: javascript ecmascript-6


【解决方案1】:

我不确定我是否正确理解了这个问题,但filter 只返回过滤器回调返回的值,该值被强制转换为true(即非虚假)。

这就是为什么过滤掉虚假值只需要过滤器函数返回值本身。

(回调也可以显式返回一个带有!!value 的布尔值,这会做同样的事情。)

【讨论】:

  • 他提供的例子没有使用过滤器,而是forEach。过滤在两个示例中都按预期工作,使用函数引用作为函数而不是 lambda,没有任何问题,由于在两种情况下都强制返回值,结果将是相同的。 jsfiddle.net/12cymk3j
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多