【问题标题】:What is the difference between semicolons in JavaScript and in Python?JavaScript 和 Python 中的分号有什么区别?
【发布时间】:2011-08-28 07:12:05
【问题描述】:

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

这两种语言使用分号的方式是否存在技术差异,或者这只是文化差异?

【问题讨论】:

  • 这怎么“没有建设性”?
  • @NullUser:这不是 Wikipedia,但你能指出一个明确的参考资料吗,它的依据不是惯例?
  • 我建议将这个问题重新命名为“Python 和 JavaScript 处理换行符和分号的方式有什么区别?”。正如措辞所言,它可以被解释为更多关于文化的问题,而不是技术差异。这可能就是人们投票关闭的原因。
  • 这是一个将programmers.stackexchangestackoverflow 分开的例子。
  • @wong2:我对问题进行了编辑,使其更关注客观技术方面而不是主观文化方面,希望能够重新开放。如果您不同意,请随时撤消此修改。

标签: javascript python syntax


【解决方案1】:

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

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

function add(a, b) {
  return
    a + b
}

你会认为这会返回 a + b,但 Javascript 只是比你聪明,并将其视为:

function add() {
  return;
    a + b;
}

改为返回undefined

1请参阅第 27 页,第 7.9 项 - ECMAScript Language Specification 上的自动分号插入了解更多详细信息和注意事项。

【讨论】:

  • 在 Python 中,您的语句必须正确终止,否则会出现语法错误。此外,如何在不触发意外缩进错误的情况下完成这样的事情?
  • 事实上,我发现自己在 Python 中使用分号的唯一情况是在命令行中使用 timeit。分号允许您在一行中有多个语句。
  • 仅供参考:这个答案并没有继续解释为什么 return \n a+b; 也不会导致对 return; \n a+b; 的智取,但 Jeremy Bank 在下面的回答解释说:JavaScript 只会处理换行符如果是语法错误,则使用分号
  • @Konerak Jeremy Banks 骗了你。任何返回语句都会自动插入分号,后跟换行符。这是一个很常见的错误来源,尤其是在喜欢将对象文字的左大括号放在新行上的人中。
  • @sethobrien:我试图简化事情,但似乎做得很糟糕。我将编辑我的帖子以解释细节,而不是试图掩盖它们。
【解决方案2】:

这让我困惑了很长时间。我认为这只是文化差异,每个抱怨分号插入是语言中最糟糕的功能的人都是白痴NullUserException's answer 中经常重复的示例并没有影响我,因为在这种情况下,Python 的行为与 JavaScript 相同。

然后有一天,我模糊地写了这样一段话:

alert(2)
(x = $("#foo")).detach()

我希望它会被这样解释:

alert(2);
(x = $("#foo")).detach();

其实是这样解释的:

alert(2)(x = $("#foo")).detach();

我现在使用分号。

JavaScript 只会1在这些情况下将换行符视为分号:

  • 不这样做是语法错误。
  • 换行符位于 throwreturn 关键字和表达式之间。
  • 换行符位于 continuebreak 关键字和标识符之间。
  • 换行符位于变量和后缀 ++-- 运算符之间。

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


1我省略了一些次要细节,请参阅ECMA-262 5e Section 7.9 了解确切描述。
2Twitter Bootstrap 是一个引人注目的示例。

【讨论】:

  • 如果任何行以某种开括号和分号开头,就可以避免这种情况。 this 和 return 被视为 javascript 分号处理中的两个奇怪示例,实际上它们是仅有的两种情况。
  • 引用 #2 的链接已损坏。
【解决方案3】:

除了句法问题之外,还有一部分是文化问题。在 Python 文化中,任何无关的字符都是一种诅咒,而那些不是空格或字母数字的字符则更是如此。

因此,不喜欢诸如前导 $ 符号、分号和花括号之类的东西。不过,您在代码中做什么取决于您自己,但要真正理解一门语言,仅仅学习语法是不够的。

【讨论】:

  • >在 Python 文化中,任何无关的字符都是诅咒吧? ……不,不是真的。 “平面优于嵌套”。所以这个:x = some_long_function(y); something_else_kinda_verbose(x) 通常比这个:something_else_kinda_verbose(some_long_function(y)) 更受欢迎。 (其中有分号的唯一原因是我无法弄清楚如何在评论中获得换行符;它真的是换行符。考虑到讨论......呃。)
  • 我认为破坏我的论点的一个更好的例子可能是 @ 用于前缀装饰器,或者 __ 表示变量是“私有的”(排序)。我觉得___的使用打破了禅宗,那么Guido可能又没有。
【解决方案4】:

JavaScript 被设计为“看起来像 C”,因此分号是文化的一部分。 Python 语法的不同足以让程序员在分号“丢失”时感到不舒服。

【讨论】:

  • 虽然关于 JS 错误解释它们的其他观察结果很好,但我认为 这是真正的原因
  • 这个论点让我觉得有点循环。如果没有分号,也许还有大括号,Javascript 看起来一点也不像 C。
【解决方案5】:

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

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

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

【讨论】:

  • 我不认同这种概括。分号是语言语法的一部分,用于区分同一表达式的不同解析树。以 Jeremy 的回答为例。您不能简单地从类 C 语言中删除分号并期望它能够工作,您必须更改整个语法以确保没有它们就不会产生歧义。
  • 这就是我所说的:NEW 语言正在摆脱它们。不是旧的。你不买的到底是什么?
【解决方案6】:

主要是因为 Python 看起来不像 Java,而 JavaScript 确实如此,这导致人们以这种方式对待它。在 JavaScript (https://mislav.net/2010/05/semicolons/) 中使用分号不会遇到麻烦非常简单,其他都是 FUD。

【讨论】:

    【解决方案7】:

    两者都是dynamic typing 以增加可读性。 Python Enhancement Proposal 8 或 PEP 8 是 Python 代码的样式指南。 2001 年,Guido van Rossum、Barry Warsaw 和 Nick Coghlan 创建了 PEP 8,以帮助 Python 程序员编写一致且可读的代码。 Reference

    因此,在 Javascript 中,我们有 ECMAScript 规范,该规范描述了如果语句未显式以分号终止,则有时 JavaScript 引擎会自动插入分号(称为“自动分号插入”(ASI))。 reference

    请参阅来自 Google 的 this article 也谈论 JS。

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2015-07-26
      • 2014-04-18
      • 2014-10-29
      • 2011-11-10
      • 1970-01-01
      • 2011-06-28
      • 2014-10-31
      相关资源
      最近更新 更多