Javascript 在参数和其他对象上切片

Javascript 在参数和其他对象上切片,javascript,arrays,node.js,Javascript,Arrays,Node.js,我理解这样做是一种反模式: var args = Array.prototype.slice.call(arguments, 0); 然而,我的问题只是关于这行代码。我不知道它为什么有效。例如,当我打印arguments对象时 function test(){ console.log(arguments); } test(1,2) //Outputs: { '0': 1, '1': 2 } 如果我对arguments对象进行切片 function test(){ cons

我理解这样做是一种反模式:

var args = Array.prototype.slice.call(arguments, 0);
然而,我的问题只是关于这行代码。我不知道它为什么有效。例如,当我打印arguments对象时

function test(){
    console.log(arguments);
}

test(1,2)
//Outputs: { '0': 1, '1': 2 } 
如果我对arguments对象进行切片

function test(){
    console.log(Array.prototype.slice.call(arguments));
}
test (1,2)
//Outputs: [1,2]
我将获取数组中的参数。 即使我在arguments对象中附加了一些内容,切片仍然会生成数组中的参数:

function test(){
    arguments['2'] = 3;
    console.log(arguments)
    console.log(Array.prototype.slice.call(arguments));
}

test (1,2)
//Outputs: { '0': 1, '1': 2, '2': 3 }
//[ 1, 2 ]
如果它将一个对象作为对象放入slice.call

Array.prototype.slice.call({'0':1, '1':2}, 0)
我会得到一个空数组。 知道为什么slice对arguments对象有效吗?

,因为它是一个带有
length
属性的对象。如果将
length
添加到具有数字键(忽略非数字键)的对象,则生成的数组将包含这些值

console.log([].slice.call({'0':1,'1':3,a'5',长度:2},0)),因为它是一个带有
length
属性的属性。如果将
length
添加到具有数字键(忽略非数字键)的对象,则生成的数组将包含这些值


console.log([].slice.call({'0':1,'1':3,a'5',长度:2},0))参数是具有长度属性的特殊对象

arguments = {'0':1, '1':2, length: 2}
如果已将length属性添加到对象,则slice将起作用


尝试执行typeof arguments[length]以查看arguments的length属性

arguments是具有length属性的特殊对象

arguments = {'0':1, '1':2, length: 2}
如果已将length属性添加到对象,则slice将起作用


尝试执行typeof arguments[length]以查看arguments的length属性

它确实表明,如果您对参数执行slice-on-arguments,则会降低程序速度并停止优化?如果您认为slice是导致速度缓慢的原因,请务必更换它。但是,不要过早地进行优化。此外,现在您可以使用
…args
。它确实说如果你在参数上执行切片,它会减慢程序并停止优化?如果你觉得切片是导致速度缓慢的原因,那么一定要替换它。但是,不要过早地进行优化。此外,现在您可以使用
…args