【问题标题】:&& for null safe method invocation, good or bad?&& 用于 null 安全方法调用,好还是坏?
【发布时间】:2023-11-22 11:58:02
【问题描述】:

刚开始使用 jslint 来检查我的 javascript 代码。它表明我应该更换

result = value ? value : defaultValue;

result = value || defaultValue;

我认为这是一个不错的捷径,并尝试将该原理应用于对可能为 null 的变量的方法调用,而不是:

if (arg) {
    arg.doSomething();
}

我试过了:

arg && arg.doSomething();

后者在浏览器中运行良好,但 jslint 抱怨“期望一个赋值或函数调用,而是看到一个表达式。”

最后一个语句是坏的、错误的、危险的,还是 jslint 保护过度?使用var dummy = arg && arg.doSomething(); 确实让消息消失似乎很愚蠢。

【问题讨论】:

  • 我认为 Crockford 称 && 为“守卫”,并鼓励像您的示例一样使用它。也许他不使用 jslint?
  • @RobG:他可能只在表达式中使用了守卫。 :)
  • 肯定没有错;这也是 Closure Compiler 在缩小时所做的事情:closure-compiler.appspot.com/home。 (尝试缩小您的 if 子句。)
  • @RobG:Douglas Crockford 不使用 JSLint,Douglas Crockford 是 JSLint。向查克·诺里斯道歉 :-)

标签: javascript jslint


【解决方案1】:

JSLint 充其量应该认为这是一个警告(但是,JSLint 不会将警告与彻底错误区分开来),绝对不是错误 - 但请记住 JSLint 是关于强制执行 Crockford 的编码风格标准,这可能与您的不同(它们肯定与 mine 不同);您可以查看JSHint,它提供了更多控制权,但我没有立即看到针对这种特定情况的选项。

您的arg && arg.doSomething() 很好,但请注意,它有些先进,您会失去一些对您的代码进行维护的人。我从不以这种方式使用它。我确实在表达式中使用它,但不是单独使用它。是否使用取决于你,但它并不危险,只是有点不透明。

【讨论】:

  • 确实如此。我并不是说我很少使用这种模式,但为了方便起见,我绝对建议使用if( expr ) { }
  • 因为您甚至可以省略单个语句的括号,所以arg && arg.doSomething(); 不会比if(arg) arg.doSomething(); 短多少。
  • jslint 也抱怨这一点:预期为 '{' 而看到的是 'arg'。似乎所有 if/while/etc 构造都必须在 {} 中包含单个语句。
  • @andypandy:是的。同样,这是因为 JSLint 强制执行 Crockford 的风格,而大括号在他的风格中不是可选的,尽管它们在语言中是可选的。 (碰巧我和他在一起,但这是一种风格选择......)