You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何arr.filter(String)会返回数字?JavaScript过滤方法疑问

关于Array.filter()使用String/Number作为回调的问题解析

嘿,这个问题我之前也踩过坑,一开始确实会有点懵,咱们一步步把它理清楚~

首先得搞懂Array.filter()的核心逻辑:它会遍历数组里的每一个元素,把元素传给你指定的回调函数,只有当回调函数返回「真值(truthy value)」时,这个元素才会被保留到结果数组里。而你直接把String或者Number作为回调传进去时,本质上是把每个元素先做一次类型转换,再判断转换后的结果是不是真值。

为什么arr.filter(String)会保留数字?

当你用String作为回调时,每个元素都会被String()函数转换,然后判断转换后的结果是否为真值:

  • 数字2 → String(2)得到"2",这是一个非空字符串,属于真值,所以被保留;
  • 数字4 → String(4)得到"4",同样是真值,保留;
  • 空字符串"" → String("")还是"",属于「假值(falsy)」,所以被过滤掉;
  • "omg" → 转换后还是"omg",真值,保留。

这就是为什么你的onlyString([2, 4, "", "omg", ])会返回[2, 4, "omg"]——它过滤的是「转换为字符串后是假值」的元素,而不是「本身不是字符串类型」的元素。

那arr.filter(Number)的结果会是什么?

同样的逻辑,每个元素会被Number()转换后判断真假:

  • 数字2 → Number(2)是2,真值,保留;
  • 数字4 → Number(4)是4,真值,保留;
  • 空字符串"" → Number("")是0,假值,被过滤;
  • "omg" → Number("omg")是NaN,假值,被过滤;
  • 数组末尾的逗号会被JS忽略,不影响结果。

所以执行arr.filter(Number)后,结果会是[2, 4]。

如果你想真正过滤出「字符串类型」的元素

如果你的需求是只保留数组中本身就是字符串类型的元素(包括空字符串),那应该用typeof来判断类型,而不是用String作为回调:

function onlyString(arr) {
  return arr.filter(item => typeof item === 'string');
}
onlyString([2, 4, "", "omg", ]) // 会返回 ["", "omg"]

内容的提问来源于stack exchange,提问作者Nad G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:59