diff --git a/README.md b/README.md
index 97530e53..5368efac 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,8 @@ Other Style Guides
## Types
- - [1.1](#1.1) **Primitives**: When you access a primitive type you work directly on its value.
+
+ - [1.1](#types--primitives) **Primitives**: When you access a primitive type you work directly on its value.
+ `string`
+ `number`
@@ -68,7 +69,9 @@ Other Style Guides
console.log(foo, bar); // => 1, 9
```
- - [1.2](#1.2) **Complex**: When you access a complex type you work on a reference to its value.
+
+
+ - [1.2](#types--complex) **Complex**: When you access a complex type you work on a reference to its value.
+ `object`
+ `array`
@@ -87,7 +90,8 @@ Other Style Guides
## References
- - [2.1](#2.1) Use `const` for all of your references; avoid using `var`. eslint: [`prefer-const`](http://eslint.org/docs/rules/prefer-const.html), [`no-const-assign`](http://eslint.org/docs/rules/no-const-assign.html)
+
+ - [2.1](#references--prefer-const) Use `const` for all of your references; avoid using `var`. eslint: [`prefer-const`](http://eslint.org/docs/rules/prefer-const.html), [`no-const-assign`](http://eslint.org/docs/rules/no-const-assign.html)
> Why? This ensures that you can't reassign your references, which can lead to bugs and difficult to comprehend code.
@@ -101,7 +105,8 @@ Other Style Guides
const b = 2;
```
- - [2.2](#2.2) If you must reassign references, use `let` instead of `var`. eslint: [`no-var`](http://eslint.org/docs/rules/no-var.html) jscs: [`disallowVar`](http://jscs.info/rule/disallowVar)
+
+ - [2.2](#references--disallow-var) If you must reassign references, use `let` instead of `var`. eslint: [`no-var`](http://eslint.org/docs/rules/no-var.html) jscs: [`disallowVar`](http://jscs.info/rule/disallowVar)
> Why? `let` is block-scoped rather than function-scoped like `var`.
@@ -119,7 +124,8 @@ Other Style Guides
}
```
- - [2.3](#2.3) Note that both `let` and `const` are block-scoped.
+
+ - [2.3](#references--block-scope) Note that both `let` and `const` are block-scoped.
```javascript
// const and let only exist in the blocks they are defined in.
@@ -135,7 +141,8 @@ Other Style Guides
## Objects
- - [3.1](#3.1) Use the literal syntax for object creation. eslint: [`no-new-object`](http://eslint.org/docs/rules/no-new-object.html)
+
+ - [3.1](#objects--no-new) Use the literal syntax for object creation. eslint: [`no-new-object`](http://eslint.org/docs/rules/no-new-object.html)
```javascript
// bad
@@ -145,7 +152,8 @@ Other Style Guides
const item = {};
```
- - [3.2](#3.2) If your code will be executed in browsers in script context, don't use [reserved words](http://es5.github.io/#x7.6.1) as keys. It won't work in IE8. [More info](https://github.com/airbnb/javascript/issues/61). It’s OK to use them in ES6 modules and server-side code. jscs: [`disallowIdentifierNames`](http://jscs.info/rule/disallowIdentifierNames)
+
+ - [3.2](#objects--reserved-words) If your code will be executed in browsers in script context, don't use [reserved words](http://es5.github.io/#x7.6.1) as keys. It won't work in IE8. [More info](https://github.com/airbnb/javascript/issues/61). It’s OK to use them in ES6 modules and server-side code. jscs: [`disallowIdentifierNames`](http://jscs.info/rule/disallowIdentifierNames)
```javascript
// bad
@@ -161,7 +169,8 @@ Other Style Guides
};
```
- - [3.3](#3.3) Use readable synonyms in place of reserved words. jscs: [`disallowIdentifierNames`](http://jscs.info/rule/disallowIdentifierNames)
+
+ - [3.3](#objects--reserved-words-2) Use readable synonyms in place of reserved words. jscs: [`disallowIdentifierNames`](http://jscs.info/rule/disallowIdentifierNames)
```javascript
// bad
@@ -180,8 +189,8 @@ Other Style Guides
};
```
-
- - [3.4](#3.4) Use computed property names when creating objects with dynamic property names.
+
+ - [3.4](#es6-computed-properties) 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.
@@ -206,8 +215,8 @@ Other Style Guides
};
```
-
- - [3.5](#3.5) Use object method shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)
+
+ - [3.5](#es6-object-shorthand) Use object method shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)
```javascript
// bad
@@ -229,8 +238,8 @@ Other Style Guides
};
```
-
- - [3.6](#3.6) Use property value shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)
+
+ - [3.6](#es6-object-concise) Use property value shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)
> Why? It is shorter to write and descriptive.
@@ -248,7 +257,8 @@ Other Style Guides
};
```
- - [3.7](#3.7) Group your shorthand properties at the beginning of your object declaration.
+
+ - [3.7](#objects--grouped-shorthand) Group your shorthand properties at the beginning of your object declaration.
> Why? It's easier to tell which properties are using the shorthand.
@@ -277,7 +287,8 @@ Other Style Guides
};
```
- - [3.8](#3.8) Only quote properties that are invalid identifiers. eslint: [`quote-props`](http://eslint.org/docs/rules/quote-props.html) jscs: [`disallowQuotedKeysInObjects`](http://jscs.info/rule/disallowQuotedKeysInObjects)
+
+ - [3.8](#objects-quoted-props) Only quote properties that are invalid identifiers. eslint: [`quote-props`](http://eslint.org/docs/rules/quote-props.html) jscs: [`disallowQuotedKeysInObjects`](http://jscs.info/rule/disallowQuotedKeysInObjects)
> Why? In general we consider it subjectively easier to read. It improves syntax highlighting, and is also more easily optimized by many JS engines.
@@ -301,7 +312,8 @@ Other Style Guides
## Arrays
- - [4.1](#4.1) Use the literal syntax for array creation. eslint: [`no-array-constructor`](http://eslint.org/docs/rules/no-array-constructor.html)
+
+ - [4.1](#arrays--literals) Use the literal syntax for array creation. eslint: [`no-array-constructor`](http://eslint.org/docs/rules/no-array-constructor.html)
```javascript
// bad
@@ -311,7 +323,8 @@ Other Style Guides
const items = [];
```
- - [4.2](#4.2) Use Array#push instead of direct assignment to add items to an array.
+
+ - [4.2](#arrays--push) Use Array#push instead of direct assignment to add items to an array.
```javascript
const someStack = [];
@@ -323,8 +336,8 @@ Other Style Guides
someStack.push('abracadabra');
```
-
- - [4.3](#4.3) Use array spreads `...` to copy arrays.
+
+ - [4.3](#es6-array-spreads) Use array spreads `...` to copy arrays.
```javascript
// bad
@@ -339,14 +352,17 @@ Other Style Guides
// good
const itemsCopy = [...items];
```
- - [4.4](#4.4) To convert an array-like object to an array, use Array#from.
+
+
+ - [4.4](#arrays--from) To convert an array-like object to an array, use Array#from.
```javascript
const foo = document.querySelectorAll('.foo');
const nodes = Array.from(foo);
```
- - [4.5](#4.5) Use return statements in array method callbacks. It's ok to omit the return if the function body consists of a single statement following [8.2](#8.2). eslint: [`array-callback-return`](http://eslint.org/docs/rules/array-callback-return)
+
+ - [4.5](#arrays--callback-return) Use return statements in array method callbacks. It's ok to omit the return if the function body consists of a single statement following [8.2](#8.2). eslint: [`array-callback-return`](http://eslint.org/docs/rules/array-callback-return)
```javascript
// good
@@ -398,7 +414,8 @@ Other Style Guides
## Destructuring
- - [5.1](#5.1) Use object destructuring when accessing and using multiple properties of an object. jscs: [`requireObjectDestructuring`](http://jscs.info/rule/requireObjectDestructuring)
+
+ - [5.1](#destructuring--object) Use object destructuring when accessing and using multiple properties of an object. jscs: [`requireObjectDestructuring`](http://jscs.info/rule/requireObjectDestructuring)
> Why? Destructuring saves you from creating temporary references for those properties.
@@ -423,7 +440,8 @@ Other Style Guides
}
```
- - [5.2](#5.2) Use array destructuring. jscs: [`requireArrayDestructuring`](http://jscs.info/rule/requireArrayDestructuring)
+
+ - [5.2](#destructuring--array) Use array destructuring. jscs: [`requireArrayDestructuring`](http://jscs.info/rule/requireArrayDestructuring)
```javascript
const arr = [1, 2, 3, 4];
@@ -436,7 +454,8 @@ Other Style Guides
const [first, second] = arr;
```
- - [5.3](#5.3) Use object destructuring for multiple return values, not array destructuring. jscs: [`disallowArrayDestructuringReturn`](http://jscs.info/rule/disallowArrayDestructuringReturn)
+
+ - [5.3](#destructuring--object-over-array) Use object destructuring for multiple return values, not array destructuring. jscs: [`disallowArrayDestructuringReturn`](http://jscs.info/rule/disallowArrayDestructuringReturn)
> Why? You can add new properties over time or change the order of things without breaking call sites.
@@ -465,7 +484,8 @@ Other Style Guides
## Strings
- - [6.1](#6.1) Use single quotes `''` for strings. eslint: [`quotes`](http://eslint.org/docs/rules/quotes.html) jscs: [`validateQuoteMarks`](http://jscs.info/rule/validateQuoteMarks)
+
+ - [6.1](#strings--quotes) Use single quotes `''` for strings. eslint: [`quotes`](http://eslint.org/docs/rules/quotes.html) jscs: [`validateQuoteMarks`](http://jscs.info/rule/validateQuoteMarks)
```javascript
// bad
@@ -475,8 +495,11 @@ Other Style Guides
const name = 'Capt. Janeway';
```
- - [6.2](#6.2) Strings that cause the line to go over 100 characters should be written across multiple lines using string concatenation.
- - [6.3](#6.3) Note: If overused, long strings with concatenation could impact performance. [jsPerf](http://jsperf.com/ya-string-concat) & [Discussion](https://github.com/airbnb/javascript/issues/40).
+
+ - [6.2](#strings--line-length) Strings that cause the line to go over 100 characters should be written across multiple lines using string concatenation.
+
+
+ - [6.3](#strings--concat-perf) Note: If overused, long strings with concatenation could impact performance. [jsPerf](http://jsperf.com/ya-string-concat) & [Discussion](https://github.com/airbnb/javascript/issues/40).
```javascript
// bad
@@ -494,8 +517,8 @@ Other Style Guides
'with this, you would get nowhere fast.';
```
-
- - [6.4](#6.4) When programmatically building up strings, use template strings instead of concatenation. eslint: [`prefer-template`](http://eslint.org/docs/rules/prefer-template.html) [`template-curly-spacing`](http://eslint.org/docs/rules/template-curly-spacing) jscs: [`requireTemplateStrings`](http://jscs.info/rule/requireTemplateStrings)
+
+ - [6.4](#es6-template-literals) When programmatically building up strings, use template strings instead of concatenation. eslint: [`prefer-template`](http://eslint.org/docs/rules/prefer-template.html) [`template-curly-spacing`](http://eslint.org/docs/rules/template-curly-spacing) jscs: [`requireTemplateStrings`](http://jscs.info/rule/requireTemplateStrings)
> Why? Template strings give you a readable, concise syntax with proper newlines and string interpolation features.
@@ -520,14 +543,17 @@ Other Style Guides
return `How are you, ${name}?`;
}
```
- - [6.5](#6.5) Never use `eval()` on a string, it opens too many vulnerabilities.
+
+
+ - [6.5](#strings--eval) Never use `eval()` on a string, it opens too many vulnerabilities.
**[⬆ back to top](#table-of-contents)**
## Functions
- - [7.1](#7.1) Use function declarations instead of function expressions. jscs: [`requireFunctionDeclarations`](http://jscs.info/rule/requireFunctionDeclarations)
+
+ - [7.1](#functions--declarations) Use function declarations instead of function expressions. jscs: [`requireFunctionDeclarations`](http://jscs.info/rule/requireFunctionDeclarations)
> Why? Function declarations are named, so they're easier to identify in call stacks. Also, the whole body of a function declaration is hoisted, whereas only the reference of a function expression is hoisted. This rule makes it possible to always use [Arrow Functions](#arrow-functions) in place of function expressions.
@@ -541,7 +567,8 @@ Other Style Guides
}
```
- - [7.2](#7.2) Immediately invoked function expressions: eslint: [`wrap-iife`](http://eslint.org/docs/rules/wrap-iife.html) jscs: [`requireParenthesesAroundIIFE`](http://jscs.info/rule/requireParenthesesAroundIIFE)
+
+ - [7.2](#functions--iife) Immediately invoked function expressions: eslint: [`wrap-iife`](http://eslint.org/docs/rules/wrap-iife.html) jscs: [`requireParenthesesAroundIIFE`](http://jscs.info/rule/requireParenthesesAroundIIFE)
> Why? An immediately invoked function expression is a single unit - wrapping both it, and its invocation parens, in parens, cleanly expresses this. Note that in a world with modules everywhere, you almost never need an IIFE.
@@ -552,9 +579,11 @@ Other Style Guides
}());
```
- - [7.3](#7.3) Never declare a function in a non-function block (if, while, etc). Assign the function to a variable instead. Browsers will allow you to do it, but they all interpret it differently, which is bad news bears. eslint: [`no-loop-func`](http://eslint.org/docs/rules/no-loop-func.html)
+
+ - [7.3](#functions--in-blocks) Never declare a function in a non-function block (if, while, etc). Assign the function to a variable instead. Browsers will allow you to do it, but they all interpret it differently, which is bad news bears. eslint: [`no-loop-func`](http://eslint.org/docs/rules/no-loop-func.html)
- - [7.4](#7.4) **Note:** ECMA-262 defines a `block` as a list of statements. A function declaration is not a statement. [Read ECMA-262's note on this issue](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97).
+
+ - [7.4](#functions--note-on-blocks) **Note:** ECMA-262 defines a `block` as a list of statements. A function declaration is not a statement. [Read ECMA-262's note on this issue](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97).
```javascript
// bad
@@ -573,7 +602,8 @@ Other Style Guides
}
```
- - [7.5](#7.5) Never name a parameter `arguments`. This will take precedence over the `arguments` object that is given to every function scope.
+
+ - [7.5](#functions--arguments-shadow) Never name a parameter `arguments`. This will take precedence over the `arguments` object that is given to every function scope.
```javascript
// bad
@@ -587,8 +617,8 @@ Other Style Guides
}
```
-
- - [7.6](#7.6) Never use `arguments`, opt to use rest syntax `...` instead. [`prefer-rest-params`](http://eslint.org/docs/rules/prefer-rest-params)
+
+ - [7.6](#es6-rest) Never use `arguments`, opt to use rest syntax `...` instead. [`prefer-rest-params`](http://eslint.org/docs/rules/prefer-rest-params)
> Why? `...` is explicit about which arguments you want pulled. Plus, rest arguments are a real Array, and not merely Array-like like `arguments`.
@@ -605,8 +635,8 @@ Other Style Guides
}
```
-
- - [7.7](#7.7) Use default parameter syntax rather than mutating function arguments.
+
+ - [7.7](#es6-default-parameters) Use default parameter syntax rather than mutating function arguments.
```javascript
// really bad
@@ -632,7 +662,8 @@ Other Style Guides
}
```
- - [7.8](#7.8) Avoid side effects with default parameters.
+
+ - [7.8](#functions--default-side-effects) Avoid side effects with default parameters.
> Why? They are confusing to reason about.
@@ -648,7 +679,8 @@ Other Style Guides
count(); // 3
```
- - [7.9](#7.9) Always put default parameters last.
+
+ - [7.9](#functions--defaults-last) Always put default parameters last.
```javascript
// bad
@@ -662,7 +694,8 @@ Other Style Guides
}
```
- - [7.10](#7.10) Never use the Function constructor to create a new function.
+
+ - [7.10](#functions--constructor) Never use the Function constructor to create a new function.
> Why? Creating a function in this way evaluates a string similarly to eval(), which opens vulnerabilities.
@@ -674,7 +707,8 @@ Other Style Guides
var subtract = Function('a', 'b', 'return a - b');
```
- - [7.11](#7.11) Spacing in a function signature.
+
+ - [7.11](#functions--signature-spacing) Spacing in a function signature.
> Why? Consistency is good, and you shouldn’t have to add or remove a space when adding or removing a name.
@@ -689,7 +723,8 @@ Other Style Guides
const y = function a() {};
```
- - [7.12](#7.12) Never mutate parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)
+
+ - [7.12](#functions--mutate-params) Never mutate parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)
> Why? Manipulating objects passed in as parameters can cause unwanted variable side effects in the original caller.
@@ -705,7 +740,8 @@ Other Style Guides
};
```
- - [7.13](#7.13) Never reassign parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)
+
+ - [7.13](#functions--reassign-params) Never reassign parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)
> Why? Reassigning parameters can lead to unexpected behavior, especially when accessing the `arguments` object. It can also cause optimization issues, especially in V8.
@@ -732,7 +768,8 @@ Other Style Guides
## Arrow Functions
- - [8.1](#8.1) When you must use function expressions (as when passing an anonymous function), use arrow function notation. eslint: [`prefer-arrow-callback`](http://eslint.org/docs/rules/prefer-arrow-callback.html), [`arrow-spacing`](http://eslint.org/docs/rules/arrow-spacing.html) jscs: [`requireArrowFunctions`](http://jscs.info/rule/requireArrowFunctions)
+
+ - [8.1](#arrows--use-them) When you must use function expressions (as when passing an anonymous function), use arrow function notation. eslint: [`prefer-arrow-callback`](http://eslint.org/docs/rules/prefer-arrow-callback.html), [`arrow-spacing`](http://eslint.org/docs/rules/arrow-spacing.html) jscs: [`requireArrowFunctions`](http://jscs.info/rule/requireArrowFunctions)
> Why? It creates a version of the function that executes in the context of `this`, which is usually what you want, and is a more concise syntax.
@@ -752,7 +789,8 @@ Other Style Guides
});
```
- - [8.2](#8.2) If the function body consists of a single expression, omit the braces and use the implicit return. Otherwise, keep the braces and use a `return` statement. eslint: [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens.html), [`arrow-body-style`](http://eslint.org/docs/rules/arrow-body-style.html) jscs: [`disallowParenthesesAroundArrowParam`](http://jscs.info/rule/disallowParenthesesAroundArrowParam), [`requireShorthandArrowFunctions`](http://jscs.info/rule/requireShorthandArrowFunctions)
+
+ - [8.2](#arrows--implicit-return) If the function body consists of a single expression, omit the braces and use the implicit return. Otherwise, keep the braces and use a `return` statement. eslint: [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens.html), [`arrow-body-style`](http://eslint.org/docs/rules/arrow-body-style.html) jscs: [`disallowParenthesesAroundArrowParam`](http://jscs.info/rule/disallowParenthesesAroundArrowParam), [`requireShorthandArrowFunctions`](http://jscs.info/rule/requireShorthandArrowFunctions)
> Why? Syntactic sugar. It reads well when multiple functions are chained together.
@@ -775,7 +813,8 @@ Other Style Guides
});
```
- - [8.3](#8.3) In case the expression spans over multiple lines, wrap it in parentheses for better readability.
+
+ - [8.3](#arrows--paren-wrap) In case the expression spans over multiple lines, wrap it in parentheses for better readability.
> Why? It shows clearly where the function starts and ends.
@@ -793,8 +832,8 @@ Other Style Guides
));
```
-
- - [8.4](#8.4) If your function takes a single argument and doesn’t use braces, omit the parentheses. Otherwise, always include parentheses around arguments. eslint: [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens.html) jscs: [`disallowParenthesesAroundArrowParam`](http://jscs.info/rule/disallowParenthesesAroundArrowParam)
+
+ - [8.4](#arrows--one-arg-parens) If your function takes a single argument and doesn’t use braces, omit the parentheses. Otherwise, always include parentheses around arguments. eslint: [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens.html) jscs: [`disallowParenthesesAroundArrowParam`](http://jscs.info/rule/disallowParenthesesAroundArrowParam)
> Why? Less visual clutter.
@@ -824,7 +863,8 @@ Other Style Guides
});
```
- - [8.5](#8.5) Avoid confusing arrow function syntax (`=>`) with comparison operators (`<=`, `>=`). eslint: [`no-confusing-arrow`](http://eslint.org/docs/rules/no-confusing-arrow)
+
+ - [8.5](#arrows--confusing) Avoid confusing arrow function syntax (`=>`) with comparison operators (`<=`, `>=`). eslint: [`no-confusing-arrow`](http://eslint.org/docs/rules/no-confusing-arrow)
```js
// bad
@@ -842,7 +882,8 @@ Other Style Guides
## Constructors
- - [9.1](#9.1) Always use `class`. Avoid manipulating `prototype` directly.
+
+ - [9.1](#constructors--use-class) Always use `class`. Avoid manipulating `prototype` directly.
> Why? `class` syntax is more concise and easier to reason about.
@@ -871,7 +912,8 @@ Other Style Guides
}
```
- - [9.2](#9.2) Use `extends` for inheritance.
+
+ - [9.2](#constructors--extends) Use `extends` for inheritance.
> Why? It is a built-in way to inherit prototype functionality without breaking `instanceof`.
@@ -894,7 +936,8 @@ Other Style Guides
}
```
- - [9.3](#9.3) Methods can return `this` to help with method chaining.
+
+ - [9.3](#constructors--chaining) Methods can return `this` to help with method chaining.
```javascript
// bad
@@ -931,7 +974,8 @@ Other Style Guides
```
- - [9.4](#9.4) It's okay to write a custom toString() method, just make sure it works successfully and causes no side effects.
+
+ - [9.4](#constructors--tostring) It's okay to write a custom toString() method, just make sure it works successfully and causes no side effects.
```javascript
class Jedi {
@@ -949,7 +993,8 @@ Other Style Guides
}
```
- - [9.5](#9.5) Classes have a default constructor if one is not specified. An empty constructor function or one that just delegates to a parent class is unnecessary. [`no-useless-constructor`](http://eslint.org/docs/rules/no-useless-constructor)
+
+ - [9.5](#constructors--no-useless) Classes have a default constructor if one is not specified. An empty constructor function or one that just delegates to a parent class is unnecessary. [`no-useless-constructor`](http://eslint.org/docs/rules/no-useless-constructor)
```javascript
// bad
@@ -982,7 +1027,8 @@ Other Style Guides
## Modules
- - [10.1](#10.1) Always use modules (`import`/`export`) over a non-standard module system. You can always transpile to your preferred module system.
+
+ - [10.1](#modules--use-them) Always use modules (`import`/`export`) over a non-standard module system. You can always transpile to your preferred module system.
> Why? Modules are the future, let's start using the future now.
@@ -1000,7 +1046,8 @@ Other Style Guides
export default es6;
```
- - [10.2](#10.2) Do not use wildcard imports.
+
+ - [10.2](#modules--no-wildcard) Do not use wildcard imports.
> Why? This makes sure you have a single default export.
@@ -1012,7 +1059,8 @@ Other Style Guides
import AirbnbStyleGuide from './AirbnbStyleGuide';
```
- - [10.3](#10.3) And do not export directly from an import.
+
+ - [10.3](#modules--no-export-from-import) And do not export directly from an import.
> Why? Although the one-liner is concise, having one clear way to import and one clear way to export makes things consistent.
@@ -1031,7 +1079,8 @@ Other Style Guides
## Iterators and Generators
- - [11.1](#11.1) Don't use iterators. Prefer JavaScript's higher-order functions like `map()` and `reduce()` instead of loops like `for-of`. eslint: [`no-iterator`](http://eslint.org/docs/rules/no-iterator.html)
+
+ - [11.1](#iterators--nope) Don't use iterators. Prefer JavaScript's higher-order functions like `map()` and `reduce()` instead of loops like `for-of`. eslint: [`no-iterator`](http://eslint.org/docs/rules/no-iterator.html)
> Why? This enforces our immutable rule. Dealing with pure functions that return values is easier to reason about than side effects.
@@ -1056,7 +1105,8 @@ Other Style Guides
sum === 15;
```
- - [11.2](#11.2) Don't use generators for now.
+
+ - [11.2](#generators--nope) Don't use generators for now.
> Why? They don't transpile well to ES5.
@@ -1065,7 +1115,8 @@ Other Style Guides
## Properties
- - [12.1](#12.1) Use dot notation when accessing properties. eslint: [`dot-notation`](http://eslint.org/docs/rules/dot-notation.html) jscs: [`requireDotNotation`](http://jscs.info/rule/requireDotNotation)
+
+ - [12.1](#properties--dot) Use dot notation when accessing properties. eslint: [`dot-notation`](http://eslint.org/docs/rules/dot-notation.html) jscs: [`requireDotNotation`](http://jscs.info/rule/requireDotNotation)
```javascript
const luke = {
@@ -1080,7 +1131,8 @@ Other Style Guides
const isJedi = luke.jedi;
```
- - [12.2](#12.2) Use subscript notation `[]` when accessing properties with a variable.
+
+ - [12.2](#properties--bracket) Use bracket notation `[]` when accessing properties with a variable.
```javascript
const luke = {
@@ -1100,7 +1152,8 @@ Other Style Guides
## Variables
- - [13.1](#13.1) Always use `const` to declare variables. Not doing so will result in global variables. We want to avoid polluting the global namespace. Captain Planet warned us of that.
+
+ - [13.1](#variables--const) Always use `const` to declare variables. Not doing so will result in global variables. We want to avoid polluting the global namespace. Captain Planet warned us of that.
```javascript
// bad
@@ -1110,7 +1163,8 @@ Other Style Guides
const superPower = new SuperPower();
```
- - [13.2](#13.2) Use one `const` declaration per variable. eslint: [`one-var`](http://eslint.org/docs/rules/one-var.html) jscs: [`disallowMultipleVarDecl`](http://jscs.info/rule/disallowMultipleVarDecl)
+
+ - [13.2](#variables--one-const) Use one `const` declaration per variable. eslint: [`one-var`](http://eslint.org/docs/rules/one-var.html) jscs: [`disallowMultipleVarDecl`](http://jscs.info/rule/disallowMultipleVarDecl)
> Why? It's easier to add new variable declarations this way, and you never have to worry about swapping out a `;` for a `,` or introducing punctuation-only diffs. You can also step through each declaration with the debugger, instead of jumping through all of them at once.
@@ -1132,7 +1186,8 @@ Other Style Guides
const dragonball = 'z';
```
- - [13.3](#13.3) Group all your `const`s and then group all your `let`s.
+
+ - [13.3](#variables--const-let-group) Group all your `const`s and then group all your `let`s.
> Why? This is helpful when later on you might need to assign a variable depending on one of the previous assigned variables.
@@ -1157,7 +1212,8 @@ Other Style Guides
let length;
```
- - [13.4](#13.4) Assign variables where you need them, but place them in a reasonable place.
+
+ - [13.4](#variables--define-where-used) Assign variables where you need them, but place them in a reasonable place.
> Why? `let` and `const` are block scoped and not function scoped.
@@ -1200,7 +1256,8 @@ Other Style Guides
## Hoisting
- - [14.1](#14.1) `var` declarations get hoisted to the top of their scope, their assignment does not. `const` and `let` declarations are blessed with a new concept called [Temporal Dead Zones (TDZ)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let). It's important to know why [typeof is no longer safe](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15).
+
+ - [14.1](#hoisting--about) `var` declarations get hoisted to the top of their scope, their assignment does not. `const` and `let` declarations are blessed with a new concept called [Temporal Dead Zones (TDZ)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let). It's important to know why [typeof is no longer safe](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15).
```javascript
// we know this wouldn't work (assuming there
@@ -1235,7 +1292,8 @@ Other Style Guides
}
```
- - [14.2](#14.2) Anonymous function expressions hoist their variable name, but not the function assignment.
+
+ - [14.2](#hoisting--anon-expressions) Anonymous function expressions hoist their variable name, but not the function assignment.
```javascript
function example() {
@@ -1249,7 +1307,8 @@ Other Style Guides
}
```
- - [14.3](#14.3) Named function expressions hoist the variable name, not the function name or the function body.
+
+ - [14.3](#hoisting--named-expresions) Named function expressions hoist the variable name, not the function name or the function body.
```javascript
function example() {
@@ -1277,7 +1336,8 @@ Other Style Guides
}
```
- - [14.4](#14.4) Function declarations hoist their name and the function body.
+
+ - [14.4](#hoisting--declarations) Function declarations hoist their name and the function body.
```javascript
function example() {
@@ -1296,9 +1356,11 @@ Other Style Guides
## Comparison Operators & Equality
- - [15.1](#15.1) Use `===` and `!==` over `==` and `!=`. eslint: [`eqeqeq`](http://eslint.org/docs/rules/eqeqeq.html)
+
+ - [15.1](#comparison--eqeqeq) Use `===` and `!==` over `==` and `!=`. eslint: [`eqeqeq`](http://eslint.org/docs/rules/eqeqeq.html)
- - [15.2](#15.2) Conditional statements such as the `if` statement evaluate their expression using coercion with the `ToBoolean` abstract method and always follow these simple rules:
+
+ - [15.2](#comparison--if) Conditional statements such as the `if` statement evaluate their expression using coercion with the `ToBoolean` abstract method and always follow these simple rules:
+ **Objects** evaluate to **true**
+ **Undefined** evaluates to **false**
@@ -1314,7 +1376,8 @@ Other Style Guides
}
```
- - [15.3](#15.3) Use shortcuts.
+
+ - [15.3](#comparison--shortcuts) Use shortcuts.
```javascript
// bad
@@ -1338,9 +1401,11 @@ Other Style Guides
}
```
- - [15.4](#15.4) For more information see [Truth Equality and JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108) by Angus Croll.
+
+ - [15.4](#comparison--moreinfo) For more information see [Truth Equality and JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108) by Angus Croll.
- - [15.5](#15.5) Use braces to create blocks in `case` and `default` clauses that contain lexical declarations (e.g. `let`, `const`, `function`, and `class`).
+
+ - [15.5](#comparison--switch-blocks) Use braces to create blocks in `case` and `default` clauses that contain lexical declarations (e.g. `let`, `const`, `function`, and `class`).
> Why? Lexical declarations are visible in the entire `switch` block but only get initialized when assigned, which only happens when its `case` is reached. This causes problems when multiple `case` clauses attempt to define the same thing.
@@ -1385,7 +1450,8 @@ Other Style Guides
}
```
- - [15.6](#15.6) Ternaries should not be nested and generally be single line expressions.
+
+ - [15.6](#comparison--nested-ternaries) Ternaries should not be nested and generally be single line expressions.
eslint rules: [`no-nested-ternary`](http://eslint.org/docs/rules/no-nested-ternary.html).
@@ -1408,7 +1474,8 @@ Other Style Guides
const foo = maybe1 > maybe2 ? 'bar' : maybeNull;
```
- - [15.7](#15.7) Avoid unneeded ternary statements.
+
+ - [15.7](#comparison--unneeded-ternary) Avoid unneeded ternary statements.
eslint rules: [`no-unneeded-ternary`](http://eslint.org/docs/rules/no-unneeded-ternary.html).
@@ -1429,7 +1496,8 @@ Other Style Guides
## Blocks
- - [16.1](#16.1) Use braces with all multi-line blocks.
+
+ - [16.1](#blocks--braces) Use braces with all multi-line blocks.
```javascript
// bad
@@ -1453,8 +1521,8 @@ Other Style Guides
}
```
- - [16.2](#16.2) If you're using multi-line blocks with `if` and `else`, put `else` on the same line as your
- `if` block's closing brace. eslint: [`brace-style`](http://eslint.org/docs/rules/brace-style.html) jscs: [`disallowNewlineBeforeBlockStatements`](http://jscs.info/rule/disallowNewlineBeforeBlockStatements)
+
+ - [16.2](#blocks--cuddled-elses) If you're using multi-line blocks with `if` and `else`, put `else` on the same line as your `if` block's closing brace. eslint: [`brace-style`](http://eslint.org/docs/rules/brace-style.html) jscs: [`disallowNewlineBeforeBlockStatements`](http://jscs.info/rule/disallowNewlineBeforeBlockStatements)
```javascript
// bad
@@ -1481,7 +1549,8 @@ Other Style Guides
## Comments
- - [17.1](#17.1) Use `/** ... */` for multi-line comments. Include a description, specify types and values for all parameters and return values.
+
+ - [17.1](#comments--multiline) Use `/** ... */` for multi-line comments. Include a description, specify types and values for all parameters and return values.
```javascript
// bad
@@ -1513,7 +1582,8 @@ Other Style Guides
}
```
- - [17.2](#17.2) Use `//` for single line comments. Place single line comments on a newline above the subject of the comment. Put an empty line before the comment unless it's on the first line of a block.
+
+ - [17.2](#comments--singleline) Use `//` for single line comments. Place single line comments on a newline above the subject of the comment. Put an empty line before the comment unless it's on the first line of a block.
```javascript
// bad
@@ -1551,9 +1621,11 @@ Other Style Guides
}
```
- - [17.3](#17.3) Prefixing your comments with `FIXME` or `TODO` helps other developers quickly understand if you're pointing out a problem that needs to be revisited, or if you're suggesting a solution to the problem that needs to be implemented. These are different than regular comments because they are actionable. The actions are `FIXME: -- need to figure this out` or `TODO: -- need to implement`.
+
+ - [17.3](#comments--actionitems) Prefixing your comments with `FIXME` or `TODO` helps other developers quickly understand if you're pointing out a problem that needs to be revisited, or if you're suggesting a solution to the problem that needs to be implemented. These are different than regular comments because they are actionable. The actions are `FIXME: -- need to figure this out` or `TODO: -- need to implement`.
- - [17.4](#17.4) Use `// FIXME:` to annotate problems.
+
+ - [17.4](#comments--fixme) Use `// FIXME:` to annotate problems.
```javascript
class Calculator extends Abacus {
@@ -1566,7 +1638,8 @@ Other Style Guides
}
```
- - [17.5](#17.5) Use `// TODO:` to annotate solutions to problems.
+
+ - [17.5](#comments--todo) Use `// TODO:` to annotate solutions to problems.
```javascript
class Calculator extends Abacus {
@@ -1584,7 +1657,8 @@ Other Style Guides
## Whitespace
- - [18.1](#18.1) Use soft tabs set to 2 spaces. eslint: [`indent`](http://eslint.org/docs/rules/indent.html) jscs: [`validateIndentation`](http://jscs.info/rule/validateIndentation)
+
+ - [18.1](#whitespace--spaces) Use soft tabs set to 2 spaces. eslint: [`indent`](http://eslint.org/docs/rules/indent.html) jscs: [`validateIndentation`](http://jscs.info/rule/validateIndentation)
```javascript
// bad
@@ -1603,7 +1677,8 @@ Other Style Guides
}
```
- - [18.2](#18.2) Place 1 space before the leading brace. eslint: [`space-before-blocks`](http://eslint.org/docs/rules/space-before-blocks.html) jscs: [`requireSpaceBeforeBlockStatements`](http://jscs.info/rule/requireSpaceBeforeBlockStatements)
+
+ - [18.2](#whitespace--before-blocks) Place 1 space before the leading brace. eslint: [`space-before-blocks`](http://eslint.org/docs/rules/space-before-blocks.html) jscs: [`requireSpaceBeforeBlockStatements`](http://jscs.info/rule/requireSpaceBeforeBlockStatements)
```javascript
// bad
@@ -1629,7 +1704,8 @@ Other Style Guides
});
```
- - [18.3](#18.3) Place 1 space before the opening parenthesis in control statements (`if`, `while` etc.). Place no space between the argument list and the function name in function calls and declarations. eslint: [`space-after-keywords`](http://eslint.org/docs/rules/space-after-keywords.html), [`space-before-keywords`](http://eslint.org/docs/rules/space-before-keywords.html) jscs: [`requireSpaceAfterKeywords`](http://jscs.info/rule/requireSpaceAfterKeywords)
+
+ - [18.3](#whitespace--around-keywords) Place 1 space before the opening parenthesis in control statements (`if`, `while` etc.). Place no space between the argument list and the function name in function calls and declarations. eslint: [`space-after-keywords`](http://eslint.org/docs/rules/space-after-keywords.html), [`space-before-keywords`](http://eslint.org/docs/rules/space-before-keywords.html) jscs: [`requireSpaceAfterKeywords`](http://jscs.info/rule/requireSpaceAfterKeywords)
```javascript
// bad
@@ -1653,7 +1729,8 @@ Other Style Guides
}
```
- - [18.4](#18.4) Set off operators with spaces. eslint: [`space-infix-ops`](http://eslint.org/docs/rules/space-infix-ops.html) jscs: [`requireSpaceBeforeBinaryOperators`](http://jscs.info/rule/requireSpaceBeforeBinaryOperators), [`requireSpaceAfterBinaryOperators`](http://jscs.info/rule/requireSpaceAfterBinaryOperators)
+
+ - [18.4](#whitespace--infix-ops) Set off operators with spaces. eslint: [`space-infix-ops`](http://eslint.org/docs/rules/space-infix-ops.html) jscs: [`requireSpaceBeforeBinaryOperators`](http://jscs.info/rule/requireSpaceBeforeBinaryOperators), [`requireSpaceAfterBinaryOperators`](http://jscs.info/rule/requireSpaceAfterBinaryOperators)
```javascript
// bad
@@ -1663,7 +1740,8 @@ Other Style Guides
const x = y + 5;
```
- - [18.5](#18.5) End files with a single newline character.
+
+ - [18.5](#whitespace--newline-at-end) End files with a single newline character.
```javascript
// bad
@@ -1687,7 +1765,8 @@ Other Style Guides
})(this);↵
```
- - [18.6](#18.6) Use indentation when making long method chains (more than 2 method chains). Use a leading dot, which
+
+ - [18.6](#whitespace--chains) Use indentation when making long method chains (more than 2 method chains). Use a leading dot, which
emphasizes that the line is a method call, not a new statement. eslint: [`newline-per-chained-call`](http://eslint.org/docs/rules/newline-per-chained-call) [`no-whitespace-before-property`](http://eslint.org/docs/rules/no-whitespace-before-property)
```javascript
@@ -1730,7 +1809,8 @@ Other Style Guides
const leds = stage.selectAll('.led').data(data);
```
- - [18.7](#18.7) Leave a blank line after blocks and before the next statement. jscs: [`requirePaddingNewLinesAfterBlocks`](http://jscs.info/rule/requirePaddingNewLinesAfterBlocks)
+
+ - [18.7](#whitespace--after-blocks) Leave a blank line after blocks and before the next statement. jscs: [`requirePaddingNewLinesAfterBlocks`](http://jscs.info/rule/requirePaddingNewLinesAfterBlocks)
```javascript
// bad
@@ -1787,7 +1867,8 @@ Other Style Guides
return arr;
```
- - [18.8](#18.8) Do not pad your blocks with blank lines. eslint: [`padded-blocks`](http://eslint.org/docs/rules/padded-blocks.html) jscs: [`disallowPaddingNewlinesInBlocks`](http://jscs.info/rule/disallowPaddingNewlinesInBlocks)
+
+ - [18.8](#whitespace--padded-blocks) Do not pad your blocks with blank lines. eslint: [`padded-blocks`](http://eslint.org/docs/rules/padded-blocks.html) jscs: [`disallowPaddingNewlinesInBlocks`](http://jscs.info/rule/disallowPaddingNewlinesInBlocks)
```javascript
// bad
@@ -1819,7 +1900,8 @@ Other Style Guides
}
```
- - [18.9](#18.9) Do not add spaces inside parentheses. eslint: [`space-in-parens`](http://eslint.org/docs/rules/space-in-parens.html) jscs: [`disallowSpacesInsideParentheses`](http://jscs.info/rule/disallowSpacesInsideParentheses)
+
+ - [18.9](#whitespace--in-parens) Do not add spaces inside parentheses. eslint: [`space-in-parens`](http://eslint.org/docs/rules/space-in-parens.html) jscs: [`disallowSpacesInsideParentheses`](http://jscs.info/rule/disallowSpacesInsideParentheses)
```javascript
// bad
@@ -1843,7 +1925,8 @@ Other Style Guides
}
```
- - [18.10](#18.10) Do not add spaces inside brackets. eslint: [`array-bracket-spacing`](http://eslint.org/docs/rules/array-bracket-spacing.html) jscs: [`disallowSpacesInsideArrayBrackets`](http://jscs.info/rule/disallowSpacesInsideArrayBrackets)
+
+ - [18.10](#whitespace--in-brackets) Do not add spaces inside brackets. eslint: [`array-bracket-spacing`](http://eslint.org/docs/rules/array-bracket-spacing.html) jscs: [`disallowSpacesInsideArrayBrackets`](http://jscs.info/rule/disallowSpacesInsideArrayBrackets)
```javascript
// bad
@@ -1855,7 +1938,8 @@ Other Style Guides
console.log(foo[0]);
```
- - [18.11](#18.11) Add spaces inside curly braces. eslint: [`object-curly-spacing`](http://eslint.org/docs/rules/object-curly-spacing.html) jscs: [`disallowSpacesInsideObjectBrackets`](http://jscs.info/rule/disallowSpacesInsideObjectBrackets)
+
+ - [18.11](#whitespace--in-braces) Add spaces inside curly braces. eslint: [`object-curly-spacing`](http://eslint.org/docs/rules/object-curly-spacing.html) jscs: [`disallowSpacesInsideObjectBrackets`](http://jscs.info/rule/disallowSpacesInsideObjectBrackets)
```javascript
// bad
@@ -1865,7 +1949,8 @@ Other Style Guides
const foo = { clark: 'kent' };
```
- - [18.12](#18.12) Avoid having lines of code that are longer than 100 characters (including whitespace). eslint: [`max-len`](http://eslint.org/docs/rules/max-len.html) jscs: [`maximumLineLength`](http://jscs.info/rule/maximumLineLength)
+
+ - [18.12](#whitespace--max-len) Avoid having lines of code that are longer than 100 characters (including whitespace). eslint: [`max-len`](http://eslint.org/docs/rules/max-len.html) jscs: [`maximumLineLength`](http://jscs.info/rule/maximumLineLength)
> Why? This ensures readability and maintainability.
@@ -1894,7 +1979,8 @@ Other Style Guides
## Commas
- - [19.1](#19.1) Leading commas: **Nope.** eslint: [`comma-style`](http://eslint.org/docs/rules/comma-style.html) jscs: [`requireCommaBeforeLineBreak`](http://jscs.info/rule/requireCommaBeforeLineBreak)
+
+ - [19.1](#commas--leading-trailing) Leading commas: **Nope.** eslint: [`comma-style`](http://eslint.org/docs/rules/comma-style.html) jscs: [`requireCommaBeforeLineBreak`](http://jscs.info/rule/requireCommaBeforeLineBreak)
```javascript
// bad
@@ -1928,7 +2014,8 @@ Other Style Guides
};
```
- - [19.2](#19.2) Additional trailing comma: **Yup.** eslint: [`comma-dangle`](http://eslint.org/docs/rules/comma-dangle.html) jscs: [`requireTrailingComma`](http://jscs.info/rule/requireTrailingComma)
+
+ - [19.2](#commas--dangling) Additional trailing comma: **Yup.** eslint: [`comma-dangle`](http://eslint.org/docs/rules/comma-dangle.html) jscs: [`requireTrailingComma`](http://jscs.info/rule/requireTrailingComma)
> Why? This leads to cleaner git diffs. Also, transpilers like Babel will remove the additional trailing comma in the transpiled code which means you don't have to worry about the [trailing comma problem](es5/README.md#commas) in legacy browsers.
@@ -1976,7 +2063,8 @@ Other Style Guides
## Semicolons
- - [20.1](#20.1) **Yup.** eslint: [`semi`](http://eslint.org/docs/rules/semi.html) jscs: [`requireSemicolons`](http://jscs.info/rule/requireSemicolons)
+
+ - [20.1](#20.1) **Yup.** eslint: [`semi`](http://eslint.org/docs/rules/semi.html) jscs: [`requireSemicolons`](http://jscs.info/rule/requireSemicolons)
```javascript
// bad
@@ -2005,8 +2093,11 @@ Other Style Guides
## Type Casting & Coercion
- - [21.1](#21.1) Perform type coercion at the beginning of the statement.
- - [21.2](#21.2) Strings:
+
+ - [21.1](#coercion--explicit) Perform type coercion at the beginning of the statement.
+
+
+ - [21.2](#coercion--strings) Strings:
```javascript
// => this.reviewScore = 9;
@@ -2021,7 +2112,8 @@ Other Style Guides
const totalScore = String(this.reviewScore);
```
- - [21.3](#21.3) Numbers: Use `Number` for type casting and `parseInt` always with a radix for parsing strings. eslint: [`radix`](http://eslint.org/docs/rules/radix)
+
+ - [21.3](#coercion--numbers) Numbers: Use `Number` for type casting and `parseInt` always with a radix for parsing strings. eslint: [`radix`](http://eslint.org/docs/rules/radix)
```javascript
const inputValue = '4';
@@ -2045,7 +2137,8 @@ Other Style Guides
const val = parseInt(inputValue, 10);
```
- - [21.4](#21.4) If for whatever reason you are doing something wild and `parseInt` is your bottleneck and need to use Bitshift for [performance reasons](http://jsperf.com/coercion-vs-casting/3), leave a comment explaining why and what you're doing.
+
+ - [21.4](#coercion--comment-deviations) If for whatever reason you are doing something wild and `parseInt` is your bottleneck and need to use Bitshift for [performance reasons](http://jsperf.com/coercion-vs-casting/3), leave a comment explaining why and what you're doing.
```javascript
// good
@@ -2057,7 +2150,8 @@ Other Style Guides
const val = inputValue >> 0;
```
- - [21.5](#21.5) **Note:** Be careful when using bitshift operations. Numbers are represented as [64-bit values](http://es5.github.io/#x4.3.19), but bitshift operations always return a 32-bit integer ([source](http://es5.github.io/#x11.7)). Bitshift can lead to unexpected behavior for integer values larger than 32 bits. [Discussion](https://github.com/airbnb/javascript/issues/109). Largest signed 32-bit Int is 2,147,483,647:
+
+ - [21.5](#coercion--bitwise) **Note:** Be careful when using bitshift operations. Numbers are represented as [64-bit values](http://es5.github.io/#x4.3.19), but bitshift operations always return a 32-bit integer ([source](http://es5.github.io/#x11.7)). Bitshift can lead to unexpected behavior for integer values larger than 32 bits. [Discussion](https://github.com/airbnb/javascript/issues/109). Largest signed 32-bit Int is 2,147,483,647:
```javascript
2147483647 >> 0 //=> 2147483647
@@ -2065,7 +2159,8 @@ Other Style Guides
2147483649 >> 0 //=> -2147483647
```
- - [21.6](#21.6) Booleans:
+
+ - [21.6](#coercion--booleans) Booleans:
```javascript
const age = 0;
@@ -2085,7 +2180,8 @@ Other Style Guides
## Naming Conventions
- - [22.1](#22.1) Avoid single letter names. Be descriptive with your naming.
+
+ - [22.1](#naming--descriptive) Avoid single letter names. Be descriptive with your naming.
```javascript
// bad
@@ -2099,7 +2195,8 @@ Other Style Guides
}
```
- - [22.2](#22.2) Use camelCase when naming objects, functions, and instances. eslint: [`camelcase`](http://eslint.org/docs/rules/camelcase.html) jscs: [`requireCamelCaseOrUpperCaseIdentifiers`](http://jscs.info/rule/requireCamelCaseOrUpperCaseIdentifiers)
+
+ - [22.2](#naming--camelCase) Use camelCase when naming objects, functions, and instances. eslint: [`camelcase`](http://eslint.org/docs/rules/camelcase.html) jscs: [`requireCamelCaseOrUpperCaseIdentifiers`](http://jscs.info/rule/requireCamelCaseOrUpperCaseIdentifiers)
```javascript
// bad
@@ -2112,7 +2209,8 @@ Other Style Guides
function thisIsMyFunction() {}
```
- - [22.3](#22.3) Use PascalCase when naming constructors or classes. eslint: [`new-cap`](http://eslint.org/docs/rules/new-cap.html) jscs: [`requireCapitalizedConstructors`](http://jscs.info/rule/requireCapitalizedConstructors)
+
+ - [22.3](#naming--PascalCase) Use PascalCase only when naming constructors or classes. eslint: [`new-cap`](http://eslint.org/docs/rules/new-cap.html) jscs: [`requireCapitalizedConstructors`](http://jscs.info/rule/requireCapitalizedConstructors)
```javascript
// bad
@@ -2136,7 +2234,8 @@ Other Style Guides
});
```
- - [22.4](#22.4) Use a leading underscore `_` when naming private properties. eslint: [`no-underscore-dangle`](http://eslint.org/docs/rules/no-underscore-dangle.html) jscs: [`disallowDanglingUnderscores`](http://jscs.info/rule/disallowDanglingUnderscores)
+
+ - [22.4](#naming--leading-underscore) Use a leading underscore `_` when naming private properties. eslint: [`no-underscore-dangle`](http://eslint.org/docs/rules/no-underscore-dangle.html) jscs: [`disallowDanglingUnderscores`](http://jscs.info/rule/disallowDanglingUnderscores)
```javascript
// bad
@@ -2147,7 +2246,8 @@ Other Style Guides
this._firstName = 'Panda';
```
- - [22.5](#22.5) Don't save references to `this`. Use arrow functions or Function#bind. jscs: [`disallowNodeTypes`](http://jscs.info/rule/disallowNodeTypes)
+
+ - [22.5](#naming--self-this) Don't save references to `this`. Use arrow functions or Function#bind. jscs: [`disallowNodeTypes`](http://jscs.info/rule/disallowNodeTypes)
```javascript
// bad
@@ -2174,7 +2274,8 @@ Other Style Guides
}
```
- - [22.6](#22.6) If your file exports a single class, your filename should be exactly the name of the class.
+
+ - [22.6](#naming--filename-matches-export) If your file exports a single class, your filename should be exactly the name of the class.
```javascript
// file contents
@@ -2194,7 +2295,8 @@ Other Style Guides
import CheckBox from './CheckBox';
```
- - [22.7](#22.7) Use camelCase when you export-default a function. Your filename should be identical to your function's name.
+
+ - [22.7](#naming--camelCase-default-export) Use camelCase when you export-default a function. Your filename should be identical to your function's name.
```javascript
function makeStyleGuide() {
@@ -2203,7 +2305,8 @@ Other Style Guides
export default makeStyleGuide;
```
- - [22.8](#22.8) Use PascalCase when you export a singleton / function library / bare object.
+
+ - [22.8](#naming--PascalCase-singleton) Use PascalCase when you export a singleton / function library / bare object.
```javascript
const AirbnbStyleGuide = {
@@ -2220,8 +2323,11 @@ Other Style Guides
## Accessors
- - [23.1](#23.1) Accessor functions for properties are not required.
- - [23.2](#23.2) Do not use JavaScript getters/setters as they cause unexpected side effects and are harder to test, maintain, and reason about. Instead, if you do make accessor functions, use getVal() and setVal('hello').
+
+ - [23.1](#accessors--not-required) Accessor functions for properties are not required.
+
+
+ - [23.2](#accessors--no-getters-setters) Do not use JavaScript getters/setters as they cause unexpected side effects and are harder to test, maintain, and reason about. Instead, if you do make accessor functions, use getVal() and setVal('hello').
```javascript
// bad
@@ -2237,7 +2343,8 @@ Other Style Guides
dragon.setAge(25);
```
- - [23.3](#23.3) If the property is a `boolean`, use `isVal()` or `hasVal()`.
+
+ - [23.3](#accessors--boolean-prefix) If the property/method is a `boolean`, use `isVal()` or `hasVal()`.
```javascript
// bad
@@ -2251,7 +2358,8 @@ Other Style Guides
}
```
- - [23.4](#23.4) It's okay to create get() and set() functions, but be consistent.
+
+ - [23.4](#accessors--consistent) It's okay to create get() and set() functions, but be consistent.
```javascript
class Jedi {
@@ -2275,7 +2383,8 @@ Other Style Guides
## Events
- - [24.1](#24.1) When attaching data payloads to events (whether DOM events or something more proprietary like Backbone events), pass a hash instead of a raw value. This allows a subsequent contributor to add more data to the event payload without finding and updating every handler for the event. For example, instead of:
+
+ - [24.1](#events--hash) When attaching data payloads to events (whether DOM events or something more proprietary like Backbone events), pass a hash instead of a raw value. This allows a subsequent contributor to add more data to the event payload without finding and updating every handler for the event. For example, instead of:
```javascript
// bad
@@ -2306,7 +2415,8 @@ Other Style Guides
## jQuery
- - [25.1](#25.1) Prefix jQuery object variables with a `$`. jscs: [`requireDollarBeforejQueryAssignment`](http://jscs.info/rule/requireDollarBeforejQueryAssignment)
+
+ - [25.1](#jquery--dollar-prefix) Prefix jQuery object variables with a `$`. jscs: [`requireDollarBeforejQueryAssignment`](http://jscs.info/rule/requireDollarBeforejQueryAssignment)
```javascript
// bad
@@ -2319,7 +2429,8 @@ Other Style Guides
const $sidebarBtn = $('.sidebar-btn');
```
- - [25.2](#25.2) Cache jQuery lookups.
+
+ - [25.2](#jquery--cache) Cache jQuery lookups.
```javascript
// bad
@@ -2346,8 +2457,11 @@ Other Style Guides
}
```
- - [25.3](#25.3) For DOM queries use Cascading `$('.sidebar ul')` or parent > child `$('.sidebar > ul')`. [jsPerf](http://jsperf.com/jquery-find-vs-context-sel/16)
- - [25.4](#25.4) Use `find` with scoped jQuery object queries.
+
+ - [25.3](#jquery--queries) For DOM queries use Cascading `$('.sidebar ul')` or parent > child `$('.sidebar > ul')`. [jsPerf](http://jsperf.com/jquery-find-vs-context-sel/16)
+
+
+ - [25.4](#jquery--find) Use `find` with scoped jQuery object queries.
```javascript
// bad
@@ -2371,13 +2485,15 @@ Other Style Guides
## ECMAScript 5 Compatibility
- - [26.1](#26.1) Refer to [Kangax](https://twitter.com/kangax/)'s ES5 [compatibility table](http://kangax.github.io/es5-compat-table/).
+
+ - [26.1](#es5-compat--kangax) Refer to [Kangax](https://twitter.com/kangax/)'s ES5 [compatibility table](http://kangax.github.io/es5-compat-table/).
**[⬆ back to top](#table-of-contents)**
## ECMAScript 6 Styles
- - [27.1](#27.1) This is a collection of links to the various ES6 features.
+
+ - [27.1](#es6-styles) This is a collection of links to the various ES6 features.
1. [Arrow Functions](#arrow-functions)
1. [Classes](#constructors)
@@ -2397,7 +2513,8 @@ Other Style Guides
## Testing
- - [28.1](#28.1) **Yup.**
+
+ - [28.1](#esting--yup) **Yup.**
```javascript
function foo() {
@@ -2405,7 +2522,8 @@ Other Style Guides
}
```
- - [28.2](#28.2) **No, but seriously**:
+
+ - [28.2](#testing--for-real) **No, but seriously**:
- Whichever testing framework you use, you should be writing tests!
- Strive to write many small pure functions, and minimize where mutations occur.
- Be cautious about stubs and mocks - they can make your tests more brittle.