JavaScript编码技术还是坏代码?

时间:2010-11-03 20:51:26

标签: javascript coding-style idioms logical-operators short-circuiting

在调试其他人编写的javascript时,我遇到了一些我以前从未见过的代码。这是一个示例:

function doSomething() {
    //doing something here...
}

function doItNow() {
    //other logic...
    doSomething && doSomething();    // <=== What's this?
}

函数doItNow()中第二行的目的是检查doSomething是否存在然后调用它?像这样:

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}

JSLint不喜欢它,我宁愿在我的应用程序中没有错误的代码。任何见解?

3 个答案:

答案 0 :(得分:7)

确实是'速记'。右侧仅在左侧作为if()语句传递时执行。

Google Closure Compiler和其他缩放器利用了这一点;如果您的输入为if(a) a(),则会生成a&&a()


您可以对||执行相同的操作,例如:

if( !a ){
  alert('Not a');
}

可以写成

a || alert('Not a');

答案 1 :(得分:6)

是的,您的两个示例是“等效的”,&&运算符执行short-circuit evaluation

如果第一个操作数表达式产生 falsey 值(例如nullundefined0NaN,则为空字符串,当然false),第二个操作数表达式将进行评估,如果值为 truthy ,则将进行函数调用。

但如果尚未声明doSomething,则您的两个示例都将失败

如果在代码中引用了未声明的标识符,则会出现ReferenceError异常,例如:

function foo() {
  undeclared && undeclared();
}

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}

如果你想:

  1. 确保标识符存在,
  2. 确保可以调用
  3. 你可以:

    if (typeof doSomething == 'function') {
      doSomething();
    }
    

    typeof operator可以安全地用于不存在的标识符,另外,通过检查doSomething是一个函数,您确保可以调用它。

答案 2 :(得分:1)

在比较中调用函数(或赋值等)通常是一个坏主意。人们通常不希望比较产生副作用。这个案例很简单,可能是合理的,但如果有人不理解他们可能不得不在StackOverflow上询问的约定;)