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
...