Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript编码技术还是糟糕的代码?_Javascript_Coding Style_Idioms_Logical Operators_Short Circuiting - Fatal编程技术网

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不喜欢它,我也不希望我的应用程序中有坏代码。有什么见

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

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();
    }