You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:54:54