JavaScript编码技术还是糟糕的代码?
在调试其他人编写的javascript时,我遇到了一些以前从未见过的代码。以下是一个示例:JavaScript编码技术还是糟糕的代码?,javascript,coding-style,idioms,logical-operators,short-circuiting,Javascript,Coding Style,Idioms,Logical Operators,Short Circuiting,在调试其他人编写的javascript时,我遇到了一些以前从未见过的代码。以下是一个示例: function doSomething() { //doing something here... } function doItNow() { //other logic... doSomething && doSomething(); // <=== What's this? } JSLint不喜欢它,我也不希望我的应用程序中有坏代码。有什么见
function doSomething() {
//doing something here...
}
function doItNow() {
//other logic...
doSomething && doSomething(); // <=== What's this?
}
JSLint不喜欢它,我也不希望我的应用程序中有坏代码。有什么见解吗?这确实是一个“速记”。只有当左侧作为
if()
语句传递时,才会执行右侧
谷歌闭包编译器和其他小型程序利用了这一点;如果您的输入是if(a)a()
,它将导致a&&a()
您可以对
|
执行相同的操作,例如:
if( !a ){
alert('Not a');
}
可以写成
a || alert('Not a');
是的,您的两个示例是“等效”的,
&&
操作符执行
如果第一个操作数表达式产生假值(例如null
,undefined
,0
,NaN
,空字符串,当然还有false
),则不会计算第二个操作数表达式,如果该值为真值,则将进行函数调用
但是如果没有声明doSomething
,您的两个示例都将失败
如果代码中引用了未声明的标识符,则会出现ReferenceError
异常,例如:
function foo() {
undeclared && undeclared();
}
try {
foo();
} catch (e) {
alert(e); // ReferenceError!
}
如果您想:
if (typeof doSomething == 'function') {
doSomething();
}
可以在不存在的标识符上安全地使用。此外,通过检查
doSomething
是否是一个函数,您可以确保能够调用它。在比较中调用函数(或赋值等)通常不是一个好主意。人们通常不指望比较会有副作用。这个案例很简单,可能是合理的,但如果有人不理解这个约定,他们可能不得不询问StackOverflow;) 我认为它相当聪明,尽管它确实会损害代码的可读性。根据语言的不同,我不会把这称为“糟糕的代码”或“可读性差的代码”,这可以被认为是一个标准的习语。@蒂姆,根据我问题的上下文,公认的答案是最直接的答案。此外,大多数JS代码在生产中被缩小,大多数缩小者将“if”条件改为速记。因此,我认为,至少应该彻底理解速记,因为这是你经常会看到的。@Silkster:doSomething未声明的部分是至关重要的信息。如果未声明doSomething
(假设您删除了函数声明),您将得到一个错误。
if (typeof doSomething == 'function') {
doSomething();
}