我正在阅读optparse.coffee,并与以下行混淆:
args = args[..]
那条线有什么作用?
来自精美手册:
数组切片和范围拼接
范围也可用于提取数组切片。有两个点 (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)
所以对整个数组进行了浅拷贝。