问题描述
在函数中使用参数和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]);
1楼
adeneo
3
已采纳
2015-07-25 23:22:22
不同之处在于arguments
是“类似数组的”对象,而不是数组。
您可以通过切片将arguments
对象转换为真实数组,如下所示
Array.prototype.slice.call(arguments, 0);
这为您提供了一个数组,具有诸如forEach
, pop
等的数组属性,而像arguments
这样的对象则没有(长度除外,而那些arguments
确实具有)。
切片arguments
对象通常(几乎)永远不是一个好主意, 会发出警告
您不应切入参数,因为它会阻止JavaScript引擎(例如V8)中的优化。 而是尝试通过遍历arguments对象构造一个新数组。
同样,没有真正必要将参数传递给函数,而只是返回它们。
2楼
AwesomelyStupid
1
2015-07-25 23:36:52
arguments对象不是真正的数组。 它是一种特殊的对象,除“ length”外没有任何Array属性。
要从arguments对象创建数组,请使用Array.prototype.slice.call(arguments,0);
3楼
just-boris
0
2015-07-25 23:42:07
arguments
变量是Object
一种特殊类型,不是Array
。
因此,您不能.forEach
使用.forEach
, .map
,'。 .forEach
'和其他数组函数。
您必须将arguments
转换为Array
,然后可以将值用作数组
function test(){ console.log(arguments.forEach); // undefined var argsArray = Array.prototype.slice.call(arguments,0); console.log(argsArray.forEach); // function } test();