【问题标题】:no difference between [..] and [...] for array?数组的 [..] 和 [...] 之间没有区别吗?
【发布时间】:2014-04-24 02:00:48
【问题描述】:

编辑:made a github issue,一天后被 jashkenas 关闭。因此,要点本质上是“按预期工作”。

coffee> arr
[ 0,
  1,
  2,
  3,
  'A',
  'K' ]
coffee> arr[...]
[ 0,
  1,
  2,
  3,
  'A',
  'K' ]
coffee> arr[..]
[ 0,
  1,
  2,
  3,
  'A',
  'K' ]

According to the docs,应该不一样。

有两个点 (3..6),范围包括 (3, 4, 5, 6);带有三个点 (3...6),范围不包括结尾 (3, 4, 5)。

生成的两个slice 语句是相同的。在我看来.. 应该产生.slice(0)... 应该产生.slice(0, -1) 我错过了什么或看到一个错误吗?

1.7.1

【问题讨论】:

  • 两者都产生.slice(0)。我不确定这是错误还是功能。
  • @amoebe 同样;我可能不得不提出一个问题——它看起来像是一个疏忽。
  • 查看@nicolaskruchten 的回答,我认为这不是错误。 Coffeescript 的范围有点混乱。

标签: coffeescript


【解决方案1】:

文档接着说:

切片索引具有有用的默认值。省略的第一个索引默认值 为零,省略的第二个索引默认为数组的大小。

这与您所看到的一致。你的数组的长度是 6 所以:

  • [..] 等价于 [0..6] 将编译为 .slice(0,7)
  • [...] 等同于 [0...6] 将编译为 .slice(0,6)

对于长度为 6 的数组,.slice(0,6).slice(0,7) 都返回所有元素,因此两者都等效于 .slice(0),这是 [..][...] 编译到的。

如果省略的第二个索引默认为数组大小减 1,您所期望的就是这种情况,但事实并非如此。

【讨论】:

  • 正如我所说,它们都编译为slice(0);看起来他们应该产生不同的输出
  • 我刚刚展示了如何严格应用默认值意味着编译为slice(0) 是有意义的,我并不是说我同意这些默认值:)
  • 文档非常清楚地表明with three dots (3...6), the range excludes the end - 但我们没有看到。因此问题。给定不同的输入,代码生成等效的默认值是没有意义的。
  • 问题是,在这种情况下,“end”首先不是数组的一部分,如a[a.length] === undefined,所以是否包含它并不重要。您可以使用以下代码删除最后一个元素:[...-1]。请注意,[..-1] 会按预期生成 .slice(0)
  • @amoebe 我使用它作为一种解决方法,但它既丑陋又直观,... 应该产生相同的结果。是否值得将其发布到他们的 github 问题跟踪器?
猜你喜欢
  • 2012-02-16
  • 2015-08-11
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2020-01-11
  • 2016-12-02
  • 2021-10-09
  • 2010-09-27
相关资源
最近更新 更多