In languages whose syntax is derived from C (e.g.: C ← C++ ← Java ← JavaScript), two
brace styles are most common: Allman style and 1TBS.
Allman style
If a statement
[1] contains a block, that block is considered as somewhat separate from the header of the statement: its opening brace is in a line of its own, at the same indentation level as the head.
For example:
function foo(x, y, z)
{
if (x)
{
a();
} else {
b();
c();
}
}
1TBS (One True Brace Style)
Here, a block is more closely associated with the header of its statement, it starts after it, in the same line.
For example:
function foo(x, y, z) {
if (x) {
a();
} else {
b();
c();
}
}
1TBS is a variant of the (older) K&R (Kernighan and Ritchie) style. In K&R style, functions are written in Allman style and braces are omitted where they are not necessary, e.g. around single-statement then-cases.
function foo(x, y, z)
{
if (x)
a();
else {
b();
c();
}
}
JavaScript
The de-facto standard in the JavaScript world is 1TBS, most style guides recommend it. One reason goes beyond taste and fitting in: If you return an object literal, you can’t put the opening brace in a separate line. An object literal is not a code block, but things look more consistent and you are less likely to make mistakes if both are formatted the same way.
For example:
return {
name: 'Jane'
};
If you formatted that in Allman style, you’d have:
// Don’t do this
return
{
name: 'Jane'
};
However, JavaScript’s automatic semicolon insertion
[2] adds a semicolon after
return, if it is followed by a newline. The above code is thus equivalent to
return;
{
name: 'Jane'
};
That’s an empty return statement, followed by a code block (not by an object literal!) whose insides consist of the label
name and the expression statement
[1] 'Jane'. At the end, there is the empty statement, a semicolon (
;) on its own.
The return statement is one of the few cases where newline is significant in JavaScript: it works as a terminator for statements. In the future, newlines might become more significant in JavaScript [3].
My preferences
My personal style is:
- 1TBS
- I omit braces in an if-statement if there is no else-case and the then-case has only one or two tokens. I write such if-statements in single lines. For example:
if (x) return x;
- I indent 4 spaces. I never use tabs for indentation, as they are displayed too differently on various systems.
Obviously, whenever I contribute to an existing project, I stick to the coding style of that project.
References
- Expressions versus statements in JavaScript
- Automatic semicolon insertion in JavaScript
- What JavaScript would be like with significant newlines