在函数中使用参数和Array.prototype.slice.call(参数,0)有什么区别?我看不出两者之间有什么区别,所以我怎么知道什么时候该用哪一种呢?
function arr(){
return arguments; // or return Array.prototype.slice.call(arguments,0);
}
arr([1,2,3],[4,5,6]);
发布于 2015-07-25 23:22:22
区别在于arguments是一个“类似数组”的对象,而不是一个数组。
您可以通过切片将arguments对象转换为真正的数组,如下所示
Array.prototype.slice.call(arguments, 0);这为您提供了一个数组,其中包含forEach、pop等数组属性,arguments等对象没有这些属性(除了length,arguments有)。
对arguments对象进行切片通常(几乎)不是一个好主意,MDN给出了警告
您不应该分割参数,因为它阻止JavaScript引擎中的优化(例如,V8)。相反,尝试通过迭代参数对象来构造一个新数组。
此外,不应该真正需要将参数传递给函数,而只需要返回它们。
发布于 2015-07-25 23:36:52
参数对象不是真正的数组。它是一种特殊类型的对象,除了"length“之外没有任何Array属性。
若要从参数对象创建数组,请使用Array.prototype.slice.call(参数,0);
发布于 2015-07-25 23:42:07
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();
https://stackoverflow.com/questions/31632004
复制相似问题