Javascript 调用Array.prototype.slice.apply时的不同结果(参数)

Javascript 调用Array.prototype.slice.apply时的不同结果(参数),javascript,Javascript,我试图理解为什么test3和test1产生相同的结果,即数组[1,2],而test2产生空数组。函数属性参数不是返回类似数组的对象吗?我希望所有三个测试结果都会产生[1,2]的数组 /*eslint禁用无控制台*/ var testFunc=函数(){ log(参数); log(“test3:”,Array.prototype.slice.apply(参数)); }; testFunc(1,2); log(“test1:”,Array.prototype.slice.apply([1,2]);

我试图理解为什么test3和test1产生相同的结果,即数组[1,2],而test2产生空数组。函数属性参数不是返回类似数组的对象吗?我希望所有三个测试结果都会产生[1,2]的数组

/*eslint禁用无控制台*/
var testFunc=函数(){
log(参数);
log(“test3:”,Array.prototype.slice.apply(参数));
};
testFunc(1,2);
log(“test1:”,Array.prototype.slice.apply([1,2]);

log(“test2:,Array.prototype.slice.apply({[0]:1[1]:2}))
test2
不会产生您期望的结果,因为您在非数组类对象上调用它:它缺少
长度
test1
test3
生成您期望的结果,因为您在类似数组的对象上调用它。由于
test2
缺少长度,当
slice
读取
length
时,它会得到
undefined
,并转换为
NaN
,因此
0
会用作源数组的长度。(如果您好奇,在规范中它是->->->->;ToNumber返回
NaN
,ToInteger将其转换为
0

如果我们将
length
添加到
test2
,它也会产生您期望的结果:

/*eslint禁用无控制台*/
var testFunc=函数(){
log(参数);
log(“test3:”,Array.prototype.slice.apply(参数));
};
testFunc(1,2);
log(“test1:”,Array.prototype.slice.apply([1,2]);
log(“test2:,Array.prototype.slice.apply({0:1,1:2,length:2}))
。作为控制台包装器{
最大高度:100%!重要;

}
对于类似数组的对象,它需要具有
.length
属性:

console.log(“test2:,Array.prototype.slice.apply({0:1,1:2,length:2}))