2011-08-28 74 views
57

Python和JavaScript都允许开发人员使用或省略分号。不过,我经常看到它建议(在书籍和博客中)我不应该在Python中使用分号,而我应该总是在JavaScript中使用它们。JavaScript和Python中的分号有什么区别?

语言如何使用分号或仅仅是文化差异之间有技术差异吗?

+1

这是如何“不建设性”? – NullUserException

+1

@NullUser:这不是维基百科,但你能指出一个明确的参考,一个有其他约定以外的基础吗? – outis

+0

@outis你是什么意思? – NullUserException

回答

68

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

现在使用Javascript,如果您不写分号,则会在行末自动插入。这可能会导致问题。试想一下:

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

你会认为这将返回a + b,但使用Javascript只是智胜你认为这是:

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

返回undefined代替。

见第27页,项目7.9 - 自动分号插入上ECMAScript Language Specification的更多细节和注意事项。

+0

所以问题是JavaScript会在行尾自动插入分号而Python不会? – wong2

+2

在Python中,您的语句必须正确终止,否则会给您一个语法错误。此外,你会如何完成这样的事情,而不会触发意外的缩进错误? – NullUserException

+1

实际上,我发现自己在Python中使用分号的唯一情况是使用命令行中的'timeit'。分号允许您在一行中有多个语句。 –

6

除了语法问题,它部分是文化的。在Python文化中,任何多余的字符都是一种诅咒,而那些不是空格或字母数字的字符则是双重字符。

因此,不喜欢前导$符号,分号和花括号等内容。你在代码中做什么取决于你,但要真正理解一门语言,仅仅学习语法是不够的。

+0

>在Python文化中,任何多余的字符都是一种诅咒 呵呵? ...不是,不是真的。 “平坦胜过嵌套”。所以这个: 'x = some_long_function(y); something_else_kinda_verbose(x)' 通常优先于此: 'something_else_kinda_verbose(some_long_function(y))'。 (在这里有一个分号的唯一原因是我无法弄清楚如何在评论中获得换行符;它确实是一个换行符,考虑讨论......呃。) – jorelli

+0

我认为一个更好的例子是破坏我的参数可能是用来给修饰符加上前缀的'@',或者'__'来表示一个变量是“private”(sort-of)。我觉得使用'_'和'__'打破了禅宗,然后Guido可能不会。 – cdarke

5

JavaScript被设计成“看起来像C”,因此分号是文化的一部分。如果分号“缺失”,Python语法就不足以让程序员感到不舒服。

+0

虽然关于JS解释他们错误的其他观察是好的,我认为**这是真正的原因**。 –

+7

这个说法让我觉得有点圆形。如果不是分号,也可能是大括号,Javascript根本看起来不像C。 –

5

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

一般来说,分号只是一个传统。很多新的语言都把它们放在了一起(例如Python,Ruby,Scala,Go,Groovy,Io)。程序员不需要它们,编译器也不需要它们。如果一种语言让你不需要输入一个你不需要的额外字符,你就会想要利用这个,不是吗?

这只是JavaScript的企图放弃他们也不是很成功,许多人宁愿公约总是使用它们,因为这使得代码更加明确。

+3

我不买这个概括。分号是该语言的*语法*的一部分,用于在同一表达式的不同分析树之间消歧。以Jeremy的答案为例。你不能简单地从类C语言中删除分号并期望它能够正常工作,你必须*改变整个语法*以确保它在没有它们的情况下永远不会变得模糊不清。 – Blindy

+2

这就是我所说的:*新的*语言正在摆脱它们。不是旧的。到底什么是你不买? – hamstergene

63

这让我困惑了最长的时间。我以为这只是一个文化差异,并且每个人都在抱怨插入分号是在语言中最糟糕的特点是一个白痴。从NullUserException's answer经常重复的例子并没有影响我,因为无视缩进,Python在这种情况下的行为与JavaScript相同。

后来有一天,我写的东西隐约像这样:

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

我预料到这样解释:

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

实际上,它是这样解释:

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

我现在使用分号。

的JavaScript只会治疗换行符因为在这些情况分号:

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

这样就会出现这样的情况,其行为并非您所期望的。有些人采用只在必要时使用分号的约定。我更喜欢遵循标准惯例总是使用它们,现在我知道它并不是毫无意义的。


我忽略了一些小细节,请ECMA-262 5e Section 7.9的确切描述。
Twitter Bootstrap是一个备受瞩目的例子。

+2

如果您以任何带有分号的开括号开头的行,您可以避免出现这种情况。这和返回被视为javascript分号处理中两个奇怪的例子,实际上它们是唯一的两种情况。 –

1

我一直认为这个约定与边缘案例有关,而且更多的是为了节省带宽而频繁地压缩/缩小Javascript。这种缩小的代码几乎肯定会在没有分号的情况下破解。

a = 2 
b = 3 
return a + b 

// minified 
a=2b=3return a+b 
+1

在这里,缩小器必须足够聪明。 –

+5

任何不应该使用的缩小器。任何即使远程流行也不会有这个问题 –

+1

我不知道为什么这是downvoted。这是一个有效的观点。如果在每个语句末尾不使用分号,那么可以删除的新行数很少,而不会导致语法错误,即智能缩小或不是。 –