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

JavaScript数组过滤时箭头函数与内联回调为何结果不同?

两种filter写法的差异说明

首先先明确Array.filter的核心规则:回调函数返回值转成布尔值为true(真值)时,当前元素会被保留;返回值转布尔为false(假值)时,当前元素会被过滤,和你返回的具体内容是什么没有关系。

你注释里写的两种写法输出一致是错误的,实际运行二者结果不一样,核心差异在回调的返回逻辑:

  • 箭头函数版本
let a = array.filter((val) => typeof val === 'number');

这个版本的回调永远返回布尔值:只要元素类型是number,就返回true,不管这个数字本身是0、NaN、负数还是普通整数,都会被保留;非number类型返回false直接过滤。最终结果确实是[NaN, 0, 15, -22, 47],符合你「保留所有数字类型元素」的需求。

  • 普通内联函数版本
let b = array.filter(function (val) {
    if (typeof val === 'number') {
        return val;
    }
})

这个版本的回调在碰到number类型元素时,直接返回元素本身,而不是判断结果的布尔值。JS里数字类型存在两个假值:0和NaN,这两个值转布尔都是false,会被filter误判为需要过滤的元素;非number类型的元素触发不了if判断,函数默认返回undefined(假值)会被过滤。这个版本实际运行结果是[15, -22, 47],0和NaN都被错误筛掉了。

补充一点:箭头函数和普通function本身存在this指向、arguments绑定的语法差异,但这段代码里没有用到相关特性,所以这部分语法差异不会影响当前代码的运行结果,二者输出不同完全是返回值逻辑写错了导致的。
如果你的目标是保留所有数字类型的元素,第一种箭头函数的写法是正确的;如果还想排除NaN只保留有效数字,可以再加一层判断:

let res = array.filter(val => typeof val === 'number' && !Number.isNaN(val))
// 运行结果:[0, 15, -22, 47]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:48:34