Coffeescript执行列表理解对象

Coffeescript执行列表理解对象,coffeescript,Coffeescript,为什么coffeescript不返回对象键,而是将x的值视为字符串“x” coffee> a = { test: '0', super: '1' } coffee> x for x,y of a [ 'test', 'super' ] coffee> {x:y} for x,y of a [ { x: '0' }, { x: '1' } ] 因为这就是工作原理。假设它按照您希望的方式工作。如果我在某个地方这样说会发生什么: window.test = 'pancakes'

为什么coffeescript不返回对象键,而是将x的值视为字符串“x”

coffee> a  = { test: '0', super: '1' }
coffee> x for x,y of a
[ 'test', 'super' ]
coffee> {x:y} for x,y of a
[ { x: '0' }, { x: '1' } ]
因为这就是工作原理。假设它按照您希望的方式工作。如果我在某个地方这样说会发生什么:

window.test = 'pancakes'
这只不过是一个
测试
变量进入每个人的范围,突然间你的
a
将是:

a = { 'pancakes': '0', super: '1' }
你会想知道你的电脑在搞什么鬼把戏。因此,如果属性名作为变量计算,而不是引用较少的字符串,那么我们最终都会写出一些难看的东西,比如:

a = { 'test': '0', 'super': '1' }
只是为了得到可预测和一致的结果

我认为获得所需的最简单方法是添加一个小功能:

objectify = (k, v) ->
    o = { }
    o[k] = v
    o
然后你可以:

a = (objectify(x, y) for x, y of o)
演示:

因为这就是工作原理。假设它按照您希望的方式工作。如果我在某个地方这样说会发生什么:

window.test = 'pancakes'
这只不过是一个
测试
变量进入每个人的范围,突然间你的
a
将是:

a = { 'pancakes': '0', super: '1' }
你会想知道你的电脑在搞什么鬼把戏。因此,如果属性名作为变量计算,而不是引用较少的字符串,那么我们最终都会写出一些难看的东西,比如:

a = { 'test': '0', 'super': '1' }
只是为了得到可预测和一致的结果

我认为获得所需的最简单方法是添加一个小功能:

objectify = (k, v) ->
    o = { }
    o[k] = v
    o
然后你可以:

a = (objectify(x, y) for x, y of o)

演示:

对于编程语言来说,可预测且一致的结果非常好。a={'test':'0','super':'1}在我看来很好,因为它避免了歧义。否则,coffeescript就不得不做出一个固执己见的猜测,在这种情况下,它猜错了。感谢您的详细回答和解决方案功能!有用的!当涉及到编程语言时,可预测和一致的结果是相当好的。a={'test':'0','super':'1}在我看来很好,因为它避免了歧义。否则,coffeescript就不得不做出一个固执己见的猜测,在这种情况下,它猜错了。感谢您的详细回答和解决方案功能!有用的!