【发布时间】: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。 1 和 2 之间的区别只是简单的优先级:赋值比循环表达式绑定得更紧密,因此您必须在括号中折腾才能在赋值之前评估循环。跨度>
标签: coffeescript underscore.js filtering list-comprehension