JavaScript 编码技术还是糟糕的代码?

Posted

技术标签:

【中文标题】JavaScript 编码技术还是糟糕的代码?【英文标题】:JavaScript coding technique or bad code? 【发布时间】: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 不喜欢它,我宁愿在我的应用程序中不要有错误的代码。有什么见解吗?

【问题讨论】:

我认为它非常聪明,尽管它确实损害了代码的可读性。我不会将这种“糟糕的代码”称为“可读性差的代码” 根据语言的不同,这可以被认为是一个标准的成语。 【参考方案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!

如果你想:

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

你可以:

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

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

【讨论】:

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

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

【讨论】:

以上是关于JavaScript 编码技术还是糟糕的代码?的主要内容,如果未能解决你的问题,请参考以下文章

任务十六:零基础JavaScript编码

记录 curl 提交数据编码 及 javascript 转换 unicode 问题

记录 curl 提交数据编码 及 javascript 转换 unicode 问题

Java安全编码:糟糕的在线建议和令人困惑的APIs

jQuery编码中的一些技巧

任务十七:零基础JavaScript编码