arguments对象与类arguments对象调用Array.prototype.slice为何表现不同?
为什么类似arguments的对象调用Array.prototype.slice.call()会得到空数组?
Array.prototype.slice的工作逻辑很直接:它会先读取被调用对象的length属性,然后从索引0开始,依次读取对象上0到length-1的索引属性,把这些值收集成新数组返回。
看你代码里的两个对象:
- 真正的
arguments对象,除了0、1这些索引键,还有自动维护的length属性,值等于传入的实参个数(这里是2)。所以slice能正确遍历0和1两个索引,返回对应的数组。 - 你自定义的
{'0': 'first','1': 'second'}对象,只有索引键但没有length属性。slice读取不到length时会默认按0处理,自然不会遍历任何索引,结果就是空数组。
如果给这个自定义对象补上length属性,就能得到和arguments一样的结果:
console.log(Array.prototype.slice.call({'0': 'first','1': 'second', length: 2})) // 输出 ['first', 'second']
总结下:要让slice正确处理类数组对象,这个对象必须同时有连续的数字索引键,以及对应的length属性。arguments天然符合这个要求,而你写的对象缺了length,所以不行。
内容的提问来源于stack exchange,提问作者Nikolai Kushpela
相关产品推荐
相关产品推荐

