3

如果忘记分号,C++ 等语言将无法使用,但 JavaScript 等其他语言会自动为您包含它们。

我从这篇文章中知道您是否建议在 JavaScript 中的每个语句后使用分号?,建议使用分号,并且在某些情况下会产生不必要的歧义(例如在不使用大括号时在 C++ 中悬挂 else)。

在某个时间点,必须做出让它们可选的决定(例如,当 JavaScript 的创建者有意识地选择使其可选时)。

我想知道为什么做出这个决定,以及它对这些语言的用户有什么好处。

背景:我是一名新手程序员,最近才开始学习 JavaScript。

编辑:对于那些说它在 JavaScript 中不好的评论,我知道。如果大多数人认为这是不好的做法,我问为什么首先允许它发生。

4

4 回答 4

4

关于 JavaScript,Douglas Crockford 在这个视频中解释了这个想法的起源。(这是一个很棒的演讲,如果你打算继续学习 JavaScript,真的值得你花时间观看。)

这是谈话的直接引述:

分号插入旨在使 C 语法对初学者更容易。

至于它对语言的用户有什么好处,Crockford 详细解释了它没有好处的几个原因,而是它如何在语法中引入了非常严重的歧义和陷阱。最值得注意的情况之一是尝试使用左大括号编码样式(来自视频的来源)返回对象文字时:

return
{
    ok: false
};

实际上返回未定义,因为分号插入在 之后添加一个return,并且剩余的预期对象文字被解析为代码块,相当于:

return;
{
    ok: false;
}

试图让初学者的语言更容易可能是善意错误的重要来源。

于 2014-12-11T00:42:13.207 回答
2

JavaScript 语言的作者 Brendan Eich 有一篇关于这个主题的博文,名为The infernal semicolon,主题是自动分号插入 (ASI)。

相关报价:

ASI(正式地说)是一种句法纠错程序。


我希望我在 1995 年 5 月的那十天里让换行符在 JS 中更重要。然后我们会诅咒在续行的末尾使用中缀运算符而不是 ASI,或者可能是暴力括号,强制继续到一个连续的行。但那艘船几乎是 17 年前航行的。


我的两分钱:小心不要使用 ASI,就好像它给了 JS 重要的换行符一样。

于 2014-12-11T00:47:29.420 回答
1

很久以前,在遥远的尘土飞扬的过去,这样做主要是为了弥补编译/链接/运行周期至少以小时为单位测量的事实,并且通常运行超过一天。等待几个小时才能得到结果可能(好吧:是)非常令人沮丧,只是发现编译器由于一些愚蠢的错字而停止在第 3 行(或其他)。

为了解决这个问题,当时的一些编译器试图猜测你的意图,所以如果一个错字足够小(对于“足够小”的一些定义),它会假设它知道你的真正意图,并继续编译(甚至可能执行)尽管有错误。

不学习历史的人注定要重蹈覆辙。一些过于自大而无法从历史中吸取教训的人也会重复它。关于导致语言设计者目前犯此错误的确切类型的字符缺陷,可能存在相当大的争论空间。但是,关于这是否是一个错误的争论空间要小得多(实际上根本没有)——这显然是一个错误,而且是不可原谅的。

于 2014-12-11T00:45:42.757 回答
1

在 javascript 中,分号是语句分隔符,但换行符也是如此,因此如果每行有一个语句,则不需要它们。

其他语言,如 C++,只有 ; 作为分隔符和像换行符一样的空格,什么都不做。有优点也有缺点

在 C++ 中,这意味着语法是一致的

如果你写

int x=0;
x++;

如果然后压缩到一行,则其通用语法相同:-

int x = 0;  x++;

如果你写的话,在 javascript 中

var x=0
x++

那么如果你压缩到一行

var x=0 x++

会是个问题

你需要做var x=0; x++

所以,重要的是空格是否重要。理想情况下,一种语言会始终使用一种机制。但是对于 javascript,它是混合的,所以在使用时会留下一些歧义;

于 2014-12-11T01:00:41.983 回答