javascript - 来自coffeescript.org示例的拼接逻辑

标签 javascript coffeescript

浏览coffeescript.org,乍一看,遇到了这个极其简单的从coffee编译为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 文档具有最低优先级但最终返回正确的结果,并且在这里我的视觉逻辑崩溃了,那么编写这样的代码有什么意义呢?为什么我们需要将 _ref 缓存在 concat 中,然后在括号后以逗号返回它,我的头爆炸了,为什么???有什么建议吗?

最佳答案

采用这行代码:

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描述:

evaluates both of its operands (from left to right) and returns the value of the second operand

从表面上看,您会认为我们可以这样做:

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

但那是错误的。好的,在这里它可能会起作用。但我们不想返回包含这些元素的数组。不,我们想要返回原始数组,即我们在 concat 调用中使用的相同数组。因此我们需要缓存该值(在 _ref 中),然后在逗号之后再次引用它。

关于javascript - 来自coffeescript.org示例的拼接逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018088/

相关文章:

javascript - PhantomJS - 从点击事件加载的内容不会加载到 DOM

javascript - 让 Stripe Elements 表单出现

javascript - 有没有办法知道 <head> 内的外部 CSS 何时被应用,而不是等待图像加载

javascript - ExecJS::ProgramError: SyntaxError: 保留字 "function"

Coffeescript 中用于 Google Analytics 代码的 Javascript 范围

javascript - 如何推送到特定位置的数组?

javascript - 具有自动布局的表格的最大宽度

javascript - ember this.get 未捕获类型错误 : Object #<Window> has no method 'get'

ruby-on-rails - Rails 3.1。如何防止Rails使用CoffeeScript?

javascript - 通过 Node.js 将 base64 编码的图像上传到 Amazon S3