已解决JavaScript数组移除假值问题,不解自身代码生效逻辑
为什么在Array.filter中直接返回元素就能自动过滤假值?
我在FreeCodeCamp完成「移除数组所有假值,返回新数组且不修改原数组」的挑战时,写了这段代码:
function bouncer(arr) { return arr.filter(function(ele){return ele}); }
而FreeCodeCamp提供的官方解法是这样的:
function bouncer(arr) { var check = arr.filter(function(i) { return Boolean(i); }); return check; }
我有点疑惑:调用bouncer([7, "ate", "", false, 9])时,我的代码明明没有做显式的布尔转换,只是直接返回元素,为什么能正确过滤掉所有假值?
答案很简单,这是JavaScript隐式类型转换的特性在起作用:
Array.filter()方法的逻辑是:遍历数组时,会把回调函数的返回值自动转换为布尔值,以此判断当前元素是否应该被保留在结果数组中。
- 当你直接返回
ele时,JavaScript会自动将这个值转为对应的布尔等价物:- 所有假值(false、null、0、""、undefined、NaN)会被转为
false,因此会被filter过滤掉 - 所有真值(比如非零数字、非空字符串等)会被转为
true,因此会被保留下来
- 所有假值(false、null、0、""、undefined、NaN)会被转为
官方解法里的Boolean(i)只是做了显式的布尔转换,和你代码里的隐式转换效果完全一致——两种写法最终都会基于元素的布尔值来筛选,只是显式写法更清晰地表达了“判断元素布尔状态”的意图。
举个具体的例子验证:
- 对于空字符串
"",直接返回它在filter里会被当成false,Boolean("")也返回false - 对于数字
7,直接返回它会被当成true,Boolean(7)也返回true
所以你的代码能正确运行,本质是JavaScript帮你自动完成了布尔值的转换。
内容的提问来源于stack exchange,提问作者christian olori
相关产品推荐
相关产品推荐

