将Array.from作为Array.flatMap回调为何报TypeError: 0 is not a function?
问题解答
1. 直接传入Array.from作为flatMap回调报错的原因
Array.prototype.flatMap 传入的回调函数在执行时,会被自动传入3个参数:
- 当前遍历的元素值
- 当前遍历的索引
- 调用
flatMap的原数组
而Array.from的参数定义如下:Array.from(arrayLike[, mapFn[, thisArg]])
第二个可选参数mapFn是映射函数,如果传入该参数,Array.from会在生成数组前对每个元素执行该映射函数。
当你直接把Array.from作为回调传给flatMap时,相当于每次遍历都会执行:Array.from(当前元素, 当前索引, 原数组)
你的复现代码中,第一次遍历的索引是0,因此Array.from会把传入的第二个参数0当成mapFn尝试调用,自然就抛出TypeError: 0 is not a function的错误。
而你使用箭头函数包裹的写法,只把第一个元素传给Array.from,忽略了后面的索引、原数组参数,符合Array.from的常规调用逻辑,因此可以正常运行。
2. 报错提示难以定位的原因
这个错误是Array.from内部执行时抛出的:JS引擎只检测到当前尝试调用的0不是可执行的函数,不会额外附带上下文说明这个0是作为Array.from的第二个mapFn参数传入的。
加上大多数开发者日常使用Array.from很少用到第二个映射参数,同时很容易忽略数组遍历方法的回调会默认传入索引、原数组两个额外参数,很难第一时间把报错信息中的0和遍历索引、Array.from的参数规则关联起来,因此会觉得报错非常不直观。
内容的提问来源于stack exchange,提问作者Andrey Bienkowski
相关产品推荐
相关产品推荐

