在函数中使用参数和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]);

答案 0 :(得分:3)
不同之处在于arguments
是"类似数组" 对象,而不是数组。
您可以通过切片将arguments
对象转换为真实数组,如此
Array.prototype.slice.call(arguments, 0);
这会为您提供一个数组,其中包含forEach
,pop
等数组属性等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();