mirror of https://github.com/status-im/web3.js.git
1742 lines
45 KiB
Markdown
1742 lines
45 KiB
Markdown
[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/airbnb/javascript?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
|
|
|
# Airbnb JavaScript Style Guide() {
|
|
|
|
*A mostly reasonable approach to JavaScript*
|
|
|
|
|
|
## Table of Contents
|
|
|
|
1. [Types](#types)
|
|
1. [Objects](#objects)
|
|
1. [Arrays](#arrays)
|
|
1. [Strings](#strings)
|
|
1. [Functions](#functions)
|
|
1. [Properties](#properties)
|
|
1. [Variables](#variables)
|
|
1. [Hoisting](#hoisting)
|
|
1. [Comparison Operators & Equality](#comparison-operators--equality)
|
|
1. [Blocks](#blocks)
|
|
1. [Comments](#comments)
|
|
1. [Whitespace](#whitespace)
|
|
1. [Commas](#commas)
|
|
1. [Semicolons](#semicolons)
|
|
1. [Type Casting & Coercion](#type-casting--coercion)
|
|
1. [Naming Conventions](#naming-conventions)
|
|
1. [Accessors](#accessors)
|
|
1. [Constructors](#constructors)
|
|
1. [Events](#events)
|
|
1. [Modules](#modules)
|
|
1. [jQuery](#jquery)
|
|
1. [ECMAScript 5 Compatibility](#ecmascript-5-compatibility)
|
|
1. [Testing](#testing)
|
|
1. [Performance](#performance)
|
|
1. [Resources](#resources)
|
|
1. [In the Wild](#in-the-wild)
|
|
1. [Translation](#translation)
|
|
1. [The JavaScript Style Guide Guide](#the-javascript-style-guide-guide)
|
|
1. [Chat With Us About Javascript](#chat-with-us-about-javascript)
|
|
1. [Contributors](#contributors)
|
|
1. [License](#license)
|
|
|
|
## Types
|
|
|
|
- **Primitives**: When you access a primitive type you work directly on its value.
|
|
|
|
+ `string`
|
|
+ `number`
|
|
+ `boolean`
|
|
+ `null`
|
|
+ `undefined`
|
|
|
|
```javascript
|
|
var foo = 1;
|
|
var bar = foo;
|
|
|
|
bar = 9;
|
|
|
|
console.log(foo, bar); // => 1, 9
|
|
```
|
|
- **Complex**: When you access a complex type you work on a reference to its value.
|
|
|
|
+ `object`
|
|
+ `array`
|
|
+ `function`
|
|
|
|
```javascript
|
|
var foo = [1, 2];
|
|
var bar = foo;
|
|
|
|
bar[0] = 9;
|
|
|
|
console.log(foo[0], bar[0]); // => 9, 9
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
## Objects
|
|
|
|
- Use the literal syntax for object creation.
|
|
|
|
```javascript
|
|
// bad
|
|
var item = new Object();
|
|
|
|
// good
|
|
var item = {};
|
|
```
|
|
|
|
- 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).
|
|
|
|
```javascript
|
|
// bad
|
|
var superman = {
|
|
default: { clark: 'kent' },
|
|
private: true
|
|
};
|
|
|
|
// good
|
|
var superman = {
|
|
defaults: { clark: 'kent' },
|
|
hidden: true
|
|
};
|
|
```
|
|
|
|
- Use readable synonyms in place of reserved words.
|
|
|
|
```javascript
|
|
// bad
|
|
var superman = {
|
|
class: 'alien'
|
|
};
|
|
|
|
// bad
|
|
var superman = {
|
|
klass: 'alien'
|
|
};
|
|
|
|
// good
|
|
var superman = {
|
|
type: 'alien'
|
|
};
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
## Arrays
|
|
|
|
- Use the literal syntax for array creation.
|
|
|
|
```javascript
|
|
// bad
|
|
var items = new Array();
|
|
|
|
// good
|
|
var items = [];
|
|
```
|
|
|
|
- Use Array#push instead of direct assignment to add items to an array.
|
|
|
|
```javascript
|
|
var someStack = [];
|
|
|
|
|
|
// bad
|
|
someStack[someStack.length] = 'abracadabra';
|
|
|
|
// good
|
|
someStack.push('abracadabra');
|
|
```
|
|
|
|
- When you need to copy an array use Array#slice. [jsPerf](http://jsperf.com/converting-arguments-to-an-array/7)
|
|
|
|
```javascript
|
|
var len = items.length;
|
|
var itemsCopy = [];
|
|
var i;
|
|
|
|
// bad
|
|
for (i = 0; i < len; i++) {
|
|
itemsCopy[i] = items[i];
|
|
}
|
|
|
|
// good
|
|
itemsCopy = items.slice();
|
|
```
|
|
|
|
- To convert an array-like object to an array, use Array#slice.
|
|
|
|
```javascript
|
|
function trigger() {
|
|
var args = Array.prototype.slice.call(arguments);
|
|
...
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Strings
|
|
|
|
- Use single quotes `''` for strings.
|
|
|
|
```javascript
|
|
// bad
|
|
var name = "Bob Parr";
|
|
|
|
// good
|
|
var name = 'Bob Parr';
|
|
|
|
// bad
|
|
var fullName = "Bob " + this.lastName;
|
|
|
|
// good
|
|
var fullName = 'Bob ' + this.lastName;
|
|
```
|
|
|
|
- Strings longer than 80 characters should be written across multiple lines using string concatenation.
|
|
- 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
|
|
var errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';
|
|
|
|
// bad
|
|
var errorMessage = 'This is a super long error that was thrown because \
|
|
of Batman. When you stop to think about how Batman had anything to do \
|
|
with this, you would get nowhere \
|
|
fast.';
|
|
|
|
// good
|
|
var errorMessage = 'This is a super long error that was thrown because ' +
|
|
'of Batman. When you stop to think about how Batman had anything to do ' +
|
|
'with this, you would get nowhere fast.';
|
|
```
|
|
|
|
- When programmatically building up a string, use Array#join instead of string concatenation. Mostly for IE: [jsPerf](http://jsperf.com/string-vs-array-concat/2).
|
|
|
|
```javascript
|
|
var items;
|
|
var messages;
|
|
var length;
|
|
var i;
|
|
|
|
messages = [{
|
|
state: 'success',
|
|
message: 'This one worked.'
|
|
}, {
|
|
state: 'success',
|
|
message: 'This one worked as well.'
|
|
}, {
|
|
state: 'error',
|
|
message: 'This one did not work.'
|
|
}];
|
|
|
|
length = messages.length;
|
|
|
|
// bad
|
|
function inbox(messages) {
|
|
items = '<ul>';
|
|
|
|
for (i = 0; i < length; i++) {
|
|
items += '<li>' + messages[i].message + '</li>';
|
|
}
|
|
|
|
return items + '</ul>';
|
|
}
|
|
|
|
// good
|
|
function inbox(messages) {
|
|
items = [];
|
|
|
|
for (i = 0; i < length; i++) {
|
|
// use direct assignment in this case because we're micro-optimizing.
|
|
items[i] = '<li>' + messages[i].message + '</li>';
|
|
}
|
|
|
|
return '<ul>' + items.join('') + '</ul>';
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Functions
|
|
|
|
- Function expressions:
|
|
|
|
```javascript
|
|
// anonymous function expression
|
|
var anonymous = function() {
|
|
return true;
|
|
};
|
|
|
|
// named function expression
|
|
var named = function named() {
|
|
return true;
|
|
};
|
|
|
|
// immediately-invoked function expression (IIFE)
|
|
(function() {
|
|
console.log('Welcome to the Internet. Please follow me.');
|
|
})();
|
|
```
|
|
|
|
- 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.
|
|
- **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
|
|
if (currentUser) {
|
|
function test() {
|
|
console.log('Nope.');
|
|
}
|
|
}
|
|
|
|
// good
|
|
var test;
|
|
if (currentUser) {
|
|
test = function test() {
|
|
console.log('Yup.');
|
|
};
|
|
}
|
|
```
|
|
|
|
- Never name a parameter `arguments`. This will take precedence over the `arguments` object that is given to every function scope.
|
|
|
|
```javascript
|
|
// bad
|
|
function nope(name, options, arguments) {
|
|
// ...stuff...
|
|
}
|
|
|
|
// good
|
|
function yup(name, options, args) {
|
|
// ...stuff...
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
|
|
## Properties
|
|
|
|
- Use dot notation when accessing properties.
|
|
|
|
```javascript
|
|
var luke = {
|
|
jedi: true,
|
|
age: 28
|
|
};
|
|
|
|
// bad
|
|
var isJedi = luke['jedi'];
|
|
|
|
// good
|
|
var isJedi = luke.jedi;
|
|
```
|
|
|
|
- Use subscript notation `[]` when accessing properties with a variable.
|
|
|
|
```javascript
|
|
var luke = {
|
|
jedi: true,
|
|
age: 28
|
|
};
|
|
|
|
function getProp(prop) {
|
|
return luke[prop];
|
|
}
|
|
|
|
var isJedi = getProp('jedi');
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Variables
|
|
|
|
- Always use `var` 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
|
|
superPower = new SuperPower();
|
|
|
|
// good
|
|
var superPower = new SuperPower();
|
|
```
|
|
|
|
- Use one `var` declaration per variable.
|
|
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.
|
|
|
|
```javascript
|
|
// bad
|
|
var items = getItems(),
|
|
goSportsTeam = true,
|
|
dragonball = 'z';
|
|
|
|
// bad
|
|
// (compare to above, and try to spot the mistake)
|
|
var items = getItems(),
|
|
goSportsTeam = true;
|
|
dragonball = 'z';
|
|
|
|
// good
|
|
var items = getItems();
|
|
var goSportsTeam = true;
|
|
var dragonball = 'z';
|
|
```
|
|
|
|
- Declare unassigned variables last. This is helpful when later on you might need to assign a variable depending on one of the previous assigned variables.
|
|
|
|
```javascript
|
|
// bad
|
|
var i, len, dragonball,
|
|
items = getItems(),
|
|
goSportsTeam = true;
|
|
|
|
// bad
|
|
var i;
|
|
var items = getItems();
|
|
var dragonball;
|
|
var goSportsTeam = true;
|
|
var len;
|
|
|
|
// good
|
|
var items = getItems();
|
|
var goSportsTeam = true;
|
|
var dragonball;
|
|
var length;
|
|
var i;
|
|
```
|
|
|
|
- Assign variables at the top of their scope. This helps avoid issues with variable declaration and assignment hoisting related issues.
|
|
|
|
```javascript
|
|
// bad
|
|
function() {
|
|
test();
|
|
console.log('doing stuff..');
|
|
|
|
//..other stuff..
|
|
|
|
var name = getName();
|
|
|
|
if (name === 'test') {
|
|
return false;
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
// good
|
|
function() {
|
|
var name = getName();
|
|
|
|
test();
|
|
console.log('doing stuff..');
|
|
|
|
//..other stuff..
|
|
|
|
if (name === 'test') {
|
|
return false;
|
|
}
|
|
|
|
return name;
|
|
}
|
|
|
|
// bad - unnecessary function call
|
|
function() {
|
|
var name = getName();
|
|
|
|
if (!arguments.length) {
|
|
return false;
|
|
}
|
|
|
|
this.setFirstName(name);
|
|
|
|
return true;
|
|
}
|
|
|
|
// good
|
|
function() {
|
|
var name;
|
|
|
|
if (!arguments.length) {
|
|
return false;
|
|
}
|
|
|
|
name = getName();
|
|
this.setFirstName(name);
|
|
|
|
return true;
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Hoisting
|
|
|
|
- Variable declarations get hoisted to the top of their scope, but their assignment does not.
|
|
|
|
```javascript
|
|
// we know this wouldn't work (assuming there
|
|
// is no notDefined global variable)
|
|
function example() {
|
|
console.log(notDefined); // => throws a ReferenceError
|
|
}
|
|
|
|
// creating a variable declaration after you
|
|
// reference the variable will work due to
|
|
// variable hoisting. Note: the assignment
|
|
// value of `true` is not hoisted.
|
|
function example() {
|
|
console.log(declaredButNotAssigned); // => undefined
|
|
var declaredButNotAssigned = true;
|
|
}
|
|
|
|
// The interpreter is hoisting the variable
|
|
// declaration to the top of the scope,
|
|
// which means our example could be rewritten as:
|
|
function example() {
|
|
var declaredButNotAssigned;
|
|
console.log(declaredButNotAssigned); // => undefined
|
|
declaredButNotAssigned = true;
|
|
}
|
|
```
|
|
|
|
- Anonymous function expressions hoist their variable name, but not the function assignment.
|
|
|
|
```javascript
|
|
function example() {
|
|
console.log(anonymous); // => undefined
|
|
|
|
anonymous(); // => TypeError anonymous is not a function
|
|
|
|
var anonymous = function() {
|
|
console.log('anonymous function expression');
|
|
};
|
|
}
|
|
```
|
|
|
|
- Named function expressions hoist the variable name, not the function name or the function body.
|
|
|
|
```javascript
|
|
function example() {
|
|
console.log(named); // => undefined
|
|
|
|
named(); // => TypeError named is not a function
|
|
|
|
superPower(); // => ReferenceError superPower is not defined
|
|
|
|
var named = function superPower() {
|
|
console.log('Flying');
|
|
};
|
|
}
|
|
|
|
// the same is true when the function name
|
|
// is the same as the variable name.
|
|
function example() {
|
|
console.log(named); // => undefined
|
|
|
|
named(); // => TypeError named is not a function
|
|
|
|
var named = function named() {
|
|
console.log('named');
|
|
}
|
|
}
|
|
```
|
|
|
|
- Function declarations hoist their name and the function body.
|
|
|
|
```javascript
|
|
function example() {
|
|
superPower(); // => Flying
|
|
|
|
function superPower() {
|
|
console.log('Flying');
|
|
}
|
|
}
|
|
```
|
|
|
|
- For more information refer to [JavaScript Scoping & Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting) by [Ben Cherry](http://www.adequatelygood.com/).
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
|
|
## Comparison Operators & Equality
|
|
|
|
- Use `===` and `!==` over `==` and `!=`.
|
|
- 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**
|
|
+ **Null** evaluates to **false**
|
|
+ **Booleans** evaluate to **the value of the boolean**
|
|
+ **Numbers** evaluate to **false** if **+0, -0, or NaN**, otherwise **true**
|
|
+ **Strings** evaluate to **false** if an empty string `''`, otherwise **true**
|
|
|
|
```javascript
|
|
if ([0]) {
|
|
// true
|
|
// An array is an object, objects evaluate to true
|
|
}
|
|
```
|
|
|
|
- Use shortcuts.
|
|
|
|
```javascript
|
|
// bad
|
|
if (name !== '') {
|
|
// ...stuff...
|
|
}
|
|
|
|
// good
|
|
if (name) {
|
|
// ...stuff...
|
|
}
|
|
|
|
// bad
|
|
if (collection.length > 0) {
|
|
// ...stuff...
|
|
}
|
|
|
|
// good
|
|
if (collection.length) {
|
|
// ...stuff...
|
|
}
|
|
```
|
|
|
|
- For more information see [Truth Equality and JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108) by Angus Croll.
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Blocks
|
|
|
|
- Use braces with all multi-line blocks.
|
|
|
|
```javascript
|
|
// bad
|
|
if (test)
|
|
return false;
|
|
|
|
// good
|
|
if (test) return false;
|
|
|
|
// good
|
|
if (test) {
|
|
return false;
|
|
}
|
|
|
|
// bad
|
|
function() { return false; }
|
|
|
|
// good
|
|
function() {
|
|
return false;
|
|
}
|
|
```
|
|
|
|
- If you're using multi-line blocks with `if` and `else`, put `else` on the same line as your
|
|
`if` block's closing brace.
|
|
|
|
```javascript
|
|
// bad
|
|
if (test) {
|
|
thing1();
|
|
thing2();
|
|
}
|
|
else {
|
|
thing3();
|
|
}
|
|
|
|
// good
|
|
if (test) {
|
|
thing1();
|
|
thing2();
|
|
} else {
|
|
thing3();
|
|
}
|
|
```
|
|
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Comments
|
|
|
|
- Use `/** ... */` for multi-line comments. Include a description, specify types and values for all parameters and return values.
|
|
|
|
```javascript
|
|
// bad
|
|
// make() returns a new element
|
|
// based on the passed in tag name
|
|
//
|
|
// @param {String} tag
|
|
// @return {Element} element
|
|
function make(tag) {
|
|
|
|
// ...stuff...
|
|
|
|
return element;
|
|
}
|
|
|
|
// good
|
|
/**
|
|
* make() returns a new element
|
|
* based on the passed in tag name
|
|
*
|
|
* @param {String} tag
|
|
* @return {Element} element
|
|
*/
|
|
function make(tag) {
|
|
|
|
// ...stuff...
|
|
|
|
return element;
|
|
}
|
|
```
|
|
|
|
- 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.
|
|
|
|
```javascript
|
|
// bad
|
|
var active = true; // is current tab
|
|
|
|
// good
|
|
// is current tab
|
|
var active = true;
|
|
|
|
// bad
|
|
function getType() {
|
|
console.log('fetching type...');
|
|
// set the default type to 'no type'
|
|
var type = this._type || 'no type';
|
|
|
|
return type;
|
|
}
|
|
|
|
// good
|
|
function getType() {
|
|
console.log('fetching type...');
|
|
|
|
// set the default type to 'no type'
|
|
var type = this._type || 'no type';
|
|
|
|
return type;
|
|
}
|
|
```
|
|
|
|
- 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`.
|
|
|
|
- Use `// FIXME:` to annotate problems.
|
|
|
|
```javascript
|
|
function Calculator() {
|
|
|
|
// FIXME: shouldn't use a global here
|
|
total = 0;
|
|
|
|
return this;
|
|
}
|
|
```
|
|
|
|
- Use `// TODO:` to annotate solutions to problems.
|
|
|
|
```javascript
|
|
function Calculator() {
|
|
|
|
// TODO: total should be configurable by an options param
|
|
this.total = 0;
|
|
|
|
return this;
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Whitespace
|
|
|
|
- Use soft tabs set to 4 spaces.
|
|
|
|
```javascript
|
|
// good
|
|
function() {
|
|
∙∙∙∙var name;
|
|
}
|
|
|
|
// bad
|
|
function() {
|
|
∙var name;
|
|
}
|
|
|
|
// bad
|
|
function() {
|
|
∙∙var name;
|
|
}
|
|
```
|
|
|
|
- Place 1 space before the leading brace.
|
|
|
|
```javascript
|
|
// bad
|
|
function test(){
|
|
console.log('test');
|
|
}
|
|
|
|
// good
|
|
function test() {
|
|
console.log('test');
|
|
}
|
|
|
|
// bad
|
|
dog.set('attr',{
|
|
age: '1 year',
|
|
breed: 'Bernese Mountain Dog'
|
|
});
|
|
|
|
// good
|
|
dog.set('attr', {
|
|
age: '1 year',
|
|
breed: 'Bernese Mountain Dog'
|
|
});
|
|
```
|
|
|
|
- Place 1 space before the opening parenthesis in control statements (`if`, `while` etc.). Place no space before the argument list in function calls and declarations.
|
|
|
|
```javascript
|
|
// bad
|
|
if(isJedi) {
|
|
fight ();
|
|
}
|
|
|
|
// good
|
|
if (isJedi) {
|
|
fight();
|
|
}
|
|
|
|
// bad
|
|
function fight () {
|
|
console.log ('Swooosh!');
|
|
}
|
|
|
|
// good
|
|
function fight() {
|
|
console.log('Swooosh!');
|
|
}
|
|
```
|
|
|
|
- Set off operators with spaces.
|
|
|
|
```javascript
|
|
// bad
|
|
var x=y+5;
|
|
|
|
// good
|
|
var x = y + 5;
|
|
```
|
|
|
|
- End files with a single newline character.
|
|
|
|
```javascript
|
|
// bad
|
|
(function(global) {
|
|
// ...stuff...
|
|
})(this);
|
|
```
|
|
|
|
```javascript
|
|
// bad
|
|
(function(global) {
|
|
// ...stuff...
|
|
})(this);↵
|
|
↵
|
|
```
|
|
|
|
```javascript
|
|
// good
|
|
(function(global) {
|
|
// ...stuff...
|
|
})(this);↵
|
|
```
|
|
|
|
- Use indentation when making long method chains. Use a leading dot, which
|
|
emphasizes that the line is a method call, not a new statement.
|
|
|
|
```javascript
|
|
// bad
|
|
$('#items').find('.selected').highlight().end().find('.open').updateCount();
|
|
|
|
// bad
|
|
$('#items').
|
|
find('.selected').
|
|
highlight().
|
|
end().
|
|
find('.open').
|
|
updateCount();
|
|
|
|
// good
|
|
$('#items')
|
|
.find('.selected')
|
|
.highlight()
|
|
.end()
|
|
.find('.open')
|
|
.updateCount();
|
|
|
|
// bad
|
|
var leds = stage.selectAll('.led').data(data).enter().append('svg:svg').classed('led', true)
|
|
.attr('width', (radius + margin) * 2).append('svg:g')
|
|
.attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
|
|
.call(tron.led);
|
|
|
|
// good
|
|
var leds = stage.selectAll('.led')
|
|
.data(data)
|
|
.enter().append('svg:svg')
|
|
.classed('led', true)
|
|
.attr('width', (radius + margin) * 2)
|
|
.append('svg:g')
|
|
.attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
|
|
.call(tron.led);
|
|
```
|
|
|
|
- Leave a blank line after blocks and before the next statement
|
|
|
|
```javascript
|
|
// bad
|
|
if (foo) {
|
|
return bar;
|
|
}
|
|
return baz;
|
|
|
|
// good
|
|
if (foo) {
|
|
return bar;
|
|
}
|
|
|
|
return baz;
|
|
|
|
// bad
|
|
var obj = {
|
|
foo: function() {
|
|
},
|
|
bar: function() {
|
|
}
|
|
};
|
|
return obj;
|
|
|
|
// good
|
|
var obj = {
|
|
foo: function() {
|
|
},
|
|
|
|
bar: function() {
|
|
}
|
|
};
|
|
|
|
return obj;
|
|
```
|
|
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
## Commas
|
|
|
|
- Leading commas: **Nope.**
|
|
|
|
```javascript
|
|
// bad
|
|
var story = [
|
|
once
|
|
, upon
|
|
, aTime
|
|
];
|
|
|
|
// good
|
|
var story = [
|
|
once,
|
|
upon,
|
|
aTime
|
|
];
|
|
|
|
// bad
|
|
var hero = {
|
|
firstName: 'Bob'
|
|
, lastName: 'Parr'
|
|
, heroName: 'Mr. Incredible'
|
|
, superPower: 'strength'
|
|
};
|
|
|
|
// good
|
|
var hero = {
|
|
firstName: 'Bob',
|
|
lastName: 'Parr',
|
|
heroName: 'Mr. Incredible',
|
|
superPower: 'strength'
|
|
};
|
|
```
|
|
|
|
- Additional trailing comma: **Nope.** This can cause problems with IE6/7 and IE9 if it's in quirksmode. Also, in some implementations of ES3 would add length to an array if it had an additional trailing comma. This was clarified in ES5 ([source](http://es5.github.io/#D)):
|
|
|
|
> Edition 5 clarifies the fact that a trailing comma at the end of an ArrayInitialiser does not add to the length of the array. This is not a semantic change from Edition 3 but some implementations may have previously misinterpreted this.
|
|
|
|
```javascript
|
|
// bad
|
|
var hero = {
|
|
firstName: 'Kevin',
|
|
lastName: 'Flynn',
|
|
};
|
|
|
|
var heroes = [
|
|
'Batman',
|
|
'Superman',
|
|
];
|
|
|
|
// good
|
|
var hero = {
|
|
firstName: 'Kevin',
|
|
lastName: 'Flynn'
|
|
};
|
|
|
|
var heroes = [
|
|
'Batman',
|
|
'Superman'
|
|
];
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Semicolons
|
|
|
|
- **Yup.**
|
|
|
|
```javascript
|
|
// bad
|
|
(function() {
|
|
var name = 'Skywalker'
|
|
return name
|
|
})()
|
|
|
|
// good
|
|
(function() {
|
|
var name = 'Skywalker';
|
|
return name;
|
|
})();
|
|
|
|
// good (guards against the function becoming an argument when two files with IIFEs are concatenated)
|
|
;(function() {
|
|
var name = 'Skywalker';
|
|
return name;
|
|
})();
|
|
```
|
|
|
|
[Read more](http://stackoverflow.com/a/7365214/1712802).
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Type Casting & Coercion
|
|
|
|
- Perform type coercion at the beginning of the statement.
|
|
- Strings:
|
|
|
|
```javascript
|
|
// => this.reviewScore = 9;
|
|
|
|
// bad
|
|
var totalScore = this.reviewScore + '';
|
|
|
|
// good
|
|
var totalScore = '' + this.reviewScore;
|
|
|
|
// bad
|
|
var totalScore = '' + this.reviewScore + ' total score';
|
|
|
|
// good
|
|
var totalScore = this.reviewScore + ' total score';
|
|
```
|
|
|
|
- Use `parseInt` for Numbers and always with a radix for type casting.
|
|
|
|
```javascript
|
|
var inputValue = '4';
|
|
|
|
// bad
|
|
var val = new Number(inputValue);
|
|
|
|
// bad
|
|
var val = +inputValue;
|
|
|
|
// bad
|
|
var val = inputValue >> 0;
|
|
|
|
// bad
|
|
var val = parseInt(inputValue);
|
|
|
|
// good
|
|
var val = Number(inputValue);
|
|
|
|
// good
|
|
var val = parseInt(inputValue, 10);
|
|
```
|
|
|
|
- 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
|
|
/**
|
|
* parseInt was the reason my code was slow.
|
|
* Bitshifting the String to coerce it to a
|
|
* Number made it a lot faster.
|
|
*/
|
|
var val = inputValue >> 0;
|
|
```
|
|
|
|
- **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
|
|
2147483648 >> 0 //=> -2147483648
|
|
2147483649 >> 0 //=> -2147483647
|
|
```
|
|
|
|
- Booleans:
|
|
|
|
```javascript
|
|
var age = 0;
|
|
|
|
// bad
|
|
var hasAge = new Boolean(age);
|
|
|
|
// good
|
|
var hasAge = Boolean(age);
|
|
|
|
// good
|
|
var hasAge = !!age;
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Naming Conventions
|
|
|
|
- Avoid single letter names. Be descriptive with your naming.
|
|
|
|
```javascript
|
|
// bad
|
|
function q() {
|
|
// ...stuff...
|
|
}
|
|
|
|
// good
|
|
function query() {
|
|
// ..stuff..
|
|
}
|
|
```
|
|
|
|
- Use camelCase when naming objects, functions, and instances.
|
|
|
|
```javascript
|
|
// bad
|
|
var OBJEcttsssss = {};
|
|
var this_is_my_object = {};
|
|
var o = {};
|
|
function c() {}
|
|
|
|
// good
|
|
var thisIsMyObject = {};
|
|
function thisIsMyFunction() {}
|
|
```
|
|
|
|
- Use PascalCase when naming constructors or classes.
|
|
|
|
```javascript
|
|
// bad
|
|
function user(options) {
|
|
this.name = options.name;
|
|
}
|
|
|
|
var bad = new user({
|
|
name: 'nope'
|
|
});
|
|
|
|
// good
|
|
function User(options) {
|
|
this.name = options.name;
|
|
}
|
|
|
|
var good = new User({
|
|
name: 'yup'
|
|
});
|
|
```
|
|
|
|
- Use a leading underscore `_` when naming private properties.
|
|
|
|
```javascript
|
|
// bad
|
|
this.__firstName__ = 'Panda';
|
|
this.firstName_ = 'Panda';
|
|
|
|
// good
|
|
this._firstName = 'Panda';
|
|
```
|
|
|
|
- When saving a reference to `this` use `_this`.
|
|
|
|
```javascript
|
|
// bad
|
|
function() {
|
|
var self = this;
|
|
return function() {
|
|
console.log(self);
|
|
};
|
|
}
|
|
|
|
// bad
|
|
function() {
|
|
var that = this;
|
|
return function() {
|
|
console.log(that);
|
|
};
|
|
}
|
|
|
|
// good
|
|
function() {
|
|
var _this = this;
|
|
return function() {
|
|
console.log(_this);
|
|
};
|
|
}
|
|
```
|
|
|
|
- Name your functions. This is helpful for stack traces.
|
|
|
|
```javascript
|
|
// bad
|
|
var log = function(msg) {
|
|
console.log(msg);
|
|
};
|
|
|
|
// good
|
|
var log = function log(msg) {
|
|
console.log(msg);
|
|
};
|
|
```
|
|
|
|
- **Note:** IE8 and below exhibit some quirks with named function expressions. See [http://kangax.github.io/nfe/](http://kangax.github.io/nfe/) for more info.
|
|
|
|
- If your file exports a single class, your filename should be exactly the name of the class.
|
|
```javascript
|
|
// file contents
|
|
class CheckBox {
|
|
// ...
|
|
}
|
|
module.exports = CheckBox;
|
|
|
|
// in some other file
|
|
// bad
|
|
var CheckBox = require('./checkBox');
|
|
|
|
// bad
|
|
var CheckBox = require('./check_box');
|
|
|
|
// good
|
|
var CheckBox = require('./CheckBox');
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Accessors
|
|
|
|
- Accessor functions for properties are not required.
|
|
- If you do make accessor functions use getVal() and setVal('hello').
|
|
|
|
```javascript
|
|
// bad
|
|
dragon.age();
|
|
|
|
// good
|
|
dragon.getAge();
|
|
|
|
// bad
|
|
dragon.age(25);
|
|
|
|
// good
|
|
dragon.setAge(25);
|
|
```
|
|
|
|
- If the property is a boolean, use isVal() or hasVal().
|
|
|
|
```javascript
|
|
// bad
|
|
if (!dragon.age()) {
|
|
return false;
|
|
}
|
|
|
|
// good
|
|
if (!dragon.hasAge()) {
|
|
return false;
|
|
}
|
|
```
|
|
|
|
- It's okay to create get() and set() functions, but be consistent.
|
|
|
|
```javascript
|
|
function Jedi(options) {
|
|
options || (options = {});
|
|
var lightsaber = options.lightsaber || 'blue';
|
|
this.set('lightsaber', lightsaber);
|
|
}
|
|
|
|
Jedi.prototype.set = function(key, val) {
|
|
this[key] = val;
|
|
};
|
|
|
|
Jedi.prototype.get = function(key) {
|
|
return this[key];
|
|
};
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Constructors
|
|
|
|
- Assign methods to the prototype object, instead of overwriting the prototype with a new object. Overwriting the prototype makes inheritance impossible: by resetting the prototype you'll overwrite the base!
|
|
|
|
```javascript
|
|
function Jedi() {
|
|
console.log('new jedi');
|
|
}
|
|
|
|
// bad
|
|
Jedi.prototype = {
|
|
fight: function fight() {
|
|
console.log('fighting');
|
|
},
|
|
|
|
block: function block() {
|
|
console.log('blocking');
|
|
}
|
|
};
|
|
|
|
// good
|
|
Jedi.prototype.fight = function fight() {
|
|
console.log('fighting');
|
|
};
|
|
|
|
Jedi.prototype.block = function block() {
|
|
console.log('blocking');
|
|
};
|
|
```
|
|
|
|
- Methods can return `this` to help with method chaining.
|
|
|
|
```javascript
|
|
// bad
|
|
Jedi.prototype.jump = function() {
|
|
this.jumping = true;
|
|
return true;
|
|
};
|
|
|
|
Jedi.prototype.setHeight = function(height) {
|
|
this.height = height;
|
|
};
|
|
|
|
var luke = new Jedi();
|
|
luke.jump(); // => true
|
|
luke.setHeight(20); // => undefined
|
|
|
|
// good
|
|
Jedi.prototype.jump = function() {
|
|
this.jumping = true;
|
|
return this;
|
|
};
|
|
|
|
Jedi.prototype.setHeight = function(height) {
|
|
this.height = height;
|
|
return this;
|
|
};
|
|
|
|
var luke = new Jedi();
|
|
|
|
luke.jump()
|
|
.setHeight(20);
|
|
```
|
|
|
|
|
|
- It's okay to write a custom toString() method, just make sure it works successfully and causes no side effects.
|
|
|
|
```javascript
|
|
function Jedi(options) {
|
|
options || (options = {});
|
|
this.name = options.name || 'no name';
|
|
}
|
|
|
|
Jedi.prototype.getName = function getName() {
|
|
return this.name;
|
|
};
|
|
|
|
Jedi.prototype.toString = function toString() {
|
|
return 'Jedi - ' + this.getName();
|
|
};
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Events
|
|
|
|
- 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:
|
|
|
|
```js
|
|
// bad
|
|
$(this).trigger('listingUpdated', listing.id);
|
|
|
|
...
|
|
|
|
$(this).on('listingUpdated', function(e, listingId) {
|
|
// do something with listingId
|
|
});
|
|
```
|
|
|
|
prefer:
|
|
|
|
```js
|
|
// good
|
|
$(this).trigger('listingUpdated', { listingId : listing.id });
|
|
|
|
...
|
|
|
|
$(this).on('listingUpdated', function(e, data) {
|
|
// do something with data.listingId
|
|
});
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Modules
|
|
|
|
- The module should start with a `!`. This ensures that if a malformed module forgets to include a final semicolon there aren't errors in production when the scripts get concatenated. [Explanation](https://github.com/airbnb/javascript/issues/44#issuecomment-13063933)
|
|
- The file should be named with camelCase, live in a folder with the same name, and match the name of the single export.
|
|
- Add a method called `noConflict()` that sets the exported module to the previous version and returns this one.
|
|
- Always declare `'use strict';` at the top of the module.
|
|
|
|
```javascript
|
|
// fancyInput/fancyInput.js
|
|
|
|
!function(global) {
|
|
'use strict';
|
|
|
|
var previousFancyInput = global.FancyInput;
|
|
|
|
function FancyInput(options) {
|
|
this.options = options || {};
|
|
}
|
|
|
|
FancyInput.noConflict = function noConflict() {
|
|
global.FancyInput = previousFancyInput;
|
|
return FancyInput;
|
|
};
|
|
|
|
global.FancyInput = FancyInput;
|
|
}(this);
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## jQuery
|
|
|
|
- Prefix jQuery object variables with a `$`.
|
|
|
|
```javascript
|
|
// bad
|
|
var sidebar = $('.sidebar');
|
|
|
|
// good
|
|
var $sidebar = $('.sidebar');
|
|
```
|
|
|
|
- Cache jQuery lookups.
|
|
|
|
```javascript
|
|
// bad
|
|
function setSidebar() {
|
|
$('.sidebar').hide();
|
|
|
|
// ...stuff...
|
|
|
|
$('.sidebar').css({
|
|
'background-color': 'pink'
|
|
});
|
|
}
|
|
|
|
// good
|
|
function setSidebar() {
|
|
var $sidebar = $('.sidebar');
|
|
$sidebar.hide();
|
|
|
|
// ...stuff...
|
|
|
|
$sidebar.css({
|
|
'background-color': 'pink'
|
|
});
|
|
}
|
|
```
|
|
|
|
- For DOM queries use Cascading `$('.sidebar ul')` or parent > child `$('.sidebar > ul')`. [jsPerf](http://jsperf.com/jquery-find-vs-context-sel/16)
|
|
- Use `find` with scoped jQuery object queries.
|
|
|
|
```javascript
|
|
// bad
|
|
$('ul', '.sidebar').hide();
|
|
|
|
// bad
|
|
$('.sidebar').find('ul').hide();
|
|
|
|
// good
|
|
$('.sidebar ul').hide();
|
|
|
|
// good
|
|
$('.sidebar > ul').hide();
|
|
|
|
// good
|
|
$sidebar.find('ul').hide();
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## ECMAScript 5 Compatibility
|
|
|
|
- Refer to [Kangax](https://twitter.com/kangax/)'s ES5 [compatibility table](http://kangax.github.com/es5-compat-table/).
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Testing
|
|
|
|
- **Yup.**
|
|
|
|
```javascript
|
|
function() {
|
|
return true;
|
|
}
|
|
```
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Performance
|
|
|
|
- [On Layout & Web Performance](http://kellegous.com/j/2013/01/26/layout-performance/)
|
|
- [String vs Array Concat](http://jsperf.com/string-vs-array-concat/2)
|
|
- [Try/Catch Cost In a Loop](http://jsperf.com/try-catch-in-loop-cost)
|
|
- [Bang Function](http://jsperf.com/bang-function)
|
|
- [jQuery Find vs Context, Selector](http://jsperf.com/jquery-find-vs-context-sel/13)
|
|
- [innerHTML vs textContent for script text](http://jsperf.com/innerhtml-vs-textcontent-for-script-text)
|
|
- [Long String Concatenation](http://jsperf.com/ya-string-concat)
|
|
- Loading...
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
|
|
## Resources
|
|
|
|
|
|
**Read This**
|
|
|
|
- [Annotated ECMAScript 5.1](http://es5.github.com/)
|
|
|
|
**Tools**
|
|
|
|
- Code Style Linters
|
|
+ [JSHint](http://www.jshint.com/) - [Airbnb Style .jshintrc](https://github.com/airbnb/javascript/blob/master/linters/jshintrc)
|
|
+ [JSCS](https://github.com/jscs-dev/node-jscs) - [Airbnb Style Preset](https://github.com/jscs-dev/node-jscs/blob/master/presets/airbnb.json)
|
|
|
|
**Other Style Guides**
|
|
|
|
- [Google JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)
|
|
- [jQuery Core Style Guidelines](http://docs.jquery.com/JQuery_Core_Style_Guidelines)
|
|
- [Principles of Writing Consistent, Idiomatic JavaScript](https://github.com/rwldrn/idiomatic.js/)
|
|
- [JavaScript Standard Style](https://github.com/feross/standard)
|
|
|
|
**Other Styles**
|
|
|
|
- [Naming this in nested functions](https://gist.github.com/4135065) - Christian Johansen
|
|
- [Conditional Callbacks](https://github.com/airbnb/javascript/issues/52) - Ross Allen
|
|
- [Popular JavaScript Coding Conventions on Github](http://sideeffect.kr/popularconvention/#javascript) - JeongHoon Byun
|
|
- [Multiple var statements in JavaScript, not superfluous](http://benalman.com/news/2012/05/multiple-var-statements-javascript/) - Ben Alman
|
|
|
|
**Further Reading**
|
|
|
|
- [Understanding JavaScript Closures](http://javascriptweblog.wordpress.com/2010/10/25/understanding-javascript-closures/) - Angus Croll
|
|
- [Basic JavaScript for the impatient programmer](http://www.2ality.com/2013/06/basic-javascript.html) - Dr. Axel Rauschmayer
|
|
- [You Might Not Need jQuery](http://youmightnotneedjquery.com/) - Zack Bloom & Adam Schwartz
|
|
- [ES6 Features](https://github.com/lukehoban/es6features) - Luke Hoban
|
|
- [Frontend Guidelines](https://github.com/bendc/frontend-guidelines) - Benjamin De Cock
|
|
|
|
**Books**
|
|
|
|
- [JavaScript: The Good Parts](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742) - Douglas Crockford
|
|
- [JavaScript Patterns](http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752) - Stoyan Stefanov
|
|
- [Pro JavaScript Design Patterns](http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X) - Ross Harmes and Dustin Diaz
|
|
- [High Performance Web Sites: Essential Knowledge for Front-End Engineers](http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309) - Steve Souders
|
|
- [Maintainable JavaScript](http://www.amazon.com/Maintainable-JavaScript-Nicholas-C-Zakas/dp/1449327680) - Nicholas C. Zakas
|
|
- [JavaScript Web Applications](http://www.amazon.com/JavaScript-Web-Applications-Alex-MacCaw/dp/144930351X) - Alex MacCaw
|
|
- [Pro JavaScript Techniques](http://www.amazon.com/Pro-JavaScript-Techniques-John-Resig/dp/1590597273) - John Resig
|
|
- [Smashing Node.js: JavaScript Everywhere](http://www.amazon.com/Smashing-Node-js-JavaScript-Everywhere-Magazine/dp/1119962595) - Guillermo Rauch
|
|
- [Secrets of the JavaScript Ninja](http://www.amazon.com/Secrets-JavaScript-Ninja-John-Resig/dp/193398869X) - John Resig and Bear Bibeault
|
|
- [Human JavaScript](http://humanjavascript.com/) - Henrik Joreteg
|
|
- [Superhero.js](http://superherojs.com/) - Kim Joar Bekkelund, Mads Mobæk, & Olav Bjorkoy
|
|
- [JSBooks](http://jsbooks.revolunet.com/) - Julien Bouquillon
|
|
- [Third Party JavaScript](http://manning.com/vinegar/) - Ben Vinegar and Anton Kovalyov
|
|
- [Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript](http://amzn.com/0321812182) - David Herman
|
|
- [Eloquent JavaScript](http://eloquentjavascript.net) - Marijn Haverbeke
|
|
- [You Don't Know JS](https://github.com/getify/You-Dont-Know-JS) - Kyle Simpson
|
|
|
|
**Blogs**
|
|
|
|
- [DailyJS](http://dailyjs.com/)
|
|
- [JavaScript Weekly](http://javascriptweekly.com/)
|
|
- [JavaScript, JavaScript...](http://javascriptweblog.wordpress.com/)
|
|
- [Bocoup Weblog](http://weblog.bocoup.com/)
|
|
- [Adequately Good](http://www.adequatelygood.com/)
|
|
- [NCZOnline](http://www.nczonline.net/)
|
|
- [Perfection Kills](http://perfectionkills.com/)
|
|
- [Ben Alman](http://benalman.com/)
|
|
- [Dmitry Baranovskiy](http://dmitry.baranovskiy.com/)
|
|
- [Dustin Diaz](http://dustindiaz.com/)
|
|
- [nettuts](http://net.tutsplus.com/?s=javascript)
|
|
|
|
**Podcasts**
|
|
|
|
- [JavaScript Jabber](http://devchat.tv/js-jabber/)
|
|
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
## In the Wild
|
|
|
|
This is a list of organizations that are using this style guide. Send us a pull request or open an issue and we'll add you to the list.
|
|
|
|
- **Aan Zee**: [AanZee/javascript](https://github.com/AanZee/javascript)
|
|
- **Adult Swim**: [adult-swim/javascript](https://github.com/adult-swim/javascript)
|
|
- **Airbnb**: [airbnb/javascript](https://github.com/airbnb/javascript)
|
|
- **Apartmint**: [apartmint/javascript](https://github.com/apartmint/javascript)
|
|
- **Avalara**: [avalara/javascript](https://github.com/avalara/javascript)
|
|
- **Billabong**: [billabong/javascript](https://github.com/billabong/javascript)
|
|
- **Compass Learning**: [compasslearning/javascript-style-guide](https://github.com/compasslearning/javascript-style-guide)
|
|
- **DailyMotion**: [dailymotion/javascript](https://github.com/dailymotion/javascript)
|
|
- **Digitpaint** [digitpaint/javascript](https://github.com/digitpaint/javascript)
|
|
- **Evernote**: [evernote/javascript-style-guide](https://github.com/evernote/javascript-style-guide)
|
|
- **ExactTarget**: [ExactTarget/javascript](https://github.com/ExactTarget/javascript)
|
|
- **Flexberry**: [Flexberry/javascript-style-guide](https://github.com/Flexberry/javascript-style-guide)
|
|
- **Gawker Media**: [gawkermedia/javascript](https://github.com/gawkermedia/javascript)
|
|
- **General Electric**: [GeneralElectric/javascript](https://github.com/GeneralElectric/javascript)
|
|
- **GoodData**: [gooddata/gdc-js-style](https://github.com/gooddata/gdc-js-style)
|
|
- **Grooveshark**: [grooveshark/javascript](https://github.com/grooveshark/javascript)
|
|
- **How About We**: [howaboutwe/javascript](https://github.com/howaboutwe/javascript)
|
|
- **InfoJobs**: [InfoJobs/JavaScript-Style-Guide](https://github.com/InfoJobs/JavaScript-Style-Guide)
|
|
- **Intent Media**: [intentmedia/javascript](https://github.com/intentmedia/javascript)
|
|
- **Jam3**: [Jam3/Javascript-Code-Conventions](https://github.com/Jam3/Javascript-Code-Conventions)
|
|
- **JSSolutions**: [JSSolutions/javascript](https://github.com/JSSolutions/javascript)
|
|
- **Kinetica Solutions**: [kinetica/javascript](https://github.com/kinetica/javascript)
|
|
- **Mighty Spring**: [mightyspring/javascript](https://github.com/mightyspring/javascript)
|
|
- **MinnPost**: [MinnPost/javascript](https://github.com/MinnPost/javascript)
|
|
- **ModCloth**: [modcloth/javascript](https://github.com/modcloth/javascript)
|
|
- **Money Advice Service**: [moneyadviceservice/javascript](https://github.com/moneyadviceservice/javascript)
|
|
- **Muber**: [muber/javascript](https://github.com/muber/javascript)
|
|
- **National Geographic**: [natgeo/javascript](https://github.com/natgeo/javascript)
|
|
- **National Park Service**: [nationalparkservice/javascript](https://github.com/nationalparkservice/javascript)
|
|
- **Nimbl3**: [nimbl3/javascript](https://github.com/nimbl3/javascript)
|
|
- **Nordic Venture Family**: [CodeDistillery/javascript](https://github.com/CodeDistillery/javascript)
|
|
- **Orion Health**: [orionhealth/javascript](https://github.com/orionhealth/javascript)
|
|
- **Peerby**: [Peerby/javascript](https://github.com/Peerby/javascript)
|
|
- **Razorfish**: [razorfish/javascript-style-guide](https://github.com/razorfish/javascript-style-guide)
|
|
- **reddit**: [reddit/styleguide/javascript](https://github.com/reddit/styleguide/tree/master/javascript)
|
|
- **REI**: [reidev/js-style-guide](https://github.com/reidev/js-style-guide)
|
|
- **Ripple**: [ripple/javascript-style-guide](https://github.com/ripple/javascript-style-guide)
|
|
- **SeekingAlpha**: [seekingalpha/javascript-style-guide](https://github.com/seekingalpha/javascript-style-guide)
|
|
- **Shutterfly**: [shutterfly/javascript](https://github.com/shutterfly/javascript)
|
|
- **StudentSphere**: [studentsphere/javascript](https://github.com/studentsphere/javascript)
|
|
- **Target**: [target/javascript](https://github.com/target/javascript)
|
|
- **TheLadders**: [TheLadders/javascript](https://github.com/TheLadders/javascript)
|
|
- **T4R Technology**: [T4R-Technology/javascript](https://github.com/T4R-Technology/javascript)
|
|
- **VoxFeed**: [VoxFeed/javascript-style-guide](https://github.com/VoxFeed/javascript-style-guide)
|
|
- **Weggo**: [Weggo/javascript](https://github.com/Weggo/javascript)
|
|
- **Zillow**: [zillow/javascript](https://github.com/zillow/javascript)
|
|
- **ZocDoc**: [ZocDoc/javascript](https://github.com/ZocDoc/javascript)
|
|
|
|
## Translation
|
|
|
|
This style guide is also available in other languages:
|
|
|
|
- ![br](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Brazil.png) **Brazilian Portuguese**: [armoucar/javascript-style-guide](https://github.com/armoucar/javascript-style-guide)
|
|
- ![bg](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Bulgaria.png) **Bulgarian**: [borislavvv/javascript](https://github.com/borislavvv/javascript)
|
|
- ![ca](https://raw.githubusercontent.com/fpmweb/javascript-style-guide/master/img/catala.png) **Catalan**: [fpmweb/javascript-style-guide](https://github.com/fpmweb/javascript-style-guide)
|
|
- ![tw](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Taiwan.png) **Chinese(Traditional)**: [jigsawye/javascript](https://github.com/jigsawye/javascript)
|
|
- ![cn](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/China.png) **Chinese(Simplified)**: [sivan/javascript-style-guide](https://github.com/sivan/javascript-style-guide)
|
|
- ![fr](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/France.png) **French**: [nmussy/javascript-style-guide](https://github.com/nmussy/javascript-style-guide)
|
|
- ![de](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Germany.png) **German**: [timofurrer/javascript-style-guide](https://github.com/timofurrer/javascript-style-guide)
|
|
- ![it](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Italy.png) **Italian**: [sinkswim/javascript-style-guide](https://github.com/sinkswim/javascript-style-guide)
|
|
- ![jp](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Japan.png) **Japanese**: [mitsuruog/javacript-style-guide](https://github.com/mitsuruog/javacript-style-guide)
|
|
- ![kr](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/South-Korea.png) **Korean**: [tipjs/javascript-style-guide](https://github.com/tipjs/javascript-style-guide)
|
|
- ![pl](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Poland.png) **Polish**: [mjurczyk/javascript](https://github.com/mjurczyk/javascript)
|
|
- ![ru](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Russia.png) **Russian**: [uprock/javascript](https://github.com/uprock/javascript)
|
|
- ![es](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Spain.png) **Spanish**: [paolocarrasco/javascript-style-guide](https://github.com/paolocarrasco/javascript-style-guide)
|
|
- ![th](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/Thailand.png) **Thai**: [lvarayut/javascript-style-guide](https://github.com/lvarayut/javascript-style-guide)
|
|
|
|
## The JavaScript Style Guide Guide
|
|
|
|
- [Reference](https://github.com/airbnb/javascript/wiki/The-JavaScript-Style-Guide-Guide)
|
|
|
|
## Chat With Us About JavaScript
|
|
|
|
- Find us on [gitter](https://gitter.im/airbnb/javascript).
|
|
|
|
## Contributors
|
|
|
|
- [View Contributors](https://github.com/airbnb/javascript/graphs/contributors)
|
|
|
|
|
|
## License
|
|
|
|
(The MIT License)
|
|
|
|
Copyright (c) 2014 Airbnb
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
a copy of this software and associated documentation files (the
|
|
'Software'), to deal in the Software without restriction, including
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
distribute, sublicense, and/or sell copies of the Software, and to
|
|
permit persons to whom the Software is furnished to do so, subject to
|
|
the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be
|
|
included in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
**[⬆ back to top](#table-of-contents)**
|
|
|
|
# };
|