2

这个咖啡脚本:

if  typeof(groups) is undefined or groups.length == 0

被编译成以下 javascript:

if (typeof groups === void 0 || groups.length === 0)

基本上我想检查组数组是否为空或为空,并希望如果第一个条件为真,则不会检查第二个条件(短路)。但是 Chrome 会抛出以下错误:

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

关于为什么它不会短路的任何见解?

4

3 回答 3

5

因为第一个条件永远不会成立。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
于 2012-09-28T11:33:20.493 回答
3

CoffeeScript 有一个运算符可以为您处理这种情况。如果您使用:

unless groups?.length > 0

它将形成您要查找的内容,处理未定义/空的情况,并且仅尝试groups.length是否groups已定义。这具有易于链接的优点:

if foo?.bar?.length > 0
于 2012-09-28T14:43:30.407 回答
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

于 2012-09-28T16:42:30.400 回答