【问题标题】:Loop in coffee script?循环咖啡脚本?
【发布时间】:2012-01-14 01:39:19
【问题描述】:

我正在将一段代码从 javascript 翻译成 coffeescript。

  for (var i = 0, len = keys.length; i < len; i++) {
    k = keys[i];
    if (!mailOptions.hasOwnProperty(k))
      mailOptions[k] = app.set('mailOptions')[k]
  }

我不知道如何处理它并且在文档网站上不清楚,有人可以给我一个明确的解释吗?非常感谢!

【问题讨论】:

  • 这样使用hasOwnProperty要小心;如果碰巧有一个名为“hasOwnProperty”的邮件选项,它将失败。要正确处理这种情况,请使用 Object.prototype.hasOwnProperty.call(mailOptions, k)(或 CoffeeScript 中的 Object::hasOwnProperty.call mailOptions, k)。

标签: coffeescript


【解决方案1】:
for key in keys
  if not mailOptions.hasOwnProperty key
    mailOptions[key] = (app.set 'mailOptions')[key]

或守卫式:

for key in keys when not mailOptions.hasOwnProperty key
  mailOptions[key] = (app.set 'mailOptions')[key]

编译为:

var key, _i, _len;

for (_i = 0, _len = keys.length; _i < _len; _i++) {
  key = keys[_i];
  if (!mailOptions.hasOwnProperty(key)) {
    mailOptions[key] = (app.set('mailOptions'))[key];
  }
}

【讨论】:

  • 守卫风格在这里更可取(imo)。对于它的价值,(app.set 'mailOptions')[key] 更常见的是写成app.set('mailOptions')[key],当然 lispy 风格是完全有效的。
【解决方案2】:

这是一种方法(来自这里:http://js2coffee.org/):

i = 0
len = keys.length

while i < len
  k = keys[i]
  mailOptions[k] = app.set("mailOptions")[k]  unless mailOptions.hasOwnProperty(k)
  i++

但我不会这样做。我会这样做:

for k in keys
  mailOptions[k] = app.set("mailOptions")[k] unless mailOptions.hasOwnProperty k

这会输出以下内容(不包括var,它也会输出):

for (_i = 0, _len = keys.length; _i < _len; _i++) {
  k = keys[_i];
  if (!mailOptions.hasOwnProperty(k)) {
    mailOptions[k] = app.set("mailOptions")[k];
  }
}

或者,如果你想变得更漂亮,在这种情况下我不建议这样做,因为它会牺牲一些可读性:

(mailOptions[k] = app.set("mailOptions")[k] unless mailOptions.hasOwnProperty k) for k in keys

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2015-12-12
    • 2012-06-14
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多