Coffeescript || =类似物?

我主要是一个Rails开发人员,所以在为我公司的Hubot实例提供一个小脚本时,我希望完成以下任务:

robot.brain.data.contacts ||= {} 

或者,只有在这个新的哈希值不存在的情况下才能使用。 这个想法是我想要通过脚本dynamic添加联系人数组,所以我不必修改Hubot的源代码,我显然不想覆盖添加到它的任何联系人。

问题:是否有像Rails || =这样的快速构造,可以在Coffeescript中使用以实现上述目标?

干杯。

您可以使用?=进行有条件的分配:

 speed ?= 75 

这个? 是CoffeeScript中的“存在操作符”,所以它将testing存在(不是真实性):

 if (typeof speed === "undefined" || speed === null) speed = 75; 

由此产生的JS在你的情况下有点不同,因为你正在testing一个对象的属性,而不仅仅是一个variables,所以robot.brain.data.contacts ?= {}结果如下:

 var _base, _ref; if ((_ref = (_base = robot.brain.data).contacts) != null) { _ref; } else { _base.contacts = {}; }; 

更多信息: http : //jashkenas.github.com/coffee-script/

我个人使用or=而不是?=主要是因为当我在Ruby中使用它时,我称之为||= (或 – 等于)。

 robot.brain.data.contacts or= {} 

不同之处在于,当robot.brain.data.contacts不为null时, or= short-circuits,而?=testing为null并且只有在robot.brain.data.contacts设置为{}时才robot.brain.data.contacts其设置为{}

查看编译的差异。

正如在另一篇文章中提到的,两种方法都不检查robot robot.brainrobot.brain.data的存在,但是Ruby也没有。

编辑:

此外,在CoffeeScript or=||=编译到相同的JS。

?=将分配一个variables,如果它为nullundefined

使用它像speed ?= 25

它被称为Coffeescript中的存在操作符,是?= , http: //coffeescript.org/。 引用如下:

存在的操作者

在JavaScript中检查variables的存在有点困难。 如果(variables)接近,但失败为零,则为空string,并且为false。 CoffeeScript的存在操作符? 返回true,除非一个variables是null或undefined,这使得它类似于Ruby的零?

它也可以用于比|| =提供更安全的条件赋值,用于可能处理数字或string的情况。

CoffeeScript的Coco方言http://github.com/satyr/coco支持数组和对象自动版化操作符;@@@

 robot@brain@data@contacts.foo = 1 

编译为 – 授予,毛茸茸的样子 –

 var _ref, _ref2; ((_ref = (_ref2 = robot.brain || (robot.brain = {})).data || (_ref2.data = {})).contacts || (_ref.contacts = {})).foo = 1; 

这确保了每一步的方式, robot.brainbrain.datadata.contacts确实存在。

当然,你可能只是想要实际的条件赋值操作符(根据上面的答案,也存在于CoffeeScript中):

 robot.brain.data.contacts ?= {} 

编译为

 var _ref; (_ref = robot.brain.data).contacts == null && (_ref.contacts = {});