【问题标题】:JavaScript coding technique or bad code?JavaScript 编码技术还是糟糕的代码?
【发布时间】:2011-05-04 17:49:14
【问题描述】:

在调试别人编写的 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 不喜欢它,我宁愿在我的应用程序中不要有错误的代码。有什么见解吗?

【问题讨论】:

  • 我认为它非常聪明,尽管它确实损害了代码的可读性。我不会将这种“糟糕的代码”称为“可读性差的代码”
  • 根据语言的不同,这可以被认为是一个标准的成语。

标签: javascript coding-style idioms logical-operators short-circuiting


【解决方案1】:

这确实是一个“速记”。只有当左侧作为if() 语句传递时,才会执行右侧。

Google Closure Compiler 和其他压缩器利用了这一点;如果您的输入是if(a) a(),它将导致a&amp;&amp;a()


你可以对||做同样的事情,例如:

if( !a ){
  alert('Not a');
}

可以写成

a || alert('Not a');

【讨论】:

    【解决方案2】:

    是的,您的两个示例是“等价的”,&amp;&amp; 运算符执行short-circuit evaluation

    如果第一个操作数表达式产生 falsey 值(例如nullundefined0NaN、一个空字符串,当然还有false),第二个操作数表达式将计算,如果值为truthy,将进行函数调用。

    但是如果doSomething 没有被声明,你的两个例子都会失败

    如果在代码中引用了未声明的标识符,您将收到ReferenceError 异常,例如:

    function foo() {
      undeclared && undeclared();
    }
    
    try {
      foo(); 
    } catch (e) {
      alert(e);  // ReferenceError!
    }
    

    如果你想:

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

    你可以:

    if (typeof doSomething == 'function') {
      doSomething();
    }
    

    typeof operator 可以安全地用于不存在的标识符,此外,通过检查 doSomething 是一个函数,您可以确保可以调用它。

    【讨论】:

    • @Tim,考虑到我的问题,接受的答案是最直接的答案。此外,大多数 JS 代码在生产中被缩小,大多数缩小器将“if”条件更改为简写。所以恕我直言,最好至少彻底理解速记,因为这是你经常看到的。
    • @Silkster:关于doSomething 未被声明的部分是至关重要的信息。如果doSomething 没有声明(比如你删除了函数声明),你会得到一个错误。
    【解决方案3】:

    在比较中调用函数(或赋值等)通常是个坏主意。人们通常不期望比较会产生副作用。这种情况很简单,它可能是合理的,但如果有人不理解约定,他们可能不得不在 StackOverflow 上询问;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-07
      • 2011-08-02
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      相关资源
      最近更新 更多