为什么JavaScript中有这么多分号

Why so many semicolons in JavaScript?

本文关键字:JavaScript 为什么      更新时间:2023-09-26

我在JavaScript中经常使用分号:

var x = 1;
var y = 2;
if (x==y){do something};

我最近注意到,我在看很多JavaScript,没有分号后面的if语句。然后我突然想到,我甚至不知道在JS中分号的首选语法,经过一些谷歌搜索(相当令人惊讶),除了拆分一行语句外,根本不需要分号。

所以,这个问题…人们使用分号的习惯是从哪里来的呢?它是JavaScript开始发挥作用时正在使用的流行语言的残余吗?只是一般的好习惯?只有我这样吗?

我可能会坚持使用它,因为它在编写jQuery链时很容易发现结束。

更新:

谢谢大家的回答!总结一下,我们在JS中看到很多分号的原因,即使是不需要的,也来自于各种变量:

  • 旧的JS最小化器会产生破碎的代码,如果你没有插入分号
  • 许多其他语言使用它们,所以这是一个继承的习惯
  • 有时候,分号可以改变逻辑
  • 有些人更喜欢使用它们来使代码更易于人类阅读

许多计算机语言使用分号表示语句的结束。C、c++和Java就是这样的例子。

尽管它们是可选的,但为什么人们会使用它们,因为它们提高了代码的可读性。在大多数情况下,这只是出于习惯,但有时您需要在代码中使用分号来消除可能的歧义。安全(和一致)总比后悔好。

下面是一个例子,你建议在JavaScript中的每个语句后使用分号吗?

// define a function
var fn = function () {
    //...
} // semicolon missing at this line
// then execute some code inside a closure
(function () {
    //...
})();

将被解释为:

var fn = function () {
    //...
}(function () {
    //...
})();

此外,分号允许适当地打包/缩小Javascript。否则,所有的声明将被搅成一团乱麻。

JavaScript需要分号。但是它有自动分号插入功能。

大多数JavaScript程序员都比ASI聪明,他们更喜欢使用分号。

这种习惯来自于恐惧。害怕"破碎"的js压缩器(我曾经在使用没有var语句的遗留js的Plone压缩器时遇到过一些问题),害怕可能破碎的浏览器实现,等等。那么,为什么不在所有地方使用;并避免所有这些缺陷呢?

这种方法的问题(总是使用分号而不做进一步的解释)是,你没有试图理解你为什么要这样做,你只是因为有人说你这样做,恕我直言,这也可能是有害的。过去坏掉的压缩器现在修好了,你不断地插入分号……改掉习惯很难。我们只是继续做事情,因为"我们总是这样做"。

许多新的JavaScript程序员被建议只用分号无处不在,并期望如果他们不是故意使用的分号插入规则,它们可以安全地忽略是否存在这是整个语言特性。事实并非如此,因为上面描述的限制生成,特别是return语句。当意识到限制生产的问题时,程序员然后可能会对换行符过于警惕,甚至在什么时候都避免使用它们会增加清晰度。最好是熟悉所有的ASI的规则,以便能够读取任何代码,无论它如何

这是关于这个主题的一个很好的资源和引用的来源。

那么哪种风格更好呢?在某种程度上,客观地说"更好"的选择,在我看来最小分号/逗号优先的样式稍微好一点,因为从根本上说,它更容易扫描,因为它鼓励让程序员更好地理解他们所使用的语言。

…第二个引用来自一篇可选的文章,反对总是使用分号。也是一本很棒的读物。

是否使用分号在很大程度上是一个选择问题。然而,在javascript中,与许多其他语言不同,不使用它们可能会导致意想不到的结果。例如,

return
    {'foo':'bar'};
由于javascript的自动分号插入,

将不返回任何值。

关于这种编码方式的起源可能仍然是一个有争议的问题,但它可能来自于在if条件中区分1和许多语句的能力,这在大多数语言中都很常见。还有,人们可能会混淆JavaScript的对象文本

的语法

首先,你有一个语句if:

if (someNumber == 2)
  doSomething();
else
  doSomethingElse();

然后,您有多语句if(不需要分号):

if (someNumber == 3) {
  doThisFirst();
  doThisSecond();
} else
  doSomethingElse();

这种语法也可能与JavaScript的对象文字混淆,后者确实需要半彩色:

var SomeObjectLiteral = {
  property: 2,
  doSomething: function() {
  }
};
基本上,分号在Javascript中用于确定命令或定义的结束位置非常重要。大括号对于确定这些命令的块同样重要。但是,你可以有任意多的分号。如果有疑问,请使用分号,但如果有人叫你不需要分号,请做好准备:)

C语言在语句末尾使用分号,也使用大括号。

PHP在行末使用分号,这就是为什么我通常在javascript中使用分号。

分号标志着JS语句的结束,但是我不把分号放在右括号之后,只放在大括号内的语句之后,并且总是在返回语句之后。

在你的例子中,我认为没有必要。

在分号的帮助下可以在函数内编写多条语句;分号,用于分隔语句。很容易理解。

除了代码的可读性之外,当您实际尝试最小化代码时,分号的使用也会出现。缩小后,如果代码中没有分号,javascript引擎可能无法知道哪个语句在哪里结束,因为代码中将不再有任何新行。