JavaScript和Python中的分号有什么区别?

won*_*ng2 57 javascript python syntax

Python和JavaScript都允许开发人员使用或省略分号.但是,我经常看到它建议(在书籍和博客中)我不应该在Python中使用分号,而我应该总是在JavaScript中使用它们.

语言如何使用分号或者这只是文化差异是否存在技术差异?

Nul*_*ion 68

Python中的分号是完全可选的(当然,除非你想在一行中有多个语句).我个人认为每个语句末尾带有分号的Python代码看起来非常难看.

现在在Javascript中,如果你不写分号,一个是自动插入1在行的末尾.这可能会导致问题.考虑:

function add(a, b) {
  return
    a + b
}
Run Code Online (Sandbox Code Playgroud)

你会认为这会返回a + b,但是Javascript只是超越了你,并将其视为:

function add() {
  return;
    a + b;
}
Run Code Online (Sandbox Code Playgroud)

undefined而是回来了.

1有关详细信息和注意事项,请参阅第27页,第7.9项 - ECMAScript语言规范中的自动分号插入.

  • 仅供参考:这个答案并没有继续解释为什么`return \n a + b;`不会导致智慧回归; \n a + b;`以及,但Jeremy Bank的回答解释说:**如果语法错误不是**,JavaScript只会将换行视为分号. (4认同)
  • 在Python中,您的语句必须正确终止,否则会出现语法错误.此外,如何在不触发意外缩进错误的情况下完成此类操作? (2认同)

小智 63

这让我困惑的时间最长.我认为这只是一种文化差异,并且每个人抱怨分号插入是语言中最糟糕的特征是一个白痴.来自NullUserException的答案的经常重复的例子并没有影响我,因为在这种情况下,无论缩进,Python的行为与JavaScript相同.

然后有一天,我写了一些模糊的东西:

alert(2)
(x = $("#foo")).detach()
Run Code Online (Sandbox Code Playgroud)

我希望它被解释为:

alert(2);
(x = $("#foo")).detach();
Run Code Online (Sandbox Code Playgroud)

它实际上是这样解释的:

alert(2)(x = $("#foo")).detach();
Run Code Online (Sandbox Code Playgroud)

我现在用分号.

JavaScript的将只有1把换行符因为在这些情况分号:

  • 这不是语法错误.
  • 换行符位于throwor return关键字和表达式之间.
  • 换行符位于continueor break关键字和标识符之间.
  • 换行符位于变量和后缀++--运算符之间.

这会留下这样的情况,其行为不是您所期望的.有些人2采用的惯例只在必要时才使用分号.我更喜欢遵循始终使用它们的标准惯例,现在我知道它并非毫无意义.


1我省略了一些细节,请参阅ECMA-262 5e第7.9节的确切描述.
2 Twitter Bootstrap是一个备受瞩目的例子.

  • 如果你引导任何以带有分号的某种开放式括号开头的行,你可以避免这种情况.这个和返回被视为javascript半冒号处理中的两个奇怪的例子,实际上它们是唯一的两个案例. (2认同)

cda*_*rke 6

除了句法问题,它部分是文化的.在Python文化中,任何无关的角色都是诅咒,而那些不是白色空间或字母数字的角色则是双重的.

因此,不喜欢领先的美元符号,分号和花括号等内容.你在代码中所做的事情取决于你,但要真正理解一种语言,仅仅学习语法是不够的.


小智 6

JavaScript被设计为"看起来像C",因此分号是文化的一部分.Python语法的不同之处在于,如果分号"缺失",程序员就不会觉得不舒服.

  • 这个论点让我觉得有些循环.如果不是分号,也许是括号,Javascript看起来就像C一样. (7认同)

ham*_*ene 6

为什么在 Python 代码中看不到它们的答案是:没有人需要它们,没有它们代码看起来更干净。

一般来说,分号只是一种传统。许多新语言刚刚彻底放弃了它们(以 Python、Ruby、Scala、Go、Groovy、Io 为例)。程序员不需要它们,编译器也不需要。如果一种语言不允许您输入一个您从来不需要的额外字符,您会想要利用它,不是吗?

只是 JavaScript 尝试删除它们并不是很成功,许多人更喜欢约定俗成的总是使用它们,因为这样可以减少代码的歧义。

  • 我不买这种概括。分号是语言*语法*的一部分,用于消除同一表达式的不同解析树之间的歧义。以 Jeremy 的回答为例。您不能简单地从类似 C 的语言中删除分号并期望它起作用,您必须*更改整个语法*以确保没有它们就永远不会产生歧义。 (4认同)
  • 这就是我所说的:*新*语言正在摆脱它们。不是旧的。你不买的究竟是什么? (2认同)

Mat*_*ggs 5

主要是因为 Python 看起来一点也不像 Java,而 JavaScript 却很像,这导致人们这样对待它。在 JavaScript 中使用分号不会遇到麻烦是非常简单的(JavaScript 中的分号是可选的),其他任何东西都是FUD