为何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
相关产品推荐
相关产品推荐

