除JavaScript之外的其他语言是否在括号起始位置(同一行和下一行)之间有区别?

今天,当我随机阅读O'Reilly的JavaScript模式书时,发现了一个有趣的事情(参考文献27页)。

在Javascript中,在某些情况下,如果大括号的起始位置不同,则会有所不同。

function test_function1() { return { name: 'rajat' }; } var obj = test_function1(); alert(obj); //Shows "undefined" 

 function test_function2() { return { name: 'rajat' }; } var obj = test_function2(); alert(obj); //Shows object 

JSfiddle演示

那里有没有其他语言有这样的行为? 如果是这样,那么我将不得不改变我的习惯.. 🙂

我主要关心PHP,C,C ++,Java和ruby。

任何不依赖分号(而是换行符)来划分语句的语言都可能允许这样做。 考虑Python

 >>> def foo(): ... return ... { 1: 2 } ... >>> def bar(): ... return { 1: 2 } ... >>> foo() >>> bar() {1: 2} 

您可能能够在Visual Basic中构build一个类似的案例,但是我不能理解,因为VB在可能放置值的位置非常有限。 但是,下面的工作,除非静态分析仪抱怨无法访问的代码:

 Try Throw New Exception() Catch ex As Exception Throw ex.GetBaseException() End Try ' versus Try Throw New Exception() Catch ex As Exception Throw ex.GetBaseException() End Try 

从你提到的语言来看, Ruby具有相同的属性。 PHP,C,C ++和Java不仅仅是因为它们放弃了换行符作为空格,而且需要分号来分隔语句。

以下是Ruby中Python示例的等效代码:

 >> def foo >> return { 1 => 2 } >> end => nil >> def bar >> return >> { 1 => 2 } >> end => nil >> foo => {1=>2} >> bar => nil 

JavaScript解释器自动添加一个; 在每一行的末尾,如果找不到一个(除了一些例外,不要进入这里:)。

所以基本上问题不在于大括号的位置(在这里代表一个对象字面值,而不像大多数语言中的代码块),但是这个小小的“特征”迫使你的第一个例子return ; => undefined 。 您可以查看ES5规范中的return行为。

对于具有类似行为的其他语言,请查看Konrad的答案 。

当然。 Google的编程语言performance出非常类似的行为(虽然效果不同)。 如上所述:

事实上,正如在C或Java中一样,forms化语言使用分号,但是它们自动插入到每条语句末尾的语句结尾。 你不需要自己input。

..snip …

这种方法使得代码干净清晰,不需要分号。 有一个令人惊讶的是,把一个构造如if语句的左括号放在与if相同的行上是很重要的; 如果你不这样做,有些情况可能不会编译或者可能会给出错误的结果。 该语言在某种程度上强制支持风格。

秘密地说,我认为罗布派克只是想借口要求一个真正的大括号风格。

这个问题的答案相当简单。 任何具有“自动分号插入”的语言在该行可能会遇到麻烦。 这个问题

 return { name: 'rajat' }; 

..是js引擎在return;后会插入分号的return; 语句(因此,返回undefined )。 这个例子是一个很好的理由总是在右侧打开大括号,而从不在左侧。 既然你已经正确地注意到了,如果在同一行中有一个大括号,解释器会注意到并且不能插入一个分号。

FWIW, JSLint用这个语法报告了几个警告:

 $ jslint -stdin function foo(){ return { x: "y" }; } ^D (3): lint warning: unexpected end of line; it is ambiguous whether these lines are part of the same statement return ........^ (3): lint warning: missing semicolon { x: "y" }; ..^ (3): lint warning: unreachable code { x: "y" }; ..^ (3): lint warning: meaningless block; curly braces have no impact { x: "y" }; ..^ (3): lint warning: use of label { x: "y" }; .....^ (3): lint warning: missing semicolon { x: "y" }; ...........^ (3): lint warning: empty statement or extra semicolon { x: "y" }; ............^ 0 error(s), 7 warning(s) 

我遇到的第一种语言是awk(它也有它的“奇怪”的语法的份额;可选的分号,只使用空格的string连接等等…)我认为DTracedevise师,基于D语法松散在awk上,有足够的意义不要复制这些function,但我记不起我的头顶。 一个简单的例子(从我的Mac中统计一个DTD中的ENTITY标签的数量):

 $ cat printEntities.awk # This prints all lines where the string ENTITY occurs /ENTITY/ { print $0 } $ awk -f printEntities.awk < /usr/share/texinfo/texinfo.dtd | wc -l 119 

如果这个小脚本是用大括号写在自己的行上的话,这是会发生的:

 $ cat printAll.awk # Because of the brace placement, the print statement will be executed # for all lines in the input file # Lines containing the string ENTITY will be printed twice, # because print is the default action, if no other action is specified /ENTITY/ { print $0 } $ awk -f printAll.awk < /usr/share/texinfo/texinfo.dtd | wc -l 603 $ /bin/cat < /usr/share/texinfo/texinfo.dtd | wc -l 484 $