JavaScript无分号代码风格和代码压缩?

20

我正在考虑是否值得采用JavaScript无分号风格。

如果我的JavaScript代码没有分号:

function(){
    var first = 1
    var second = 2
    sum = 1 + 2
    return sum
}

它将在浏览器和Node.js中工作。

但是,经过Uglify或Closure Compiler压缩的代码能否在浏览器和Node.js中工作?

我阅读了文章JavaScript中的分号是可选的。它说应该可以工作。


4
压缩应该在必要的情况下添加分号,即使只是用来替换换行符。 - Bergi
2
@Pointy,+1,不要再按他的;键了!(因为尖锐的东西通常很锋利) - CaffGeek
2
在一种几乎具有每种花括号和分号语法的语言中不使用分号并不能使代码看起来更加整洁!尽管我讨厌CoffeeScript的语法,但这可能值得你一看... - ThiefMaster
4
我将要求ECMA在每个语句结束时都加上“;”作为必需品,因为从一开始就应该这样。 - Elias Van Ootegem
1
不使用分号没有任何问题。我希望ECMA不要将其作为要求。(自此贴文以来他们也没有这样做) - Michael Ramos
显示剩余6条评论
5个回答

25

我个人比较支持使用分号,但是有一种备选方案也很有说服力,然而这种方案通常没有得到公正的发言机会。和所有编程风格争论一样,这将是一个永无止境的辩论,没有合理的结论。做出你和你的团队感觉更舒适的决定。

如果你选择采用节俭的分号方法,请确保你和你的团队充分了解自动分号插入(ASI)和语句终止规则。无论你做出什么决定,这都是必须理解的好事情。

关于代码压缩:如果你不想冒使用代码压缩工具存在漏洞的风险,以及因为它没有正确执行ASI而导致的报告和修复的负担(或等待修复),那么就不要依赖ASI。


5
尽管 JavaScript 中的分号是可选的,但强烈建议不要省略分号,因为这会使您的代码容易出现错误。试试以下代码,它会让您的代码容易出错:
var a = 1; var b = 7; var sum = a+b
(a + b)
它被压缩成 var a=1,b=7,sum=a+b(a+b);这将导致错误number is not a function。还有其他情况这个情况
更新:这个 bug 不是由于压缩造成的,然而下一个 bug 是由于压缩造成的。
  • It makes your code vulnerable for bugs resulting from minification: Try:

      var isTrue = true
    
      function doSomething() { return 'yeah' }
    
      function doSomethingElse() { return 'yes, dear' }
    
      doSomething()
    
      !isTrue && doSomethingElse()
    

    minifies to:

      var isTrue=true;function doSomething(){return "yeah"}function doSomethingElse(){return "yes, dear"}doSomething()!isTrue&&doSomethingElse();
    

    which results in:

      SyntaxError: Unexpected token !
    
  • It makes your code less readable and maintainable in terms of convenience: Using the semicolon has been rightfully established as good practice, and a trained JavaScript developer will be puzzled by code trying to evade the convention.

还有一件事,你必须问问自己:省略分号能得到什么好处呢?

  • 干净的代码?如果你想让 JavaScript 不像 JavaScript,请尝试 CoffeeScript。但是有 一些误导的观念 认为,通过“简单的解决方案:当一行以括号开头时,在其前面添加一个分号”可以避免上述问题的陷阱。这怎么算是干净的代码,又如何帮助任何阅读你代码的人呢?

结论:在缩小代码时,我肯定会尝试使用 JSLint 的惯例。我见过一些人在花费数小时试图修复未缩小的代码中不存在的 Bug 后最终对他们的 JavaScript 代码进行了 Lint。不要让自己遭受这种痛苦;分号可能乍一看有点丑陋,但它们可以避免 Bug。


谢谢,你的意见对我很有帮助。 - WHITECOLOR
3
“var a = 1; var b = 7; var sum = a+b (a + b)”已经无效,这句话怎样证明你的观点?请注意,为了遵守指示,我必须直接进行翻译,因此保留了原文中可能含糊不清的措辞和错误。 - Felix Kling
@FelixKling 没错,我在那里迷失了方向。已经更正并包含了一个证明我的观点的参数。 - Beat Richartz
如果你的代码压缩器在压缩之前不添加分号,我认为它很糟糕。 当我看到有分号的代码时,我会感到恶心。没有分号的代码更容易阅读。 无论如何,我会先写没有分号的代码,然后在压缩之前再添加分号。 - agiopnl

3
编译器和缩小器可能足够智能,如果需要(并且如果有助于缩小过程),会添加分号。
但是! 分号告诉解释器这是语句的结尾。 如果缺少它,它必须查看下一行的开头,以确定语句是否可以继续。 然后它将决定下一行是一个新语句(即缺少分号)还是实际上是来自前一行的语句的继续。
没有分号,你会减慢速度! 更不用说当解释器执行我描述的算法时,可能会引入一些模糊的错误!

1
似乎唯一的模糊情况是下一个语句以括号“(”开头。 - WHITECOLOR
解释器仍然需要查看下一行来做出决定。这可能值得进行基准测试,但是对每一行都这样做会减慢速度。 - Imp
代码在运行之前已经编译了,我不认为这会有任何区别。不过,一个基准测试会很酷。然而,我可以确定看到所有的分号会给我的大脑增加额外的负担。 - agiopnl

0

不要这样做。分号插入是一件非常危险的事情。增加的大小并不值得承担额外的风险。

如果你这样做,Douglas Crockford 不会喜欢你 :) JavaScript: The Good Parts


3
我已经阅读了这篇文章:http://mislav.uniqpath.com/2010/05/semicolons/ - WHITECOLOR
8
据我所知,如果你的代码风格与Douglas Crockford不完全一致,他可能永远不会喜欢你 ;) - Imp
2
虽然那篇文章中的所有内容都是正确的,但我仍然建议不要这样做。你读到的每一段示例代码都会有分号,所以这点需要注意。而且与自动插入分号相关的问题可能很难调试。 - Per Salbark
3
这个回答没有给出任何理由:-1。请提供你的观点理由并证明你的结论。 - B T
分号是程序员必须记住的好东西。除了一些编程语言不使用分号外,我建议您在编写代码时使用分号来帮助清晰表达。 - dalmate

-2

在我看来,不要那样做。你并没有真正获得很多,而且分号是自动放置的,它可能被放置在一个会产生奇怪错误的地方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接