首页 > 解决方案 > 使用对象而不是回调函数时过滤函数如何工作?

问题描述

我试图过滤掉空值并成功使用.filter(String)

['foo','bar','',''].filter(String);
// ['foo','bar']

这是我想要的结果,并且按预期工作。

但突然更深入地看:

'' instanceof String // false
'foo' instanceof String // false
''.constructor.prototype // String.prototype
'foo'.constructor.prototype // String.prototype

所以,我们看不出有什么区别。并且惊讶这实际上是如何工作的。查看上述条件,它应该按原样返回['foo','bar','',''],因为所有字符串值。

编辑:

我删除了我的答案,只是因为,我认为它并不完全满足:

过滤函数最后满足布尔值。

Boolean('') // false, so remove
Boolean('foo') // true, so keep it

String 是一个构造函数-@Nina Scholz 在评论中指出的函数。

好吧,它不是构造函数-@Bergi 指出。同意。但现在完全惊讶于.filter(String)将如何.filter(s=>String(s))- 因为 String 根本不是一个函数调用。

标签: javascript

解决方案


它与存在无关instanceof String

['foo','bar','',''].filter(String);

['foo','bar','',''].filter(a => String(a));

String('')返回一个空字符串''。这就是falsy价值。所以,那些被过滤掉是因为:

filter()为数组中的每个元素调用一次提供的回调函数,并构造一个包含所有值的新数组,回调为其返回一个强制为 true 的值

因此,如果您要0在数组中有一个 (number),即使0 instance of String === false. 因为String(0)返回"0"哪个是truthy价值。


推荐阅读