args和args [..]是一样的吗?

时间:2013-02-19 03:42:50

标签: arrays coffeescript

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

args = args[..]

这条线做什么?

1 个答案:

答案 0 :(得分:3)

来自fine manual

  

使用范围进行数组切片和拼接

     

范围也可用于提取数组切片。有两个点(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的末尾,因为数组从零开始索引,{{ 1}}制作整个数组的浅表副本。