【问题标题】:coffeescript for in when vs underscore filter用于何时与下划线过滤器的咖啡脚本
【发布时间】:2014-09-28 23:21:48
【问题描述】:

案例 1:

我原以为这两行代码会产生相同的结果,但事实并非如此。

readies = _.filter sections, (section) -> section.ready()

readies = section for section in sections when section.ready()

案例 2:

这两行代码产生相同的结果(唯一的区别是括号)

readies = _.filter sections, (section) -> section.ready()

readies = (section for section in sections when section.ready())

案例 3:

作为上述的对立面,为什么在上述情况下,以下行会产生相同的结果?

bobs = _.filter sections, (section) -> section.name is "bob"

bobs = section for section in sections when section.name is "bob"

案例 1 中的方法调用是否会阻止 when 子句按预期工作,如果是,为什么?

为什么 case 2 需要括号才能工作,而 case 3 不需要括号?

【问题讨论】:

  • 您确定案例三吗?他们为我制作the same JavaScript structure。您能否提供 jsfiddle.net 或类似网站上的运行示例?
  • 案例 1 和案例 3 生成相同的 javascript,将 section.ready() 替换为 section.name==="bob" 所以问题是,section.ready() 在做什么?案例 2 生成完全不同的 javascript,它更接近于 _.filter 方法,它基于与谓词匹配的对象构建一个数组。情况 1 和 3 将只返回一个对象,而情况 2 和 _.filter 方法返回数组。
  • 有趣。在情况 1 中,无括号的列表理解产生与 _.find … 的等效项 - coffeescript.org/… 显示差异。在情况 3 中,结果等效。米娅·卡尔帕
  • 对。案例 3 又是案例 1。 12 之间的区别只是简单的优先级:赋值比循环表达式绑定得更紧密,因此您必须在括号中折腾才能在赋值之前评估循环。跨度>

标签: coffeescript underscore.js filtering list-comprehension


【解决方案1】:

括号在理解中很重要,这是有原因的。考虑函数调用而不是赋值:

foo (section for section in sections when section.ready())

对比

foo section for section in sections when section.ready()

在第一种情况下,您将所有准备好的部分放在一起并将它们作为参数提供给foo
在第二种情况下,您分别在每个准备好的部分调用foo

第三种情况也是如此:您需要括号来获取所有名为"bob" 的部分的列表。但是如果你去掉括号,将会在部分中为每个"bob" 执行赋值。你会在你的bob 变量中得到一个"bob"undefined 如果没有,如果有很多则最后一个)。

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2015-10-02
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多