Coffeescript 如果不为空或未定义,则为中的

Coffeescript 如果不为空或未定义,则为中的,coffeescript,Coffeescript,在我的Javascript代码中,我处理了许多属性可能为null的json对象: if (store.departments != null) { for(var i = 0; i < store.departments.length; i++) { alert(department.name); } } 这是可以接受的咖啡脚本吗?是否存在这样的情况,在这种情况下它将无法按预期工作?这是怎么回事 if store.departments alert

在我的Javascript代码中,我处理了许多属性可能为null的json对象:

if (store.departments != null) {
    for(var i = 0; i < store.departments.length; i++) {
        alert(department.name);
    }
}
这是可以接受的咖啡脚本吗?是否存在这样的情况,在这种情况下它将无法按预期工作?

这是怎么回事

if store.departments  
  alert department.name for department in 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);
  }
}
var部门,\u i,\u len,\u ref;
if(商店、部门){
_ref=仓库部门;
对于(_i=0,_len=_ref.length;_i<_len;_i++){
部门=_ref[_i];
警报(部门名称);
}
}

如果我理解你的要求,那么这段代码并不能满足你的想法

for department in store.departments ? []
看起来您使用的是存在运算符
,类似于三元运算符
a?b:c
。 从coffeescript.org:

检查JavaScript中是否存在变量有点困难。如果(变量)。。。接近,但对于零、空字符串和false失败。CoffeeScript的存在算子?返回true,除非变量为null或未定义,这使得它类似于Ruby的nil

如果我以后想使用这些名称,我会写下如下内容:

if store.departments?
    names = (department.name for department in store.departments)
你可以把它全部放在一行,但是如果你理解了列表,那就很难阅读了。存在运算符将测试null&&unde,并且仅当它确实存在时才返回true

如果您想在coffeescript中使用三元运算符,它就不那么简洁了:

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

可能不完全是你想要的,因为这里非常冗长。

如果应用商店.部门和如果应用商店.部门之间有区别吗??另外,
提醒部门.名称
仅用于参数-实际应用程序有整个处理块code@trebuchet对有一个区别-存在运算符显式检查null/undefined,因此像
这样的假值将返回true(
”?==true
,即使
!!“==false
)。它还可以屏蔽未定义变量的错误(
x?
即使
x
未定义,也不会抛出错误)。
if store.departments?
    names = (department.name for department in store.departments)
for department in if store.departments? then store.departments else []