为何Array.prototype.filter中带大括号的箭头函数返回空数组?
箭头函数带大括号与不带大括号的差异原因
这是箭头函数的语法规则导致的两种不同行为:
不带大括号的简洁体写法:这种写法下,箭头右侧的表达式结果会被自动作为函数的返回值,无需手动写
return。你第二个示例里的i => i % 2 == 0,本质上等价于i => { return i % 2 == 0 },所以filter能正确接收到判断奇偶的布尔值,最终筛选出[0,2]。带大括号的块体写法:当箭头函数使用大括号包裹代码时,就进入了块级作用域模式,此时必须显式使用
return语句来指定返回值。你第一个示例里的i => {i % 2 == 0},只是在块内执行了一个比较表达式,但没有返回任何内容,函数默认返回undefined。而Array.prototype.filter会把undefined判定为false,所有元素都不满足筛选条件,因此返回空数组。
如果要保留大括号写法,只需要补上return即可:
(function (){ console.log([0, 1, 2, 3].filter(i => { return i % 2 == 0 })); })(); // 输出: [0, 2]
内容的提问来源于stack exchange,提问作者John Shallow
相关产品推荐
相关产品推荐

