这两种方法在JavaScript函数中利用arguments对象有什么区别?

时间:2017-01-17 20:36:44

标签: javascript

Array.prototype.slice方法的文档中,它说:

  

可以使用Function.prototype的.call函数完成绑定   它也可以使用[] .slice.call(arguments)而不是   Array.prototype.slice.call。

function getArgs() {
  var args = [].slice.call(arguments);
  return args;
}
getArgs(1,2,3); // returns [1, 2, 3]

function getArgs2() {
  var args = Array.prototype.slice.call(arguments);
  return args;
}
getArgs2(1,2,3); // returns [1, 2, 3]

基本上有什么区别?使用其中一种方法是否有性能优势?或者前者更容易输入?

1 个答案:

答案 0 :(得分:2)

这两者都做同样的事情,即调用数组.slice()方法。第一种方法通过来自新空数组的隐式原型查找来获取函数,另一种方式明确地转到Array.prototype对象。可能存在性能差异,但它并不重要或相关,因为无论如何两种方式都会丢失大量性能:将arguments对象传递出函数可能会使运行时系统放弃优化函数。

为避免性能损失,应使用简单的本地for循环:

function foo() {
  var args = [];
  for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i];
  // ...
}