拼接的逻辑来自coffeescript.org的例子

时间:2013-11-16 11:52:19

标签: javascript coffeescript

通过coffeescript.org漫游,面对这个非常简单,乍一看,从咖啡中编译js的例子: 咖啡:

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[3..6] = [-3, -4, -5, -6]

JS:

var numbers, _ref;
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
[].splice.apply(numbers, [3, 4].concat(_ref = [-3, -4, -5, -6])), _ref;

使用此示例点击网站上的运行按钮时,它会返回该数字变量, 但如果查看最后一行JS,我们在逗号之后得到_ref,如果相信js文档的优先级最低但最终返回正确的结果,并且在这里我的视觉逻辑分解,那么编写这样的代码的意义是什么?为什么我们需要在concat中缓存那个_ref然后在parens之后用逗号返回它,只是让我的脑袋爆炸,为什么???有什么建议吗?

1 个答案:

答案 0 :(得分:3)

拿这行代码:

numbers[3..6] = [-3, -4, -5, -6]

您希望它返回什么? Javascript中的所有表达式(也可能在Coffeescript中)都有返回值。 =的典型返回值是运算符的右侧。所以我们需要返回数组[-3, -4, -5, -6]。我们不能只返回任何旧数组:我们需要返回那个数组。 (请记住,Javascript数组是通过引用传递的。)

因此,当我们查看这行代码时:

[].splice.apply(numbers, [3, 4].concat(_ref = [-3, -4, -5, -6])), _ref;

首先评估逗号的左侧,执行我们想要的操作。但是,这将返回splice的返回值,这不是我们想要的,因为那将是从原始数组中删除的元素。所以我们需要逗号运算符。

逗号运算符,MDN docs描述:

  

计算其两个操作数(从左到右)并返回第二个操作数的值

从表面上看,你认为我们可以做到这一点:

[].splice.apply(numbers, [3, 4].concat([-3, -4, -5, -6])), [-3, -4, -5, -6];

但这是错误的。好的,这可能会奏效。但我们不想返回具有这些元素的数组。不,我们想要返回原始数组,即我们在concat调用中使用的相同数组。所以我们需要缓存值(在_ref中),然后在逗号后再次引用它。