在调试其他人编写的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不喜欢它,我宁愿在我的应用程序中没有错误的代码。任何见解?
答案 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 值(例如null
,undefined
,0
,NaN
,则为空字符串,当然false
),第二个操作数表达式将不进行评估,如果值为 truthy ,则将进行函数调用。
但如果尚未声明doSomething
,则您的两个示例都将失败。
如果在代码中引用了未声明的标识符,则会出现ReferenceError
异常,例如:
function foo() {
undeclared && undeclared();
}
try {
foo();
} catch (e) {
alert(e); // ReferenceError!
}
如果你想:
你可以:
if (typeof doSomething == 'function') {
doSomething();
}
typeof
operator可以安全地用于不存在的标识符,另外,通过检查doSomething
是一个函数,您确保可以调用它。
答案 2 :(得分:1)
在比较中调用函数(或赋值等)通常是一个坏主意。人们通常不希望比较产生副作用。这个案例很简单,可能是合理的,但如果有人不理解他们可能不得不在StackOverflow上询问的约定;)