从含length属性的对象创建数组:Array.from参数v为undefined的疑问
关于Array.from中v参数输出undefined的原因解析
嘿,我来帮你把这个逻辑理清楚~
首先得搞明白Array.from的工作方式,尤其是它第二个参数(映射函数)的参数是怎么来的:
Array.from的第一个参数如果是类数组对象(像你传的{length: 3}这种只有length属性的对象),它会遍历从0到length-1的每一个索引i。- 对于每个索引
i,它会先尝试从源对象上获取源对象[i]的值,这个值就是映射函数的第一个参数v;而索引i本身就是第二个参数。
那你传的{length: 3}是个“不完整”的类数组对象——它只有length属性,根本没有0、1、2这些索引对应的属性。所以每次尝试获取源对象[i]的时候,得到的都是undefined,这就是为什么你打印v会输出3次undefined,而i能正常输出0、1、2。
看你的测试代码:
console.log(Array.from({length: 3}, function(v,i) { console.log(v); // 三次undefined,因为源对象没有对应索引的属性 console.log(i); // 依次输出0、1、2 return i; })); // 最终返回数组[0,1,2]
再举个反例,如果你的源对象有索引属性,v就会有具体值了:
Array.from({0: '苹果', 1: '香蕉', length:2}, (v,i) => { console.log(v); // 会打印'苹果'、'香蕉' console.log(i); // 0、1 return v + '好吃'; }); // 结果是['苹果好吃', '香蕉好吃']
至于你看到的示例Array.from({length: 5}, (v, i) => i),它只是忽略了v(因为知道它是undefined),直接返回索引i,所以生成了从0到4的数组,逻辑完全是通顺的~
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

