【问题标题】:What exactly does [].slice do [duplicate][].slice 究竟做了什么[重复]
【发布时间】:2015-09-15 09:56:51
【问题描述】:

我多次看到以下表达式:

var args = [].slice.call(arguments, 0);

但是[].slice.call([1,2,3,4,5], 0) 正好是[1,2,3,4,5]

这不就是说

var args = arguments?

那么[].slice 到底是做什么的呢?

【问题讨论】:

  • 它将函数参数转换为数组,以便您可以在其上使用数组原型方法。
  • 关于第二部分的问题。我看到很多人在做var args = [].slice.call(arguments, 0);。这种模式有什么好处而不是仅仅使用var args = arguments
  • 阅读我上面的评论:它允许您使用数组原型方法。你不能sort一个arguments对象,你不能filter一个arguments对象,你不能map一个arguments对象。不过,您可以使用 Array-sliced arguments 对象来做到这一点。
  • 所以基本上你正在为未来的数组方法准备参数,对吧?即使您没有在此功能范围内使用它,但它为您提供了未来的可扩展性。我的理解正确吗?
  • 不确定我是否能正确解释您对“未来”一词的使用;你的意思是“在代码的后期”还是“在 ES6 成为标准的未来”?将arguments 对象转换为 Array 的核心是在其上使用只有 Array 对象才有的方法。

标签: javascript


【解决方案1】:

slice 是一种数组方法,可以从数组中提取子数组:

slice 方法接受两个参数,startend,并返回 一个数组,包含从元素 start 开始的数组元素 到,但不包括,元素 end(或通过数组的末尾 如果 endundefined)。

例如:

[0,1,2,3,4].slice(2);   // [2,3,4]
[0,1,2,3,4].slice(-2);  // [3,4]
[0,1,2,3,4].slice(2,4); // [2,3]
[0,1,2,3,4].slice();    // [0,1,2,3,4]

具体来说,slice()slice(0) 都会生成数组的副本。这样您就可以在不影响原件的情况下更改副本,反之亦然。

此外,它还可以与类似数组的对象一起使用:

slice 函数是故意通用的;它不需要 它的 this 值是一个 Array 对象。因此可以转移到 用作方法的其他类型的对象。

因此,它经常被用来从一个类似数组的对象构建一个真正的数组:

[].slice.call({0:0, 1:1, 2:2, length:3}); // [0,1,2]

注意这个技巧在 ECMAScript 6 中不再需要,因为你可以使用Array.from

Array.from({0:0, 1:1, 2:2, length:3}); // [0,1,2]

拥有一个真正的数组而不是类似数组的对象的优点是您可以在它们上使用数组方法。

【讨论】:

  • 感谢您指出类数组对象的创建。
猜你喜欢
  • 2019-03-06
  • 2015-12-02
  • 2012-07-23
  • 2016-09-10
  • 2023-03-15
  • 2012-10-17
  • 2021-06-04
  • 1970-01-01
  • 2018-07-30
相关资源
最近更新 更多