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不喜欢它,我宁愿在我的应用程序中没有错误的代码.任何见解?
这确实是一个"速记".右侧仅在左侧作为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)
是的,您的两个示例是"等效的",&&操作员执行短路评估.
如果第一操作数的表达产生一个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)
如果你想:
您可以:
if (typeof doSomething == 'function') {
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
该typeof运营商可以在不存在的,另外,通过检查标识符安全使用doSomething是一个函数,你确保你将能够调用它.
| 归档时间: |
|
| 查看次数: |
342 次 |
| 最近记录: |