Javascript
JavaScript Style Guide
Install / Use
/learn @airbnb/JavascriptREADME
Airbnb JavaScript Style Guide() {
A mostly reasonable approach to JavaScript
Note: this guide assumes you are using Babel, and requires that you use babel-preset-airbnb or the equivalent. It also assumes you are installing shims/polyfills in your app, with airbnb-browser-shims or the equivalent.
This guide is available in other languages too. See Translation
Other Style Guides
Table of Contents
- Types
- References
- Objects
- Arrays
- Destructuring
- Strings
- Functions
- Arrow Functions
- Classes & Constructors
- Modules
- Iterators and Generators
- Properties
- Variables
- Hoisting
- Comparison Operators & Equality
- Blocks
- Control Statements
- Comments
- Whitespace
- Commas
- Semicolons
- Type Casting & Coercion
- Naming Conventions
- Accessors
- Events
- jQuery
- ECMAScript 5 Compatibility
- ECMAScript 6+ (ES 2015+) Styles
- Standard Library
- Testing
- Performance
- Resources
- In the Wild
- Translation
- The JavaScript Style Guide Guide
- Chat With Us About JavaScript
- Contributors
- License
- Amendments
Types
<a name="types--primitives"></a><a name="1.1"></a>
-
1.1 Primitives: When you access a primitive type you work directly on its value.
stringnumberbooleannullundefinedsymbolbigint
const foo = 1; let bar = foo; bar = 9; console.log(foo, bar); // => 1, 9- Symbols and BigInts cannot be faithfully polyfilled, so they should not be used when targeting browsers/environments that don’t support them natively.
<a name="types--complex"></a><a name="1.2"></a>
-
1.2 Complex: When you access a complex type you work on a reference to its value.
objectarrayfunction
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log(foo[0], bar[0]); // => 9, 9
References
<a name="references--prefer-const"></a><a name="2.1"></a>
-
2.1 Use
constfor all of your references; avoid usingvar. eslint:prefer-const,no-const-assignWhy? This ensures that you can’t reassign your references, which can lead to bugs and difficult to comprehend code.
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
<a name="references--disallow-var"></a><a name="2.2"></a>
-
2.2 If you must reassign references, use
letinstead ofvar. eslint:no-varWhy?
letis block-scoped rather than function-scoped likevar.// bad var count = 1; if (true) { count += 1; } // good, use the let. let count = 1; if (true) { count += 1; }
<a name="references--block-scope"></a><a name="2.3"></a>
-
2.3 Note that both
letandconstare block-scoped, whereasvaris function-scoped.// const and let only exist in the blocks they are defined in. { let a = 1; const b = 1; var c = 1; } console.log(a); // ReferenceError console.log(b); // ReferenceError console.log(c); // Prints 1In the above code, you can see that referencing
aandbwill produce a ReferenceError, whileccontains the number. This is becauseaandbare block scoped, whilecis scoped to the containing function.
Objects
<a name="objects--no-new"></a><a name="3.1"></a>
-
3.1 Use the literal syntax for object creation. eslint:
no-new-object// bad const item = new Object(); // good const item = {};
<a name="es6-computed-properties"></a><a name="3.4"></a>
-
3.2 Use computed property names when creating objects with dynamic property names.
Why? They allow you to define all the properties of an object in one place.
function getKey(k) { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey('enabled')] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey('enabled')]: true, };
<a name="es6-object-shorthand"></a><a name="3.5"></a>
-
3.3 Use object method shorthand. eslint:
object-shorthand// bad const atom = { value: 1, addValue: function (value) { return atom.value + value; }, }; // good const atom = { value: 1, addValue(value) { return atom.value + value; }, };
<a name="es6-object-concise"></a><a name="3.6"></a>
-
3.4 Use property value shorthand. eslint:
object-shorthandWhy? It is shorter and descriptive.
const lukeSkywalker = 'Luke Skywalker'; // bad const obj = { lukeSkywalker: lukeSkywalker, }; // good const obj = { lukeSkywalker, };
<a name="objects--grouped-shorthand"></a><a name="3.7"></a>
-
3.5 Group your shorthand properties at the beginning of your object declaration.
Why? It’s easier to tell which properties are using the shorthand.
const anakinSkywalker = 'Anakin Skywalker'; const lukeSkywalker = 'Luke Skywalker'; // bad const obj = { episodeOne: 1, twoJediWalkIntoACantina: 2, lukeSkywalker, episodeThree: 3, mayTheFourth: 4, anakinSkywalker, }; // good const obj = { lukeSkywalker, anakinSkywalker, episodeOne: 1, twoJediWalkIntoACantina: 2, episodeThree: 3, mayTheFourth: 4, };
<a name="objects--quoted-props"></a><a name="3.8"></a>
-
3.6 Only quote properties that are invalid identifiers. eslint:
quote-propsWhy? In general we consider it subjectively easier to read. It improves syntax highlighting, and is also more easily optimized by many JS engines.
// bad const bad = { 'foo': 3, 'bar': 4, 'data-blah': 5, }; // good const good = { foo: 3, bar: 4, 'data-blah': 5, };
<a name="objects--prototype-builtins"></a>
-
3.7 Do not call
Object.prototypemethods directly, such ashasOwnProperty,propertyIsEnumerable, andisPrototypeOf. eslint:no-prototype-builtinsWhy? These methods may be shadowed by properties on the object in question - consider
{ hasOwnProperty: false }- or, the object may be a null object (Object.create(null)). In modern browsers that support ES2022, or with a polyfill such as https://npmjs.com/object.hasown,Object.hasOwncan also be used as an alternative toObject.prototype.hasOwnProperty.call.// bad console.log(object.hasOwnProperty(key)); // good console.log(Object.prototype.hasOwnProperty.call(object, key)); // better const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope. console.log(has.call(object, key)); // best console.log(Object.hasOwn(object, key)); // only supported in browsers that support ES2022 /* or */ import has from 'has'; // https://www.npmjs.com/package/has console.log(has(object, key)); /* or */ console.log(Object.hasOwn(object, key)); // https://www.npmjs.com/package/object.hasown
<a name="objects--rest-spread"></a>
- 3.8 Prefer the object spread syntax over
Object.assignto shallow-copy objects.
Related Skills
node-connect
330.3kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
81.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
330.3kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
81.3kCommit, push, and open a PR
