这个咖啡脚本:
if typeof(groups) is undefined or groups.length == 0
被编译成以下 javascript:
if (typeof groups === void 0 || groups.length === 0)
基本上我想检查组数组是否为空或为空,并希望如果第一个条件为真,则不会检查第二个条件(短路)。但是 Chrome 会抛出以下错误:
未捕获的类型错误:无法读取未定义的属性长度
关于为什么它不会短路的任何见解?
这个咖啡脚本:
if typeof(groups) is undefined or groups.length == 0
被编译成以下 javascript:
if (typeof groups === void 0 || groups.length === 0)
基本上我想检查组数组是否为空或为空,并希望如果第一个条件为真,则不会检查第二个条件(短路)。但是 Chrome 会抛出以下错误:
未捕获的类型错误:无法读取未定义的属性长度
关于为什么它不会短路的任何见解?
因为第一个条件永远不会成立。void 0将计算值undefined(不是字符串“undefined”),但typeof返回字符串“undefined”。
JavaScript 应为:
if (typeof groups === "undefined" || groups.length === 0)
或者:
if (groups === void 0 || groups.length === 0)
要修复 CoffeeScript,您需要检查字符串“undefined”:
if typeof groups is "undefined" or groups.length == 0
CoffeeScript 有一个运算符可以为您处理这种情况。如果您使用:
unless groups?.length > 0
它将形成您要查找的内容,处理未定义/空的情况,并且仅尝试groups.length是否groups已定义。这具有易于链接的优点:
if foo?.bar?.length > 0
如果groups是局部变量,你可以问:
if not groups or groups.length is 0
...
如果它是一个可能未定义的全局变量(即访问groups将抛出“未定义”错误),您可以使用存在运算符?:
if not groups? or groups.length is 0
...
最后,当您要求length第二个条件中的属性时,您可以利用 0 是假的这一事实:
if not groups?.length
...
最后一个表达式不关心groups变量是否定义;它适用于两种情况=D