javascript - 使用对象而不是回调函数时过滤函数如何工作?
问题描述
我试图过滤掉空值并成功使用.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 根本不是一个函数调用。
解决方案
它与存在无关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
价值。
推荐阅读
- javascript - Tableau:基于密钥 ID 的超链接自动打开网页
- snakemake - Snakemake 运行规则,多次输出以前规则的通配符
- python - 点六.add_metaclass 错误
- android - 我想在我的 String JsonObject 中获得价值
- reactjs - 如何为子组件执行道具类型验证?
- python - ValueError:merc 投影不能越过极点
- python - 等效于迭代器的 cdr/rest
- java - @ConditionalOnProperty 注释在 Spring Boot 项目中不起作用
- sql - 带有 SELECT 排序的 Postgres INSERT INTO
- javascript - c# - 从代码隐藏中添加 javascript 函数