coffee/javascript中的短路

coffee/javascript中的短路,javascript,coffeescript,Javascript,Coffeescript,这个咖啡脚本: if typeof(groups) is undefined or groups.length == 0 编译为以下javascript: if (typeof groups === void 0 || groups.length === 0) 基本上,我想检查groups数组是否为null或空,希望如果第一个条件为true,则不会检查第二个条件(短路)。但是,Chrome会抛出以下错误: 未捕获类型错误:无法读取未定义的属性长度 关于为什么它不会短路有什么见解吗?因为第一

这个咖啡脚本:

if  typeof(groups) is undefined or groups.length == 0
编译为以下javascript:

if (typeof groups === void 0 || groups.length === 0)
基本上,我想检查groups数组是否为null或空,希望如果第一个条件为true,则不会检查第二个条件(短路)。但是,Chrome会抛出以下错误:

未捕获类型错误:无法读取未定义的属性长度


关于为什么它不会短路有什么见解吗?

因为第一个条件永远不会成立
void 0
将计算为值
undefined
(不是字符串“undefined”),但
typeof
返回字符串“undefined”

JavaScript应为:

if (typeof groups === "undefined" || groups.length === 0)
或:

要修复咖啡脚本,需要检查字符串“undefined”:


CoffeeScript有一个操作员为您处理这个案例。如果您使用:

unless groups?.length > 0
它将形成您要查找的内容,处理未定义/空的情况,并且仅尝试
组。如果定义了
组,则长度
。这具有易于链接的优点:

if foo?.bar?.length > 0

如果
groups
是一个局部变量,您可以询问:

if not groups or groups.length is 0
  ...
如果是未定义的全局变量(即访问
将抛出“未定义”错误),则可以使用存在运算符

if not groups? or groups.length is 0
  ...
最后,当您在第二个条件中请求
length
属性时,您可以利用0是falsy的事实:

if not groups?.length
  ...

最后一个表达式不关心是否定义了
groups
变量;它在两种情况下都能工作=D

你还应该检查
null
嗨,请看我关于短路的小博客,我希望它能帮上一点忙:js-guru.blogspot.com/2015/08/javascript-short-circuiting.htmlun幸运的是,我认为第一个片段并不等同于OP所要求的,因为如果
groups
为null或未定义,它的计算结果将为
false
。事实上,我冒昧地修复了它。不过,这是正确的方法。
if not groups? or groups.length is 0
  ...
if not groups?.length
  ...