首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数与Array.prototype.slice.call(参数,0)

参数与Array.prototype.slice.call(参数,0)
EN

Stack Overflow用户
提问于 2015-07-25 23:12:48
回答 3查看 1.3K关注 0票数 1

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

代码语言:javascript
复制
function arr(){
  return arguments; // or return Array.prototype.slice.call(arguments,0);
}
arr([1,2,3],[4,5,6]);

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-25 23:22:22

区别在于arguments是一个“类似数组”的对象,而不是一个数组。

您可以通过切片将arguments对象转换为真正的数组,如下所示

代码语言:javascript
复制
Array.prototype.slice.call(arguments, 0);

这为您提供了一个数组,其中包含forEachpop等数组属性,arguments等对象没有这些属性(除了length,arguments有)。

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

您不应该分割参数,因为它阻止JavaScript引擎中的优化(例如,V8)。相反,尝试通过迭代参数对象来构造一个新数组。

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

票数 3
EN

Stack Overflow用户

发布于 2015-07-25 23:36:52

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-07-25 23:42:07

arguments变量是一种特殊的Object,而不是Array。因此,您不能在其中使用.forEach.map、'.push‘和其他数组函数。

您必须将arguments转换为Array,然后可以将值作为数组处理。

代码语言:javascript
复制
function test(){
  console.log(arguments.forEach); // undefined
  var argsArray = Array.prototype.slice.call(arguments,0);
  console.log(argsArray.forEach); // function
}
test();

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31632004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档