为什么有些编程语言允许自动包含分号
Why do some programming languages allow semicolons to be automatically included?
如果忘记了分号,像C++这样的语言将无法工作,但其他语言,如JavaScript会自动包含它们。
我从这篇文章中知道,您是否建议在 JavaScript 中的每个语句后使用分号?,建议使用分号,并且有些场景可能会产生不必要的歧义(例如,不使用大括号时在C++中悬挂其他内容(。
在某个时间点,必须决定将它们设为可选(例如,当 JavaScript 的创建者有意识地选择使其成为可选时(。
我想知道为什么做出这个决定,以及它对这些语言的用户有什么好处。
背景:我是一个新手程序员,最近才开始学习JavaScript。
编辑:我知道那些说它在JavaScript中很糟糕的评论。我问为什么首先允许它发生,如果大多数人认为这是不好的做法。
关于 JavaScript,Douglas Crockford 在这个视频中解释了这个想法的起源。(这是一个很好的演讲,如果你打算继续追求JavaScript,它真的值得你花时间去看。
这是演讲中的直接引用:
分号插入旨在使初学者更容易使用 C 语法。
至于它如何使语言用户受益,Crockford详细解释了为什么它没有好处的几个原因,而是它如何在语法中引入非常严重的歧义和陷阱。 最值得注意的情况之一是尝试使用左大括号编码样式返回对象文本(来源于视频(:
return
{
ok: false
};
这实际上返回 undefined,因为分号插入在 return
之后添加一个,并且剩余的预期对象文本被解析为代码块,相当于这样:
return;
{
ok: false;
}
试图让初学者更容易使用语言可能是善意错误的重要来源。
JavaScript 语言的作者 Brendan Eich 有一篇关于这个主题的博客文章,名为 The infernal 分号,主题是自动分号插入 (ASI(。
相关引述:
ASI是(正式的(语法纠错过程。
我希望我在 1995 年 5 月的那十天里在 JS 中使换行符更加重要。然后,我们将诅咒需要在连续行的末尾使用中缀运算符,或者可能是暴力括号,以强制连续行。但那艘船在大约17年前航行。
我的两分钱:小心不要使用 ASI,就好像它给了 JS 重要的换行符一样。
很久以前,在遥远的尘土飞扬的过去,做这样的事情主要是为了弥补编译/链接/运行周期至少以小时为单位,并且经常运行超过一天的事实。等待数小时才能获得结果可能会非常令人沮丧,却发现编译器由于一些愚蠢的拼写错误而停止在第 3 行(或其他什么(。
为了解决这个问题,当时的一些编译器试图猜测你的意图,所以如果一个错别字足够小(对于"足够小"的某些定义(,它会假设它知道你真正的意图,并继续编译(甚至可能执行(尽管有错误。
那些不研究历史的人注定要重蹈覆辙。一些过于傲慢而不敢从历史中吸取教训的人也重复了它。关于导致语言设计师目前犯这个错误的确切字符缺陷,可能还有相当大的争论空间。不过,关于这是否是一个错误的争论空间要小得多(实际上根本没有(——它显然是,而且是不可原谅的。
在 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,它是混合的,所以在使用时会留下一些歧义;
- 如何创建一个包含许多数组和数据的json对象
- 包含特定条款的自动填写表单
- 使用多功能框在 chrome 扩展程序中包含内联自动填充功能的任何方法
- 如果文本字段或本地存储包含数据,则自动提交表单
- 为什么在科尔多瓦中面向Windows 8时会自动包含WInJS
- Chrome Javascript:自动点击包含特定文本的链接
- 为什么有些编程语言允许自动包含分号
- 将自动完成应用于包含数据库中数据的动态生成的文本框
- 如何自动包含 js/css 文件
- 在PhpStorm/WebStorm中自动格式化包含缩进HTML的字符串数组
- 包含复选框列表(自动选中选定框下方的复选框)
- 如何在使用包含.getValue()的自动脚本时绕过单元格中的空白值
- 谷歌电子表格脚本为包含某个单词的行着色,并自动将该行移动到另一张工作表
- Bower应该自动包含库js和css文件吗;不需要在index.html中列出
- 包含其他不自动更新字符串的字符串
- 自动选择:包含http或https javascript
- 谷歌地图:无法在包含数据库标记的地图中添加自动搜索选项
- Webstorm可以自动将项目js文件包含在html中,或者将它们合并为一个吗?
- 当页面包含特定文本时,停止自动刷新页面
- 什么是typeahead.js自动完成的源代码,源代码应该包含什么