arguments vs Array.prototype.slice.call(arguments,0)

时间:2015-07-25 23:12:49

标签: javascript arrays arguments

在函数中使用参数和Array.prototype.slice.call(arguments,0)有什么区别? 我不知道两者之间有什么不同,所以我怎么知道什么时候应该使用哪一个?



function arr(){
  return arguments; // or return Array.prototype.slice.call(arguments,0);
}
arr([1,2,3],[4,5,6]);




3 个答案:

答案 0 :(得分:3)

不同之处在于arguments"类似数组" 对象,而不是数组。

您可以通过切片将arguments对象转换为真实数组,如此

Array.prototype.slice.call(arguments, 0);

这会为您提供一个数组,其中包含forEachpop等数组属性等arguments之类的对象(长度除外,arguments确实有。)

arguments对象进行切片通常(几乎)绝不是一个好主意,MDN会发出警告

  

你不应该对参数进行切片,因为它会阻止优化   JavaScript引擎(例如V8)。相反,尝试构建一个新的   数组通过遍历参数对象。

此外,不应该真正需要将参数传递给函数,只是为了返回它们。

答案 1 :(得分:1)

arguments对象不是真正的数组。它是一种特殊类型的对象,除了“length”之外没有任何Array属性。

要从arguments对象创建数组,请使用Array.prototype.slice.call(arguments,0);

答案 2 :(得分:0)

arguments变量是特殊类型的Object,而不是Array。因此,您无法使用.forEach.map,'。push'和其他数组函数。

您必须将arguments转换为Array然后才能将值作为数组使用

function test(){
  console.log(arguments.forEach); // undefined
  var argsArray = Array.prototype.slice.call(arguments,0);
  console.log(argsArray.forEach); // function
}
test();