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.brain
或robot.brain.data
的存在,但是Ruby也没有。
编辑:
此外,在CoffeeScript or=
和||=
编译到相同的JS。
?=
将分配一个variables,如果它为null
或undefined
。
使用它像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.brain
, brain.data
, data.contacts
确实存在。
当然,你可能只是想要实际的条件赋值操作符(根据上面的答案,也存在于CoffeeScript中):
robot.brain.data.contacts ?= {}
编译为
var _ref; (_ref = robot.brain.data).contacts == null && (_ref.contacts = {});