0

我正在阅读optparse.coffee,并与以下行混淆:

args = args[..]

那条线有什么作用?

4

1 回答 1

3

来自精美手册

数组切片和范围拼接

范围也可用于提取数组切片。有两个点 (3..6),范围包括 ( 3, 4, 5, 6);带有三个点 ( 3...6),范围不包括结尾 ( 3, 4, 5)。切片索引具有有用的默认值。省略的第一个索引默认为零,省略的第二个索引默认为数组的大小。

所以说array[..]是以下的简写:

len = array.length
array[0 .. len]

这只是对array. 这意味着args = args[..]只需制作一个本地浅表副本,args以便args可以在不更改传入的原始数组的情况下对其进行操作和更改,并且您可以存储对数组的引用,而函数的调用者不会通过原始args引用意外更改您的数组被传递给函数。

考虑这个简化的例子:

f = (args) -> args = args[..]

这变成了这个JavaScript:

var f;

f = function(args) {
  return args = args.slice(0);
};

并且Array#slice

返回数组的一部分的浅拷贝。
[...]
如果end省略,切片提取到序列的末尾。

所以说array.slice(n)返回一个array从索引n开始到末尾的浅拷贝,array并且由于数组从零开始索引,array.slice(0)所以对整个数组进行了浅拷贝。

于 2013-02-19T04:44:41.007 回答