2012-12-05 48 views
1

在我的Javascript代码,我处理与特性,这种特性为null许多JSON对象:为...在如果不是null或undefined

if (store.departments != null) { 
    for(var i = 0; i < store.departments.length; i++) { 
     alert(department.name); 
    } 
} 

在移植我的应用程序的CoffeeScript,我想出了以下使用存在操作符的快捷键:

for department in store.departments ? [] 
    alert department.name 

这是可以接受的咖啡标记吗?有没有这种情况不能按预期工作?

回答

1

这是怎么回事?

if store.departments 
    alert department.name for department in store.departments 

或者

alert department.name for department in store.departments if store.departments 

两个语句编译为:

var department, _i, _len, _ref; 

if (store.departments) { 
    _ref = store.departments; 
    for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
    department = _ref[_i]; 
    alert(department.name); 
    } 
} 
+0

'if store.departments'和'store.departments?'是否有区别? – trebuchet

+0

此外,'alert department.name'仅供参考 - 实际应用程序有一整块处理代码 – trebuchet

+0

@trebuchet是的,存在差异 - 存在操作符显式检查null/undefined,所以falsy值像' “”'会返回true('“”?== true',即使'!!“”== false“)。它还避免了未定义变量的错误(即使未定义“x”,x也不会抛出错误)。 –

1

如果我明白了什么傻冒问,这个代码没有你在想什么。

for department in store.departments ? [] 

它看起来像你使用存在运营商?相似,你会怎么三元运营商a?b:c。 来自coffeescript.org:

在JavaScript中检查变量的存在有点困难。如果(变量)...接近,但失败为零,空字符串和假。 CoffeeScript的存在操作符?返回true,除非一个变量为空或未定义,这使得它类似于Ruby的零?

如果我想以后使用的名字,我会写这样的:

if store.departments? 
    names = (department.name for department in store.departments) 

你可以把它全部在同一行,但有一个列表理解,变得相当不可读。存在操作符将会测试null,并且只有在它真的存在时才返回true。

如果你想在CoffeeScript中使用三元运算符,它不太简洁:

for department in if store.departments? then store.departments else [] 

也许不是你想要什么,因为它是非常详细的在这里。

相关问题