.js
files.<script src="filename.js"></script>
tags should be placed as late in the body as possible. This reduces the effects of delays imposed by script loading on other page components. There is no need to use the language or type attributes. It is the server, not the script tag, that determines the MIME type.UpperCamelCase
.lowerCamelCase
.Blank lines improve readability by setting off sections of code that are logically related.
Blank spaces should be used in the following circumstances:
(
(left parenthesis) should be separated by a space.(
(left parenthesis). This helps to distinguish between keywords and function invocations..
(period) and (
(left parenthesis) and [
(left bracket) should be separated from their operands by a space.typeof
.;
(semicolon) in the control part of a for statement should be followed with a space.,
(comma).:
(colon) in an object declaration.{}
(curly braces), but not inside ()
(parentheses) or []
(square brackets).Be generous with comments. It is useful to leave information that will be read at a later time by people (possibly yourself) who will need to understand what you have done. The comments should be well-written and clear, just like the code they are annotating. An occasional nugget of humor might be appreciated. Frustrations and resentments will not.
It is important that comments be kept up-to-date. Erroneous comments can make programs even harder to read and understand.
Make comments meaningful. Focus on what is not immediately visible. Don't waste the reader's time with the obvious.
Generally use line comments. Save block comments for formal documentation.
All variables should be declared before used. JavaScript does not require this, but doing so makes the program easier to read and makes it easier to detect undeclared variables that may become implied globals. Implied global variables should never be used. Use of global variables should be minimized.
The var
statement should be the first statement in the function body.
It is preferred that each variable be given its own line, and comment if necessary—though there is no substitute for using a meaningful name. Value clarity over brevity in variable names. They should be listed in alphabetical order if possible.
JavaScript does not have block scope, so defining variables in blocks can confuse programmers who are experienced with other C family languages. Define all variables at the top of the function.
All functions should be declared before they are used. Inner functions should follow the var
statement. This helps make it clear what variables are included in its scope.
There should be no space between the name of a function and the (
(left parenthesis) of its parameter list. There should be one space between the )
(right parenthesis) and the {
(left curly brace) that begins the statement body. The body itself is indented four spaces. The }
(right curly brace) is aligned with the line containing the beginning of the declaration of the function.
This convention works well with JavaScript because in JavaScript, functions and object literals can be placed anywhere that an expression is allowed. It provides the best readability with inline functions and complex structures.
If a function literal is anonymous, there should be one space between the word function and the (
(left parenthesis). If the space is omitted, then it can appear that the function's name is function
, which is an incorrect reading.
Use of global functions should be minimized.
When a function is to be invoked immediately, the entire invocation expression should be wrapped in parens so that it is clear that the value being produced is the result of the function and not the function itself.
Names should be formed from the 26 upper and lower case letters (A .. Z
, a .. z
), and the 10 digits (0 .. 9
). Avoid use of international characters because they may not read well or be understood everywhere. Though it is legal syntax, do not use _
(underbar) in names, instead preferring to put function and variable names in lowerCamelCase
. Do not use \
(backslash) in names. Only use $
(dollar sign) in variable names if you are denoting that the variable contains a jQuery object.
Do not use _
(underbar) as the first or last character of a name. It is sometimes intended to indicate privacy, but it does not actually provide privacy. If privacy is important, use the forms that provide private members. Avoid conventions that demonstrate a lack of competence.
Most variables and functions should start with a lower case letter.
Constructor functions that must be used with the new
prefix should start with a capital letter. JavaScript issues neither a compile-time warning nor a run-time warning if a required new
is omitted. Bad things can happen if new
is not used, so the capitalization convention is the only defense we have.
Global variables should be in all caps. JavaScript does not have macros or constants†, but also use all caps for variables you'd make constant if you could.
† ECMAScript 6 (ES6/ES2015) introduces the const
keyword, which gets close to the desired behavior of disallowing reassignment or redeclaration, but doesn't cause compile-time errors on reassignment and isn't yet supported across modern browsers.
Each line should contain at most one statement. Put a ;
(semicolon) at the end of every simple statement. Note that an assignment statement that is assigning a function literal or object literal is still an assignment statement and must end with a semicolon.
JavaScript allows any expression to be used as a statement. This can mask some errors, particularly in the presence of semicolon insertion. The only expressions that should be used as statements are assignments and invocations.
Compound statements are statements that contain lists of statements enclosed in { }
(curly braces).
{
(left curly brace) should be at the end of the line that begins the compound statement. Exception: if the compound statement belongs to an if
statement that spans multiple lines, it is acceptable to move the left curly brace to a new line (see example).}
(right curly brace) should begin a line and be indented to align with the beginning of the line containing the matching {
(left curly brace).if
or for
statement. This makes it easier to add statements without accidentally introducing bugs.Statement labels are optional. Only these statements should be labeled: while
, do
, for
, switch
.
return
statementA return statement with a value should not use ( )
(parentheses) around the value. The return value expression must start on the same line as the return keyword in order to avoid semicolon insertion.
if
statementThe if
class of statements should have the form shown to the right.
?
Ternary operators are fine to use as long as what's happening in the code is clear. Keep the statement simple and never nest them. A rule of thumb here is that if your ternary statement is long enough to wrap on to multiple lines, it’s too long. In that case, simply using if
is easier to read and understand.
for
statementThe for
class of statements should have the forms shown to the right.
The first form should be used with arrays and with loops of a predeterminable number of iterations.
The second form should be used with objects. Be aware that members that are added to the prototype of the object will be included in the enumeration. It is wise to program defensively by using the hasOwnProperty
method to distinguish the true members of the object.
while
statementA while
statement should have the form shown to the right.
do
statementA do
statement should have the form shown to the right.
Unlike the other compound statements, the do
statement always ends with a ;
(semicolon).
switch
statementA switch
statement should have the form shown to the right.
Each case
is aligned with the switch
. This avoids over-indentation. A case
label is not a statement, and should not be indented like one.
Each group of statements (except the default) should end with break
, return
, or throw
. Do not fall through.
try
statementA try
statement should have the form shown to the right.
continue
statementAvoid use of the continue
statement. It tends to obscure the control flow of the function.
with
statementThe with
statement should not be used:
Always use strict mode. It disables such undesirable features as implicit global variable declaration and in general makes your code behave more predictably.
Always use named function expressions:
{}
and []
Use {}
instead of new Object()
. Use []
instead of new Array()
.
Use arrays when the member names would be sequential integers. Use objects when the member names are arbitrary strings or names.
,
(comma) OperatorAvoid the use of the comma operator. (This does not apply to the comma separator, which is used in object literals, array literals, var
statements, and parameter lists.)
In JavaScript blocks do not have scope†. Only functions have scope. Do not use blocks except as required by the compound statements.
† ES2015 introduces the let
keyword, which along with const
is block scoped. Even so, as stated above, avoid creating blocks around let
, and only use blocks as required by compound statements.
Avoid doing assignments in the condition part of if
and while
statements.
Is assignment or comparison intended? Avoid constructs that cannot easily be determined to be correct.
===
and !==
operatorsUse the ===
and !==
operators. The ==
and !=
operators do type coercion and should not be used.
Be careful to not follow a +
with +
or ++
. This pattern can be confusing. Insert parens between them to make your intention clear.
eval
is evilThe eval
function is the most misused feature of JavaScript. Avoid it. Similar to the with
statement:
eval
from modifying lexical scope.eval
has aliases. Do not use the Function
constructor. Do not pass strings to setTimeout
or setInterval
.
When writing Node.js code, take care to define your callbacks in the idiomatic error-first style:
err
argument.err
will be set to null and any successful data will be returned in the second argument.Learn more about error-first callbacks in Node.js.
When orchestrating several asynchronous operations, consider using a promises library like Q or abstraction library like async instead of nesting callbacks inside callbacks inside callbacks etc. They'll make complex asynchronous code easier to read and untangle.