JavaScript编码技术还是坏代码?

Sil*_*ter 14 javascript coding-style idioms short-circuiting logical-operators

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

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

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

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

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Har*_*men 7

这确实是一个"速记".右侧仅在左侧作为if()声明传递时执行.

谷歌闭包编译器和其他缩小器利用了这一点; 如果您的输入是if(a) a(),它将导致a&&a()


你也可以这样做||,例如:

if( !a ){
  alert('Not a');
}
Run Code Online (Sandbox Code Playgroud)

可写成

a || alert('Not a');
Run Code Online (Sandbox Code Playgroud)


CMS*_*CMS 6

是的,您的两个示例是"等效的",&&操作员执行短路评估.

如果第一操作数的表达产生一个falsey值(如null,undefined,0,NaN,一个空字符串,当然false),第二操作数的表达式将进行评估,并且如果该值是truthy,函数调用将会作出修改.

但如果doSomething尚未宣布,那么你的两个例子都会失败.

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

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

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}
Run Code Online (Sandbox Code Playgroud)

如果你想:

  1. 确保标识符存在,并且
  2. 确保它是可调用的

您可以:

if (typeof doSomething == 'function') {
  doSomething();
}
Run Code Online (Sandbox Code Playgroud)

typeof运营商可以在不存在的,另外,通过检查标识符安全使用doSomething是一个函数,你确保你将能够调用它.