Awesome
Airbnb JavaScript スタイルガイド() {
常に気をつけたい、JavaScriptへの正しい接し方
Note: this guide assumes you are using Babel, and requires that you use babel-preset-airbnb or the equivalent. It also assumes you are installing shims/polyfills in your app, with airbnb-browser-shims or the equivalent.
注意: このガイドはあなたがBabelを使っていることを前提としており、babel-preset-airbnbかそれと同等のものを使うことが必須です。また、airbnb-browser-shimsまたはそれと同等のシム/ポリフィルをアプリにインストールする必要があります。
This guide is available in other languages too. See Translation
このガイドは他の言語でも利用可能です。Translationを参照してください。
Other Style Guides
他のスタイルガイドたち
Table of Contents
- Types
- References
- Objects
- Arrays
- Destructuring
- Strings
- Functions
- Arrow Functions
- Classes & Constructors
- Modules
- Iterators and Generators
- Properties
- Variables
- Hoisting
- Comparison Operators & Equality
- Blocks
- Control Statements
- Comments
- Whitespace
- Commas
- Semicolons
- Type Casting & Coercion
- Naming Conventions
- Accessors
- Events
- jQuery
- ECMAScript 5 Compatibility
- ECMAScript 6+ (ES 2015+) Styles
- Standard Library
- Testing
- Performance
- Resources
- In the Wild
- Translation
- The JavaScript Style Guide Guide
- Chat With Us About JavaScript
- Contributors
- License
- Amendments
Types
<a name="types--primitives"></a><a name="1.1"></a>
-
1.1 Primitives: When you access a primitive type you work directly on its value.
-
1.1 プリミティブ型: プリミティブ型は、その値を直接操作します。
string
number
boolean
null
undefined
symbol
const foo = 1; let bar = foo; bar = 9; console.log(foo, bar); // => 1, 9
-
Symbols cannot be faithfully polyfilled, so they should not be used when targeting browsers/environments that don’t support them natively.
-
Symbolは忠実にポリフィルされることはできないので、それらをネイティブにサポートしていないブラウザ/環境をターゲットにしているときは使用しない。
<a name="types--complex"></a><a name="1.2"></a>
-
1.2 Complex: When you access a complex type you work on a reference to its value.
-
1.2 参照型: 参照型は、参照を通して値を操作します。
object
array
function
const foo = [1, 2]; const bar = foo; bar[0] = 9; console.log(foo[0], bar[0]); // => 9, 9
References
<a name="references--prefer-const"></a><a name="2.1"></a>
-
2.1 Use
const
for all of your references; avoid usingvar
. eslint:prefer-const
,no-const-assign
-
2.1 すべての参照は
const
を使用し、var
を使用しない。eslint:prefer-const
,no-const-assign
Why? This ensures that you can't reassign your references, which can lead to bugs and difficult to comprehend code.
なぜ? 参照を再割り当でできないことで、バグに繋がりやすく理解しがたいコードになることを防ぎます。
// bad var a = 1; var b = 2; // good const a = 1; const b = 2;
<a name="references--disallow-var"></a><a name="2.2"></a>
-
2.2 If you must reassign references, use
let
instead ofvar
. eslint:no-var
-
2.2 参照を再割当てする場合は
var
の代わりにlet
を使用すること。eslint:no-var
Why?
let
is block-scoped rather than function-scoped likevar
.なぜ?
let
はvar
のように関数スコープではなくブロックスコープです。// bad var count = 1; if (true) { count += 1; } // good, use the let. let count = 1; if (true) { count += 1; }
<a name="references--block-scope"></a><a name="2.3"></a>
-
2.3 Note that both
let
andconst
are block-scoped. -
2.3
let
とconst
は共にブロックスコープであることに注意すること。// const and let only exist in the blocks they are defined in. // const と let はそれらが宣言されたブロックの中でのみ存在します。 { let a = 1; const b = 1; } console.log(a); // ReferenceError console.log(b); // ReferenceError
Objects
<a name="objects--no-new"></a><a name="3.1"></a>
-
3.1 Use the literal syntax for object creation. eslint:
no-new-object
-
3.1 オブジェクトを作成する際は、リテラル構文を使用すること。eslint:
no-new-object
// bad const item = new Object(); // good const item = {};
<a name="es6-computed-properties"></a><a name="3.4"></a>
-
3.2 Use computed property names when creating objects with dynamic property names.
-
3.2 動的にプロパティ名を持つオブジェクトを作成する場合、計算されたプロパティ名(computed property names)を使用すること。
Why? They allow you to define all the properties of an object in one place.
なぜ? こうすることで、オブジェクトのプロパティを1箇所で定義することができます。
function getKey(k) { return `a key named ${k}`; } // bad const obj = { id: 5, name: 'San Francisco', }; obj[getKey('enabled')] = true; // good const obj = { id: 5, name: 'San Francisco', [getKey('enabled')]: true, };
<a name="es6-object-shorthand"></a><a name="3.5"></a>
-
3.3 Use object method shorthand. eslint:
object-shorthand
-
3.3 メソッドの短縮構文を使用すること。eslint:
object-shorthand
// bad const atom = { value: 1, addValue: function (value) { return atom.value + value; }, }; // good const atom = { value: 1, addValue(value) { return atom.value + value; }, };
<a name="es6-object-concise"></a><a name="3.6"></a>
-
3.4 Use property value shorthand. eslint:
object-shorthand
-
3.4 プロパティの短縮構文を使用すること。eslint:
object-shorthand
Why? It is shorter to write and descriptive.
Why? 記述や説明が簡潔になるからです。
const lukeSkywalker = 'Luke Skywalker'; // bad const obj = { lukeSkywalker: lukeSkywalker, }; // good const obj = { lukeSkywalker, };
<a name="objects--grouped-shorthand"></a><a name="3.7"></a>
-
3.5 Group your shorthand properties at the beginning of your object declaration.
-
3.5 <a name='3.7'></a> プロパティの短縮構文はオブジェクト宣言の先頭にまとめること。
Why? It's easier to tell which properties are using the shorthand.
なぜ? どのプロパティが短縮構文を利用しているか分かりやすいからです。
const anakinSkywalker = 'Anakin Skywalker'; const lukeSkywalker = 'Luke Skywalker'; // bad const obj = { episodeOne: 1, twoJediWalkIntoACantina: 2, lukeSkywalker, episodeThree: 3, mayTheFourth: 4, anakinSkywalker, }; // good const obj = { lukeSkywalker, anakinSkywalker, episodeOne: 1, twoJediWalkIntoACantina: 2, episodeThree: 3, mayTheFourth: 4, };
<a name="objects--quoted-props"></a><a name="3.8"></a>
-
3.6 Only quote properties that are invalid identifiers. eslint:
quote-props
-
3.6 無効な識別子の場合のみプロパティを引用符で括ること。eslint:
quote-props
Why? In general we consider it subjectively easier to read. It improves syntax highlighting, and is also more easily optimized by many JS engines.
なぜ? 一般的にこちらの方が読みやすいと考えています。これは構文の強調表示を改善し、また多くのJSエンジンによってより簡単に最適化されます。
// bad const bad = { 'foo': 3, 'bar': 4, 'data-blah': 5, }; // good const good = { foo: 3, bar: 4, 'data-blah': 5, };
<a name="objects--prototype-builtins"></a>
-
3.7 Do not call
Object.prototype
methods directly, such ashasOwnProperty
,propertyIsEnumerable
, andisPrototypeOf
. eslint:no-prototype-builtins
-
3.7
hasOwnProperty
、propertyIsEnumerable
、isPrototypeOf
のようなObject.prototype
の関数を直接呼び出さない。eslint:no-prototype-builtins
Why? These methods may be shadowed by properties on the object in question - consider
{ hasOwnProperty: false }
- or, the object may be a null object (Object.create(null)
).なぜ? これらのメソッドはオブジェクトのプロパティによって隠されている可能性があるかもしれません -
{ hasOwnProperty:false }
のようなケースを考えてください - あるいは、オブジェクトはnullオブジェクト(Object.create(null)
)になっているかもしれません。// bad console.log(object.hasOwnProperty(key)); // good console.log(Object.prototype.hasOwnProperty.call(object, key)); // best const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope. /* or */ import has from 'has'; // https://www.npmjs.com/package/has // ... console.log(has.call(object, key));
<a name="objects--rest-spread"></a>
-
3.8 Prefer the object spread operator over
Object.assign
to shallow-copy objects. Use the object rest operator to get a new object with certain properties omitted. -
3.8 オブジェクトをshallow-copyする場合は
Object.assign
よりもオブジェクトスプレッド構文を使用すること。特定のプロパティを省略した新しいオブジェクトを取得するには、オブジェクトのレスト演算子を使用すること。// very bad const original = { a: 1, b: 2 }; const copy = Object.assign(original, { c: 3 }); // this mutates `original` ಠ_ಠ delete copy.a; // so does this // bad const original = { a: 1, b: 2 }; const copy = Object.assign({}, original, { c: 3 }); // copy => { a: 1, b: 2, c: 3 } // good const original = { a: 1, b: 2 }; const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 } const { a, ...noA } = copy; // noA => { b: 2, c: 3 }
Arrays
<a name="arrays--literals"></a><a name="4.1"></a>
-
4.1 Use the literal syntax for array creation. eslint:
no-array-constructor
-
4.1 配列を作成する際は、リテラル構文を使用すること。eslint:
no-array-constructor
// bad const items = new Array(); // good const items = [];
<a name="arrays--push"></a><a name="4.2"></a>
-
4.2 Use Array#push instead of direct assignment to add items to an array.
-
4.2 直接配列に項目を代入せず、Array#pushを使用すること。
const someStack = []; // bad someStack[someStack.length] = 'abracadabra'; // good someStack.push('abracadabra');
<a name="es6-array-spreads"></a><a name="4.3"></a>
-
4.3 Use array spreads
...
to copy arrays. -
4.3 配列をコピーする場合は、配列の拡張演算子
...
を使用すること。// bad const len = items.length; const itemsCopy = []; let i; for (i = 0; i < len; i++) { itemsCopy[i] = items[i]; } // good const itemsCopy = [...items];
<a name="arrays--from"></a> <a name="arrays--from-iterable"></a><a name="4.4"></a>
-
4.4 To convert an iterable object to an array, use spreads
...
instead ofArray.from
. -
4.4 繰り返し可能なオブジェクトを配列に変換する場合は
Array.from
の代わりにスプレッド構文...
を使用すること。const foo = document.querySelectorAll('.foo'); // good const nodes = Array.from(foo); // best const nodes = [...foo];
<a name="arrays--from-array-like"></a>
-
4.5 Use
Array.from
for converting an array-like object to an array. -
4.5 array-likeなオブジェクトを配列に変換する場合は
Array.from
を使用すること。const arrLike = { 0: 'foo', 1: 'bar', 2: 'baz', length: 3 }; // bad const arr = Array.prototype.slice.call(arrLike); // good const arr = Array.from(arrLike);
<a name="arrays--mapping"></a>
-
4.6 Use
Array.from
instead of spread...
for mapping over iterables, because it avoids creating an intermediate array. -
4.6 繰り返し可能なオブジェクト(iterables)へのマッピングにはスプレッド構文
...
の代わりにArray.from
を使用すること。理由は中間配列の作成を防ぐためです。// bad const baz = [...foo].map(bar); // good const baz = Array.from(foo, bar);
<a name="arrays--callback-return"></a><a name="4.5"></a>
-
4.7 Use return statements in array method callbacks. It’s ok to omit the return if the function body consists of a single statement returning an expression without side effects, following 8.2. eslint:
array-callback-return
-
4.7 配列のコールバック関数の中ではreturn構文を使用すること。もし関数の中が副作用のない式を返す一行で構成されている場合はreturnを省略してもかまいません。後述 8.2. eslint:
array-callback-return
// good [1, 2, 3].map((x) => { const y = x + 1; return x * y; }); // good [1, 2, 3].map(x => x + 1); // bad - no returned value means `acc` becomes undefined after the first iteration // bad - 値を返さないために`acc`は最初の繰り返しのあとでundefinedになります。 [[0, 1], [2, 3], [4, 5]].reduce((acc, item, index) => { const flatten = acc.concat(item); acc[index] = flatten; }); // good [[0, 1], [2, 3], [4, 5]].reduce((acc, item, index) => { const flatten = acc.concat(item); acc[index] = flatten; return flatten; }); // bad inbox.filter((msg) => { const { subject, author } = msg; if (subject === 'Mockingbird') { return author === 'Harper Lee'; } else { return false; } }); // good inbox.filter((msg) => { const { subject, author } = msg; if (subject === 'Mockingbird') { return author === 'Harper Lee'; } return false; });
<a name="arrays--bracket-newline"></a>
-
4.8 Use line breaks after open and before close array brackets if an array has multiple lines <a name="arrays--bracket-newline"></a>
-
4.8 配列が複数行ある場合、配列の開始の括弧の後と、最後の括弧の前に改行を入れること。
// bad const arr = [ [0, 1], [2, 3], [4, 5], ]; const objectInArray = [{ id: 1, }, { id: 2, }]; const numberInArray = [ 1, 2, ]; // good const arr = [[0, 1], [2, 3], [4, 5]]; const objectInArray = [ { id: 1, }, { id: 2, }, ]; const numberInArray = [ 1, 2, ];
Destructuring
<a name="destructuring--object"></a><a name="5.1"></a>
-
5.1 Use object destructuring when accessing and using multiple properties of an object. eslint:
prefer-destructuring
-
5.1 複数のプロパティからなるオブジェクトにアクセスする際は、オブジェクト構造化代入を使用すること。eslint:
prefer-destructuring
Why? Destructuring saves you from creating temporary references for those properties.
なぜ? 構造化代入を利用することで、それらのプロパティのための中間的な参照を減らすことができます。
// bad function getFullName(user) { const firstName = user.firstName; const lastName = user.lastName; return `${firstName} ${lastName}`; } // good function getFullName(obj) { const { firstName, lastName } = obj; return `${firstName} ${lastName}`; } // best function getFullName({ firstName, lastName }) { return `${firstName} ${lastName}`; }
<a name="destructuring--array"></a><a name="5.2"></a>
-
5.2 Use array destructuring. eslint:
prefer-destructuring
-
5.2 配列の構造化代入を使用すること。eslint:
prefer-destructuring
const arr = [1, 2, 3, 4]; // bad const first = arr[0]; const second = arr[1]; // good const [first, second] = arr;
<a name="destructuring--object-over-array"></a><a name="5.3"></a>
-
5.3 Use object destructuring for multiple return values, not array destructuring.
-
5.3 複数の値を返却する場合は、配列の構造化代入ではなく、オブジェクトの構造化代入を使用すること。
Why? You can add new properties over time or change the order of things without breaking call sites.
なぜ? こうすることで、後で新しいプロパティを追加したり、呼び出し元に影響することなく順序を変更することができます。
// bad function processInput(input) { // then a miracle occurs // その後、奇跡が起こります。 return [left, right, top, bottom]; } // the caller needs to think about the order of return data // 呼び出し者で返却されるデータの順番を考慮する必要があります。 const [left, __, top] = processInput(input); // good function processInput(input) { // then a miracle occurs // その後、奇跡が起こります。 return { left, right, top, bottom }; } // the caller selects only the data they need // 呼び出し元は必要なデータのみ選択すればいい。 const { left, top } = processInput(input);
Strings
<a name="strings--quotes"></a><a name="6.1"></a>
-
6.1 文字列にはシングルクオート
''
を使用すること。eslint:quotes
// bad const name = "Capt. Janeway"; // bad - template literals should contain interpolation or newlines const name = `Capt. Janeway`; // good const name = 'Capt. Janeway';
<a name="strings--line-length"></a><a name="6.2"></a>
-
6.2 Strings that cause the line to go over 100 characters should not be written across multiple lines using string concatenation.
-
6.2 100文字以上になるような文字列は、文字列連結を使用して複数行にまたがって記述しない。
Why? Broken strings are painful to work with and make code less searchable.
なぜ? 壊れた文字列は作業する上で辛すぎます、さらにコードの検索容易性を損ないます。
// bad const 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 const 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 const 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.';
<a name="es6-template-literals"></a><a name="6.4"></a>
-
6.3 When programmatically building up strings, use template strings instead of concatenation. eslint:
prefer-template
template-curly-spacing
-
6.3 プログラムで文字列を生成する場合は、文字列連結ではなく、template stringsを使用すること。eslint:
prefer-template
template-curly-spacing
Why? Template strings give you a readable, concise syntax with proper newlines and string interpolation features.
なぜ? Template strings は文字列補完機能・複数行文字列機能を持つ簡潔な構文で、可読性が良いからです。
// bad function sayHi(name) { return 'How are you, ' + name + '?'; } // bad function sayHi(name) { return ['How are you, ', name, '?'].join(); } // bad function sayHi(name) { return `How are you, ${ name }?`; } // good function sayHi(name) { return `How are you, ${name}?`; }
<a name="strings--eval"></a><a name="6.5"></a>
- 6.4 Never use
eval()
on a string, it opens too many vulnerabilities. eslint:no-eval
- 6.4 絶対に
eval()
を利用しない。これは、いままで数多くの脆弱性を作って来たからです。eslint:no-eval
<a name="strings--escaping"></a>
-
6.5 Do not unnecessarily escape characters in strings. eslint:
no-useless-escape
-
6.5 文字列の中で文字を不必要にエスケープしない。eslint:
no-useless-escape
Why? Backslashes harm readability, thus they should only be present when necessary.
なぜ? バックスラッシュは可読性を損なうため、必要なときにだけ存在させるべきです。
// bad const foo = '\'this\' \i\s \"quoted\"'; // good const foo = '\'this\' is "quoted"'; const foo = `my name is '${name}'`;
Functions
<a name="functions--declarations"></a><a name="7.1"></a>
-
7.1 Use named function expressions instead of function declarations. eslint:
func-style
-
7.1 関数宣言ではなく名前付き関数式を使用すること。eslint:
func-style
Why? Function declarations are hoisted, which means that it’s easy - too easy - to reference the function before it is defined in the file. This harms readability and maintainability. If you find that a function’s definition is large or complex enough that it is interfering with understanding the rest of the file, then perhaps it’s time to extract it to its own module! Don’t forget to explicitly name the expression, regardless of whether or not the name is inferred from the containing variable (which is often the case in modern browsers or when using compilers such as Babel). This eliminates any assumptions made about the Error’s call stack. (Discussion)
なぜ? 関数の定義は巻き上げられます。このことはそれがファイルの中で定義されている場所よりも前に簡単に - そうとても簡単に - 参照されることを意味します。それは読みやすさや保守性を損ないます。関数の定義がファイルの残りの部分を理解するのを妨げているくらい十分に大きいか複雑であることがわかった場合、おそらくそれをモジュールに展開する時が来たという事でしょう!名前が定義さてている変数から推測されるかどうかにかかわらず、式に明示的に名前を付けることを忘れないでください(モダンブラウザやBabelなどのコンパイラを使用している場合によくあります)。これにより、エラーの呼び出しスタックに関して行われた前提がなくなります。(ディスカッション)
// bad function foo() { // ... } // bad const foo = function () { // ... }; // good // lexical name distinguished from the variable-referenced invocation(s) const short = function longUniqueMoreDescriptiveLexicalFoo() { // ... };
<a name="functions--iife"></a><a name="7.2"></a>
-
7.2 Wrap immediately invoked function expressions in parentheses. eslint:
wrap-iife
-
7.2 即時呼び出し関数式(IIFE)を括弧で囲むこと。eslint:
wrap-iife
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.
なぜ? 即時関数式は単一の単位であり、その両方とその呼び出し括弧を括弧で囲んで明確に表します。注意:モジュールがある世界では、IIFEはほとんど必要ないことを留意してください。
// immediately-invoked function expression (IIFE) (function () { console.log('Welcome to the Internet. Please follow me.'); }());
<a name="functions--in-blocks"></a><a name="7.3"></a>
- 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
- 7.3 関数ではないブロック(
if
,while
, など)の中で関数を定義しない。代わりに変数に関数を割り当てること。ブラウザはそのことを許可しますが、(それはまるで「頑張れベアーズ」の悪ガキ達のように)すべて違ったように解釈されます。eslint:no-loop-func
<a name="functions--note-on-blocks"></a><a name="7.4"></a>
-
7.4 Note: ECMA-262 defines a
block
as a list of statements. A function declaration is not a statement. -
7.4 注意: ECMA-262仕様では
block
はstatementsの一覧に定義されていますが、関数宣言はstatementsではありません。// bad if (currentUser) { function test() { console.log('Nope.'); } } // good let test; if (currentUser) { test = () => { console.log('Yup.'); }; }
<a name="functions--arguments-shadow"></a><a name="7.5"></a>
-
7.5 Never name a parameter
arguments
. This will take precedence over thearguments
object that is given to every function scope. -
7.5 パラメータに
arguments
を指定しない。これは、関数スコープに渡されるarguments
オブジェクトの参照を上書きしてしまうためです。// bad function foo(name, options, arguments) { // ... } // good function foo(name, options, args) { // ... }
<a name="es6-rest"></a><a name="7.6"></a>
-
7.6 Never use
arguments
, opt to use rest syntax...
instead. eslint:prefer-rest-params
-
7.6
arguments
を利用しない。代わりにrest syntax...
を使用すること。eslint:prefer-rest-params
Why?
...
is explicit about which arguments you want pulled. Plus rest arguments are a real Array and not Array-like likearguments
.なぜ?
...
を利用することで、いつくかのパラメータを利用したいことを明らかにすることができます。加えてrestパラメータはarguments
の様なArray-likeなオブジェクトではなく正真正銘のArrayです。// bad function concatenateAll() { const args = Array.prototype.slice.call(arguments); return args.join(''); } // good function concatenateAll(...args) { return args.join(''); }
<a name="es6-default-parameters"></a><a name="7.7"></a>
-
7.7 Use default parameter syntax rather than mutating function arguments.
-
7.7 関数のパラメータを突然変異させるのではなく、デフォルトパラメータを使用すること。
// really bad function handleThings(opts) { // No! We shouldn't mutate function arguments. // Double bad: if opts is falsy it'll be set to an object which may // be what you want but it can introduce subtle bugs. // だめ!関数のパラメータを突然変異させるべきではありません。 // もし、optsがfalsyだった場合は、望んだようにオブジェクトが設定されます。 // しかし、微妙なバグを引き起こすかもしれません。 opts = opts || {}; // ... } // still bad function handleThings(opts) { if (opts === void 0) { opts = {}; } // ... } // good function handleThings(opts = {}) { // ... }
<a name="functions--default-side-effects"></a><a name="7.8"></a>
-
7.8 Avoid side effects with default parameters.
-
7.8 副作用のあるデフォルトパラメータの利用を避ける。
Why? They are confusing to reason about.
なぜ? 混乱させるからです。
var b = 1; // bad function count(a = b++) { console.log(a); } count(); // 1 count(); // 2 count(3); // 3 count(); // 3
<a name="functions--defaults-last"></a><a name="7.9"></a>
-
7.9 Always put default parameters last.
-
7.9 常にデフォルトパラメータは末尾に配置すること。
// bad function handleThings(opts = {}, name) { // ... } // good function handleThings(name, opts = {}) { // ... }
<a name="functions--constructor"></a><a name="7.10"></a>
-
7.10 Never use the Function constructor to create a new function. eslint:
no-new-func
-
7.10 新しい関数を作成するためにFunctionコンストラクタを使用しない。 eslint:
no-new-func
Why? Creating a function in this way evaluates a string similarly to eval(), which opens vulnerabilities.
なぜ? この方法で文字列を評価させて新しい関数を作成することは、eval()と同様の脆弱性を引き起こすことになります。
// bad var add = new Function('a', 'b', 'return a + b'); // still bad var subtract = Function('a', 'b', 'return a - b');
<a name="functions--signature-spacing"></a><a name="7.11"></a>
-
7.11 Spacing in a function signature. eslint:
space-before-function-paren
space-before-blocks
-
7.11 関数構文の中にスペースを入れること。eslint:
space-before-function-paren
space-before-blocks
Why? Consistency is good, and you shouldn’t have to add or remove a space when adding or removing a name.
なぜ? 一貫性は良い事であり、名前を追加または削除するときにスペースを追加または削除する必要はありません。
// bad const f = function(){}; const g = function (){}; const h = function() {}; // good const x = function () {}; const y = function a() {};
<a name="functions--mutate-params"></a><a name="7.12"></a>
-
7.12 Never mutate parameters. eslint:
no-param-reassign
-
7.12 パラメータを直接操作しないこと。eslint:
no-param-reassign
Why? Manipulating objects passed in as parameters can cause unwanted variable side effects in the original caller.
なぜ? パラメータに渡されたオブジェクトを操作することは、呼び出し元にて望まれない値の副作用を及ぼす可能性があります。
// bad function f1(obj) { obj.key = 1; } // good function f2(obj) { const key = Object.prototype.hasOwnProperty.call(obj, 'key') ? obj.key : 1; }
<a name="functions--reassign-params"></a><a name="7.13"></a>
-
7.13 Never reassign parameters. eslint:
no-param-reassign
-
7.13 パラメータを再割り当てしない。eslint:
no-param-reassign
Why? Reassigning parameters can lead to unexpected behavior, especially when accessing the
arguments
object. It can also cause optimization issues, especially in V8.なぜ? 特に
arguments
オブジェクトにアクセスするとき、パラメータを再割り当てすると予期しない動作をする可能性があります。 特にV8では最適化の問題も発生する可能性があります。// bad function f1(a) { a = 1; // ... } function f2(a) { if (!a) { a = 1; } // ... } // good function f3(a) { const b = a || 1; // ... } function f4(a = 1) { // ... }
<a name="functions--spread-vs-apply"></a><a name="7.14"></a>
-
7.14 Prefer the use of the spread operator
...
to call variadic functions. eslint:prefer-spread
-
7.14 可変引数の関数を呼び出す場合はスプレッド演算子
...
を使用すること。eslint:prefer-spread
Why? It’s cleaner, you don’t need to supply a context, and you can not easily compose
new
withapply
.なぜ? それは分かりやすいです。コンテキストを提供する必要はありませんし、そして簡単に
apply
でnew
を構成することはできません。// bad const x = [1, 2, 3, 4, 5]; console.log.apply(console, x); // good const x = [1, 2, 3, 4, 5]; console.log(...x); // bad new (Function.prototype.bind.apply(Date, [null, 2016, 8, 5])); // good new Date(...[2016, 8, 5]);
<a name="functions--signature-invocation-indentation"></a>
-
7.15 Functions with multiline signatures, or invocations, should be indented just like every other multiline list in this guide: with each item on a line by itself, with a trailing comma on the last item. eslint:
function-paren-newline
-
7.15 複数行の関数構文や呼び出しでは、このガイドの他のすべての複数行リストと同じようにインデントする必要があります。最後の項目に末尾のコンマを付けて、行の各項目を単独で指定すること。eslint:
function-paren-newline
// bad function foo(bar, baz, quux) { // ... } // good function foo( bar, baz, quux, ) { // ... } // bad console.log(foo, bar, baz); // good console.log( foo, bar, baz, );
アロー関数(Arrow Functions)
<a name="arrows--use-them"></a><a name="8.1"></a>
-
8.1 When you must use an anonymous function (as when passing an inline callback), use arrow function notation. eslint:
prefer-arrow-callback
,arrow-spacing
-
8.1(インラインコールバックを渡すときのように)無名関数を使用する必要がある場合は、アロー関数表記を使用してください。eslint:
prefer-arrow-callback
,arrow-spacing
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.なぜ? アロー関数はそのコンテキストの
this
で実行するバージョンの関数を作成します。これは通常期待通りの動作をし、より簡潔な構文だからです。Why not? If you have a fairly complicated function, you might move that logic out into its own function declaration.
利用するべきではない? 複雑な関数でロジックを定義した関数の外側に移動したいケース。
// bad [1, 2, 3].map(function (x) { const y = x + 1; return x * y; }); // good [1, 2, 3].map((x) => { const y = x + 1; return x * y; });
<a name="arrows--implicit-return"></a><a name="8.2"></a>
-
8.2 If the function body consists of a single statement returning an expression without side effects, omit the braces and use the implicit return. Otherwise, keep the braces and use a
return
statement. eslint:arrow-parens
,arrow-body-style
-
8.2 関数本体が副作用のない式を返す単一の文で構成されている場合は、中括弧を省略して暗黙の戻り値を使用すること。 そうでなければ、中括弧を付けて
return
文を使うこと。 eslint:arrow-parens
,arrow-body-style
Why? Syntactic sugar. It reads well when multiple functions are chained together.
なぜ? シンタックスシュガー(糖衣構文)。それは複数の関数が連結されている場合に読み易くなります。
// bad [1, 2, 3].map(number => { const nextNumber = number + 1; `A string containing the ${nextNumber}.`; }); // good [1, 2, 3].map(number => `A string containing the ${number}.`); // good [1, 2, 3].map((number) => { const nextNumber = number + 1; return `A string containing the ${nextNumber}.`; }); // good [1, 2, 3].map((number, index) => ({ [index]: number, })); // No implicit return with side effects function foo(callback) { const val = callback(); if (val === true) { // Do something if callback returns true } } let bool = false; // bad foo(() => bool = true); // good foo(() => { bool = true; });
-
8.3 <a name='8.3'></a> In case the expression spans over multiple lines, wrap it in parentheses for better readability.
-
8.3 <a name='8.3'></a> 式の全長が複数行にまたがる場合は、可読性をより良くするため丸括弧()で囲うこと。
Why? It shows clearly where the function starts and ends.
なぜ? 関数の開始と終了部分が分かりやすく見えるため。
// bad ['get', 'post', 'put'].map(httpMethod => Object.prototype.hasOwnProperty.call( httpMagicObjectWithAVeryLongName, httpMethod, ) ); // good ['get', 'post', 'put'].map(httpMethod => ( Object.prototype.hasOwnProperty.call( httpMagicObjectWithAVeryLongName, httpMethod, ) ));
<a name="arrows--one-arg-parens"></a><a name="8.4"></a>
-
8.4 If your function takes a single argument and doesn’t use braces, omit the parentheses. Otherwise, always include parentheses around arguments for clarity and consistency. Note: it is also acceptable to always use parentheses, in which case use the “always” option for eslint. eslint:
arrow-parens
-
8.4 関数が単一の引数を取り、中括弧を使用しない場合は、括弧を省略すること。 それ以外の場合は、明確さと一貫性を保つために、引数を常に括弧で囲むこと。 注意:常に括弧を使用することもできます。その場合は、eslintに"always"オプションを使用すること。eslint:
arrow-parens
Why? Less visual clutter.
なぜ? あまり見難くないからです。
// bad [1, 2, 3].map((x) => x * x); // good [1, 2, 3].map(x => x * x); // good [1, 2, 3].map(number => ( `A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!` )); // bad [1, 2, 3].map(x => { const y = x + 1; return x * y; }); // good [1, 2, 3].map((x) => { const y = x + 1; return x * y; });
<a name="arrows--confusing"></a><a name="8.5"></a>
- 8.5 Avoid confusing arrow function syntax (
=>
) with comparison operators (<=
,>=
). eslint:no-confusing-arrow
- 8.5 アロー関数の構文(
=>
)と比較演算子(<=
、>=
)を混同しない。eslint:no-confusing-arrow
// bad const itemHeight = item => item.height <= 256 ? item.largeSize : item.smallSize; // bad const itemHeight = (item) => item.height >= 256 ? item.largeSize : item.smallSize; // good const itemHeight = item => (item.height <= 256 ? item.largeSize : item.smallSize); // good const itemHeight = (item) => { const { height, largeSize, smallSize } = item; return height <= 256 ? largeSize : smallSize; };
<a name="whitespace--implicit-arrow-linebreak"></a>
-
8.6 Enforce the location of arrow function bodies with implicit returns. eslint:
implicit-arrow-linebreak
-
8.6 暗黙的な戻り値でアロー関数本体の位置を強制すること。eslint:
implicit-arrow-linebreak
// bad foo => bar; foo => (bar); // good foo => bar; foo => (bar); foo => ( bar )
Classes & Constructors
<a name="constructors--use-class"></a><a name="9.1"></a>
-
9.1 Always use
class
. Avoid manipulatingprototype
directly. -
9.1
prototype
を直接操作することを避け、常にclass
を使用すること。Why?
class
syntax is more concise and easier to reason about.なぜ?
class
構文は簡潔で意図がわかりやすいから。// bad function Queue(contents = []) { this.queue = [...contents]; } Queue.prototype.pop = function () { const value = this.queue[0]; this.queue.splice(0, 1); return value; }; // good class Queue { constructor(contents = []) { this.queue = [...contents]; } pop() { const value = this.queue[0]; this.queue.splice(0, 1); return value; } }
<a name="constructors--extends"></a><a name="9.2"></a>
-
9.2 Use
extends
for inheritance. -
9.2 継承には
extends
を使用すること。Why? It is a built-in way to inherit prototype functionality without breaking
instanceof
.なぜ? これは
instanceof
を破壊することなくプロトタイプ継承するためのビルトインされた方法です。// bad const inherits = require('inherits'); function PeekableQueue(contents) { Queue.apply(this, contents); } inherits(PeekableQueue, Queue); PeekableQueue.prototype.peek = function () { return this.queue[0]; }; // good class PeekableQueue extends Queue { peek() { return this.queue[0]; } }
<a name="constructors--chaining"></a><a name="9.3"></a>
-
9.3 Methods can return
this
to help with method chaining. -
9.3 メソッドの戻り値で
this
を返すことでメソッドチェーンを助けること。// bad Jedi.prototype.jump = function () { this.jumping = true; return true; }; Jedi.prototype.setHeight = function (height) { this.height = height; }; const luke = new Jedi(); luke.jump(); // => true luke.setHeight(20); // => undefined // good class Jedi { jump() { this.jumping = true; return this; } setHeight(height) { this.height = height; return this; } } const luke = new Jedi(); luke.jump() .setHeight(20);
<a name="constructors--tostring"></a><a name="9.4"></a>
-
9.4 It’s okay to write a custom
toString()
method, just make sure it works successfully and causes no side effects. -
9.4 独自の
toString()
を作成することも認めますが、正しく動作することと副作用がないことを確認すること。class Jedi { constructor(options = {}) { this.name = options.name || 'no name'; } getName() { return this.name; } toString() { return `Jedi - ${this.getName()}`; } }
<a name="constructors--no-useless"></a><a name="9.5"></a>
-
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. eslint:
no-useless-constructor
-
9.5 一つも指定されていない場合、クラスにはデフォルトのコンストラクタがあります。空のコンストラクタ関数やただ親クラスに移譲するだけのものは不要です。eslint:
no-useless-constructor
// bad class Jedi { constructor() {} getName() { return this.name; } } // bad class Rey extends Jedi { constructor(...args) { super(...args); } } // good class Rey extends Jedi { constructor(...args) { super(...args); this.name = 'Rey'; } }
<a name="classes--no-duplicate-members"></a>
-
9.6 Avoid duplicate class members. eslint:
no-dupe-class-members
-
9.6 クラスのメンバの重複を避ける。 eslint:
no-dupe-class-members
Why? Duplicate class member declarations will silently prefer the last one - having duplicates is almost certainly a bug.
なぜ? 重複したクラスメンバの宣言は暗黙的に最後のものが適用されます。 - 重複を持つことはほぼ確実にバグです。
// bad class Foo { bar() { return 1; } bar() { return 2; } } // good class Foo { bar() { return 1; } } // good class Foo { bar() { return 2; } }
Modules
<a name="modules--use-them"></a><a name="10.1"></a>
-
10.1 Always use modules (
import
/export
) over a non-standard module system. You can always transpile to your preferred module system. -
10.1 非標準モジュールシステム上では常にモジュール(
import
/export
)を使用すること。いつもあなたの好みのモジュールシステムにトランスパイルすることができます。Why? Modules are the future, let’s start using the future now.
なぜ? モジュールは未来です。今から未来を先取りして使い始めましょう。
// bad const AirbnbStyleGuide = require('./AirbnbStyleGuide'); module.exports = AirbnbStyleGuide.es6; // ok import AirbnbStyleGuide from './AirbnbStyleGuide'; export default AirbnbStyleGuide.es6; // best import { es6 } from './AirbnbStyleGuide'; export default es6;
<a name="modules--no-wildcard"></a><a name="10.2"></a>
-
10.2 Do not use wildcard imports.
-
10.2 ワイルドカードインポートは使用しない。
Why? This makes sure you have a single default export.
なぜ? default exportが一つであることを注意する必要があるからです。
// bad import * as AirbnbStyleGuide from './AirbnbStyleGuide'; // good import AirbnbStyleGuide from './AirbnbStyleGuide';
<a name="modules--no-export-from-import"></a><a name="10.3"></a>
-
10.3 And do not export directly from an import.
-
10.3 import文から直接exportしない。
Why? Although the one-liner is concise, having one clear way to import and one clear way to export makes things consistent.
なぜ? ワンライナーは簡潔ですが、インポートする1つの明確な方法とエクスポートする1つの明確な方法を持つことは物事を一貫性のあるものにします。
// bad // filename es6.js export { es6 as default } from './AirbnbStyleGuide'; // good // filename es6.js import { es6 } from './AirbnbStyleGuide'; export default es6;
<a name="modules--no-duplicate-imports"></a>
-
10.4 Only import from a path in one place. eslint:
no-duplicate-imports
-
10.4 パスからは一箇所のみでインポートすること。eslint:
no-duplicate-imports
Why? Having multiple lines that import from the same path can make code harder to maintain.
なぜ? 同じパスからインポートする複数の行があると、コードが保守しにくくなります。
// bad import foo from 'foo'; // … some other imports … // import { named1, named2 } from 'foo'; // good import foo, { named1, named2 } from 'foo'; // good import foo, { named1, named2, } from 'foo';
<a name="modules--no-mutable-exports"></a>
-
10.5 Do not export mutable bindings. eslint:
import/no-mutable-exports
-
10.5 可変のバインディングをエクスポートしない。eslint:
import/no-mutable-exports
Why? Mutation should be avoided in general, but in particular when exporting mutable bindings. While this technique may be needed for some special cases, in general, only constant references should be exported.
なぜ? 突然変異は一般的には避けるべきですが、特に可変のバインディングをエクスポートすることは避けてください。この手法はいくつかの特別な場合に必要になるかもしれませんが、一般的には定数参照だけをエクスポートするべきです。
// bad let foo = 3; export { foo }; // good const foo = 3; export { foo };
<a name="modules--prefer-default-export"></a>
-
10.6 In modules with a single export, prefer default export over named export. eslint:
import/prefer-default-export
-
10.6 単一のエクスポートを持つモジュールでは、名前付きエクスポートよりもデフォルトエクスポートすること。 eslint:
import/prefer-default-export
Why? To encourage more files that only ever export one thing, which is better for readability and maintainability.
なぜ? 1つだけをエクスポートするファイルを増やすことをお勧めします。これは、読みやすさと保守性の点で優れています。
// bad export function foo() {} // good export default function foo() {}
<a name="modules--imports-first"></a>
-
10.7 Put all
import
s above non-import statements. eslint:import/first
-
10.7 すべての
import
をimport文以外の上に置くこと。 eslint:import/first
Why? Since
import
s are hoisted, keeping them all at the top prevents surprising behavior.なぜ?
import
は巻き上げられているので、それらすべてを一番上にしておくことは驚くべき振る舞いが起こるのを防ぎます。// bad import foo from 'foo'; foo.init(); import bar from 'bar'; // good import foo from 'foo'; import bar from 'bar'; foo.init();
<a name="modules--multiline-imports-over-newlines"></a>
-
10.8 Multiline imports should be indented just like multiline array and object literals.
-
10.8 複数行のインポートは、複数行の配列リテラルおよびオブジェクトリテラルと同じようにインデントすること。
Why? The curly braces follow the same indentation rules as every other curly brace block in the style guide, as do the trailing commas.
なぜ? 中括弧は、末尾のコンマと同様に、スタイルガイド内の他のすべての中括弧ブロックと同じインデント規則に従います。
// bad import {longNameA, longNameB, longNameC, longNameD, longNameE} from 'path'; // good import { longNameA, longNameB, longNameC, longNameD, longNameE, } from 'path';
<a name="modules--no-webpack-loader-syntax"></a>
-
10.9 Disallow Webpack loader syntax in module import statements. eslint:
import/no-webpack-loader-syntax
-
10.9 モジュールのインポート文でWebpackローダーの構文を許可しない。 eslint:
import/no-webpack-loader-syntax
Why? Since using Webpack syntax in the imports couples the code to a module bundler. Prefer using the loader syntax in
webpack.config.js
.なぜ? インポートでWebpack構文を使用することは、コードをモジュールバンドラーに結び付けてしまいます。
webpack.config.js
の中でローダー構文を使うようにしてください。// bad import fooSass from 'css!sass!foo.scss'; import barCss from 'style!css!bar.css'; // good import fooSass from 'foo.scss'; import barCss from 'bar.css';
Iterators and Generators
<a name="iterators--nope"></a><a name="11.1"></a>
-
11.1 Don’t use iterators. Prefer JavaScript’s higher-order functions instead of loops like
for-in
orfor-of
. eslint:no-iterator
no-restricted-syntax
-
11.1 イテレータを使わない。
for-in
やfor-of
のようなループの代わりにJavaScriptの高階関数(higher-order functions)を使用すること。Why? This enforces our immutable rule. Dealing with pure functions that return values is easier to reason about than side effects.
なぜ? これは私たちの不変(immutable)のルールを強制します。値を返す純粋な関数を扱うことは、副作用よりも簡単に推論できます。
Use
map()
/every()
/filter()
/find()
/findIndex()
/reduce()
/some()
/ ... to iterate over arrays, andObject.keys()
/Object.values()
/Object.entries()
to produce arrays so you can iterate over objects.配列を反復処理するには
map()
/every()
/filter()
/find()
/findIndex()
/reduce()
/some()
/ ... を使用すること。そしてObject.keys()
/Object.values()
/Object.entries()
で配列を作成してオブジェクトを反復処理できるようにすること。const numbers = [1, 2, 3, 4, 5]; // bad let sum = 0; for (let num of numbers) { sum += num; } sum === 15; // good let sum = 0; numbers.forEach((num) => { sum += num; }); sum === 15; // best (use the functional force) const sum = numbers.reduce((total, num) => total + num, 0); sum === 15; // bad const increasedByOne = []; for (let i = 0; i < numbers.length; i++) { increasedByOne.push(numbers[i] + 1); } // good const increasedByOne = []; numbers.forEach((num) => { increasedByOne.push(num + 1); }); // best (keeping it functional) const increasedByOne = numbers.map(num => num + 1);
<a name="generators--nope"></a><a name="11.2"></a>
-
11.2 Don’t use generators for now.
-
11.2 今のところgeneratorsは使用しない。
Why? They don’t transpile well to ES5.
Why? ES5にうまくトランスパイルできないから。
<a name="generators--spacing"></a>
-
11.3 If you must use generators, or if you disregard our advice, make sure their function signature is spaced properly. eslint:
generator-star-spacing
-
11.3 ジェネレータを使用する必要がある場合、またわれわれのアドバイスを無視する場合は、それらの関数シグネチャが適切に配置されていることを確認すること。eslint:
generator-star-spacing
Why?
function
and*
are part of the same conceptual keyword -*
is not a modifier forfunction
,function*
is a unique construct, different fromfunction
.なぜ?
function
と*
は同じ概念的なキーワードの一部です -*
はfunction
の修飾子ではなく、function*
はfunction
とは異なるユニークな構成要素です。// bad function * foo() { // ... } // bad const bar = function * () { // ... }; // bad const baz = function *() { // ... }; // bad const quux = function*() { // ... }; // bad function*foo() { // ... } // bad function *foo() { // ... } // very bad function * foo() { // ... } // very bad const wat = function * () { // ... }; // good function* foo() { // ... } // good const foo = function* () { // ... };
Properties
<a name="properties--dot"></a><a name="12.1"></a>
-
12.1 Use dot notation when accessing properties. eslint:
dot-notation
-
12.1 プロパティにアクセスする場合はドット(
.
)を使用すること。eslint:dot-notation
const luke = { jedi: true, age: 28, }; // bad const isJedi = luke['jedi']; // good const isJedi = luke.jedi;
<a name="properties--bracket"></a><a name="12.2"></a>
-
12.2 Use bracket notation
[]
when accessing properties with a variable. -
12.2 変数を使用してプロパティにアクセスする場合は角括弧(
[]
)を使用すること。const luke = { jedi: true, age: 28, }; function getProp(prop) { return luke[prop]; } const isJedi = getProp('jedi');
<a name="es2016-properties--exponentiation-operator"></a>
-
12.3 Use exponentiation operator
**
when calculating exponentiations. eslint:no-restricted-properties
. -
12.3 べき乗を計算するときは、べき乗演算子
**
を使用すること。eslint: [no-restricted-properties
]// bad const binary = Math.pow(2, 10); // good const binary = 2 ** 10;
Variables
<a name="variables--const"></a><a name="13.1"></a>
-
13.1 Always use
const
orlet
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. eslint:no-undef
prefer-const
-
13.1 変数を宣言する際は、常に
const
かlet
を使用すること。使用しない場合はグローバル変数として宣言されてしまいます。グローバルな名前空間を汚染しないように、キャプテンプラネット(環境保護とエコロジーをテーマにしたスーパーヒーローアニメ)も警告しています。eslint:no-undef
prefer-const
// bad superPower = new SuperPower(); // good const superPower = new SuperPower();
<a name="variables--one-const"></a><a name="13.2"></a>
-
13.2 Use one
const
orlet
declaration per variable or assignment. eslint:one-var
-
13.2 1つの変数宣言に対して1つの
const
を利用すること。eslint:one-var
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.なぜ? この方法の場合、簡単に新しい変数を追加することができます。また、二度と区切り文字の違いによる
;
を,
に置き換える作業を心配することがありません。すべての宣言を一度にジャンプするのではなく、デバッガーを使用して各宣言をステップスルーすることもできます。// bad const items = getItems(), goSportsTeam = true, dragonball = 'z'; // bad // (compare to above, and try to spot the mistake) const items = getItems(), goSportsTeam = true; dragonball = 'z'; // good const items = getItems(); const goSportsTeam = true; const dragonball = 'z';
<a name="variables--const-let-group"></a><a name="13.3"></a>
-
13.3 Group all your
const
s and then group all yourlet
s. -
13.3 まず
const
をグループ化し、その後let
をグループ化すること。Why? This is helpful when later on you might need to assign a variable depending on one of the previous assigned variables.
なぜ? これは、以前に割り当てられた変数に後で変数を割り当てる必要がある場合に役立ちます。
// bad let i, len, dragonball, items = getItems(), goSportsTeam = true; // bad let i; const items = getItems(); let dragonball; const goSportsTeam = true; let len; // good const goSportsTeam = true; const items = getItems(); let dragonball; let i; let length;
<a name="variables--define-where-used"></a><a name="13.4"></a>
-
13.4 Assign variables where you need them, but place them in a reasonable place.
-
13.4 変数を割り当てる際は、必要かつ合理的な場所で行うこと。
Why?
let
andconst
are block scoped and not function scoped.なぜ?
let
とconst
はブロックスコープだからです。関数スコープではありません。// bad - unnecessary function call function checkName(hasName) { const name = getName(); if (hasName === 'test') { return false; } if (name === 'test') { this.setName(''); return false; } return name; } // good function checkName(hasName) { if (hasName === 'test') { return false; } const name = getName(); if (name === 'test') { this.setName(''); return false; } return name; }
<a name="variables--no-chain-assignment"></a><a name="13.5"></a>
-
13.5 Don’t chain variable assignments. eslint:
no-multi-assign
-
13.5 変数代入を連結しない。eslint:
no-multi-assign
Why? Chaining variable assignments creates implicit global variables.
なぜ? 変数代入を連鎖させると、暗黙のグローバル変数が作成されます。
// bad (function example() { // JavaScript interprets this as // let a = ( b = ( c = 1 ) ); // The let keyword only applies to variable a; variables b and c become // global variables. // JavaScriptはこれを次のように解釈します // let a = ( b = ( c = 1 ) ); // letキーワードは変数aにのみ適用されます。変数bとcはグローバル変数になります。 let a = b = c = 1; }()); console.log(a); // throws ReferenceError console.log(b); // 1 console.log(c); // 1 // good (function example() { let a = 1; let b = a; let c = a; }()); console.log(a); // throws ReferenceError console.log(b); // throws ReferenceError console.log(c); // throws ReferenceError // the same applies for `const`
<a name="variables--unary-increment-decrement"></a><a name="13.6"></a>
-
13.6 Avoid using unary increments and decrements (
++
,--
). eslintno-plusplus
-
13.6 インクリメント演算子(
++
)デクリメント演算子(--
)を使わない。eslintno-plusplus
Why? Per the eslint documentation, unary increment and decrement statements are subject to automatic semicolon insertion and can cause silent errors with incrementing or decrementing values within an application. It is also more expressive to mutate your values with statements like
num += 1
instead ofnum++
ornum ++
. Disallowing unary increment and decrement statements also prevents you from pre-incrementing/pre-decrementing values unintentionally which can also cause unexpected behavior in your programs.なぜ? eslintのドキュメントによると、インクリメントおよびデクリメント演算子は自動セミコロン挿入の対象となり、アプリケーション内で値の増加または減少を伴う予期せぬエラーを引き起こす可能性があります。
num++
やnum ++
の代わりにnum += 1
のような構文で値を変更する方が表現力豊かです。インクリメントおよびデクリメント演算子を許可しないことで、直前の意図しない値の増加または減少による、プログラムでの予期しない動作を引き起こす可能性を防ぐことができます。// bad const array = [1, 2, 3]; let num = 1; num++; --num; let sum = 0; let truthyCount = 0; for (let i = 0; i < array.length; i++) { let value = array[i]; sum += value; if (value) { truthyCount++; } } // good const array = [1, 2, 3]; let num = 1; num += 1; num -= 1; const sum = array.reduce((a, b) => a + b, 0); const truthyCount = array.filter(Boolean).length;
<a name="variables--linebreak"></a>
-
13.7 Avoid linebreaks before or after
=
in an assignment. If your assignment violatesmax-len
, surround the value in parens. eslintoperator-linebreak
. -
13.7 代入で
=
の前後に改行を入れない。あなたの代入がmax-len
に違反している場合は、値を丸括弧()で囲むこと。 eslintoperator-linebreak
Why? Linebreaks surrounding
=
can obfuscate the value of an assignment.なぜ?
=
を囲む改行は代入の値を読みにくくすることがあります。// bad const foo = superLongLongLongLongLongLongLongLongFunctionName(); // bad const foo = 'superLongLongLongLongLongLongLongLongString'; // good const foo = ( superLongLongLongLongLongLongLongLongFunctionName() ); // good const foo = 'superLongLongLongLongLongLongLongLongString';
<a name="variables--no-unused-vars"></a>
-
13.8 Disallow unused variables. eslint:
no-unused-vars
-
13.8 未使用の変数を許可しない。eslint:
no-unused-vars
Why? Variables that are declared and not used anywhere in the code are most likely an error due to incomplete refactoring. Such variables take up space in the code and can lead to confusion by readers.
なぜ? 宣言されていてコードのどこにも使用されていない変数は、不完全なリファクタリングによる失敗である可能性が最も高いです。このような変数はコード内のスペースを占有し、他の開発者にとって混乱を招く可能性があります。
// bad var some_unused_var = 42; // Write-only variables are not considered as used. // 書き込み専用変数は、使用されているとは見なされません。 var y = 10; y = 5; // A read for a modification of itself is not considered as used. // それ自体の変更のための読み取りは、使用済みとは見なされません。 var z = 0; z = z + 1; // Unused function arguments. // 未使用の関数の引数。 function getX(x, y) { return x; } // good function getXPlusY(x, y) { return x + y; } var x = 1; var y = a + 2; alert(getXPlusY(x, y)); // 'type' is ignored even if unused because it has a rest property sibling. // This is a form of extracting an object that omits the specified keys. // 残りのプロパティがあるため、'type' は未使用でも無視されます。 // これは、指定されたキーを省略したオブジェクトを抽出する形式です。 var { type, ...coords } = data; // 'coords' is now the 'data' object without its 'type' property. // 'coords'は、今や'type'プロパティを持たない'data'オブジェクトになりました。
Hoisting
<a name="hoisting--about"></a><a name="14.1"></a>
-
14.1
var
declarations get hoisted to the top of their closest enclosing function scope, their assignment does not.const
andlet
declarations are blessed with a new concept called Temporal Dead Zones (TDZ). It’s important to know why typeof is no longer safe. -
14.1
var
宣言は、それらに最も近い包含関数スコープの一番上に引き上げられますが、それらの代入は引き継がれません。const
とlet
の宣言はTemporal Dead Zones(TDZ)と呼ばれる新しい概念の恩恵を受けています。なぜtypeofが安全ではなくなったのかを知ることは重要です。// we know this wouldn't work (assuming there // is no notDefined global variable) // (notDefinedがグローバル変数に存在しないと仮定した場合。) // これはうまく動作しません。 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. // その変数を参照するコードの後でその変数を宣言した場合、 // 変数が巻上げられた上で動作します。 // 注意:`true` という値自体は巻き上げられません。 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() { let declaredButNotAssigned; console.log(declaredButNotAssigned); // => undefined declaredButNotAssigned = true; } // using const and let // const と let を利用した場合 function example() { console.log(declaredButNotAssigned); // => throws a ReferenceError console.log(typeof declaredButNotAssigned); // => throws a ReferenceError const declaredButNotAssigned = true; }
<a name="hoisting--anon-expressions"></a><a name="14.2"></a>
-
14.2 Anonymous function expressions hoist their variable name, but not the function assignment.
-
14.2 無名関数の場合、関数が割当てされる前の変数が巻き上げられます。
function example() { console.log(anonymous); // => undefined anonymous(); // => TypeError anonymous is not a function var anonymous = function() { console.log('anonymous function expression'); }; }
<a name="hoisting--named-expresions"></a><a name="hoisting--named-expressions"></a><a name="14.3"></a>
-
14.3 Named function expressions hoist the variable name, not the function name or the function body.
-
14.3 名前付き関数の場合も同様に変数が巻き上げられます。関数名や関数本体は巻き上げられません。
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'); } }
<a name="hoisting--declarations"></a><a name="14.4"></a>
-
14.4 Function declarations hoist their name and the function body.
-
14.4 関数宣言は関数名と関数本体が巻き上げられます。
function example() { superPower(); // => Flying function superPower() { console.log('Flying'); } }
-
For more information refer to JavaScript Scoping & Hoisting by Ben Cherry.
-
詳しくはこちらを参照してください。 JavaScript Scoping & Hoisting by Ben Cherry.
Comparison Operators & Equality
<a name="comparison--eqeqeq"></a><a name="15.1"></a>
<a name="comparison--if"></a><a name="15.2"></a>
-
15.2 Conditional statements such as the
if
statement evaluate their expression using coercion with theToBoolean
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
-
15.2
if
文のような条件式はToBoolean
メソッドによる強制型変換で評価され、常にこれらのシンプルなルールに従います。- オブジェクトはtrueと評価されます。
- undefinedはfalseと評価されます。
- nullはfalseと評価されます。
- 真偽値はboolean型の値として評価されます。
- 数値はtrueと評価されます。しかし、+0, -0, or NaNの場合は falseです。
- 文字列はtrueと評価されます。しかし、空文字
''
の場合はfalse です。
if ([0]) { // true // An array is an object, objects evaluate to true // 配列はオブジェクトなのでtrueとして評価されます。 }
<a name="comparison--shortcuts"></a><a name="15.3"></a>
-
15.3 Use shortcuts for booleans, but explicit comparisons for strings and numbers.
-
15.3 真偽値にはショートカットを使用しますが、文字列と数値には明示的な比較を使用すること。
// bad if (isValid === true) { // ... } // good if (isValid) { // ... } // bad if (name) { // ... } // good if (name !== '') { // ... } // bad if (collection.length) { // ... } // good if (collection.length > 0) { // ... }
<a name="comparison--moreinfo"></a><a name="15.4"></a>
- 15.4 For more information see Truth Equality and JavaScript by Angus Croll.
- 15.4 詳しくはこちらを参照してください。Truth Equality and JavaScript by Angus Croll.
<a name="comparison--switch-blocks"></a><a name="15.5"></a>
-
15.5 Use braces to create blocks in
case
anddefault
clauses that contain lexical declarations (e.g.let
,const
,function
, andclass
). eslint:no-case-declarations
-
15.5
case
とdefault
節でブロックを作成するには中括弧({}
)を使うこと。(例えばlet
、const
、function
、class
) eslint:no-case-declarations
Why? Lexical declarations are visible in the entire
switch
block but only get initialized when assigned, which only happens when itscase
is reached. This causes problems when multiplecase
clauses attempt to define the same thing.なぜ? レキシカル宣言は
switch
ブロック全体から参照することができますが、代入されたときにだけ初期化され、それはcase
に達したときにだけ起こります。複数のcase
節が同じものを定義しようとするとき、これは問題を引き起こします。// bad switch (foo) { case 1: let x = 1; break; case 2: const y = 2; break; case 3: function f() { // ... } break; default: class C {} } // good switch (foo) { case 1: { let x = 1; break; } case 2: { const y = 2; break; } case 3: { function f() { // ... } break; } case 4: bar(); break; default: { class C {} } }
<a name="comparison--nested-ternaries"></a><a name="15.6"></a>
-
15.6 Ternaries should not be nested and generally be single line expressions. eslint:
no-nested-ternary
-
15.6三項演算子は入れ子にするべきではなく、一般に単一行にします。eslint:
no-nested-ternary
// bad const foo = maybe1 > maybe2 ? "bar" : value1 > value2 ? "baz" : null; // split into 2 separated ternary expressions const maybeNull = value1 > value2 ? 'baz' : null; // better const foo = maybe1 > maybe2 ? 'bar' : maybeNull; // best const foo = maybe1 > maybe2 ? 'bar' : maybeNull;
<a name="comparison--unneeded-ternary"></a><a name="15.7"></a>
-
15.7 Avoid unneeded ternary statements. eslint:
no-unneeded-ternary
-
15.7 不要な3項ステートメントを避ける。eslint:
no-unneeded-ternary
// bad const foo = a ? a : b; const bar = c ? true : false; const baz = c ? false : true; // good const foo = a || b; const bar = !!c; const baz = !c;
<a name="comparison--no-mixed-operators"></a>
-
15.8 When mixing operators, enclose them in parentheses. The only exception is the standard arithmetic operators (
+
,-
,*
, &/
) since their precedence is broadly understood. eslint:no-mixed-operators
-
15.8 演算子を混在させる場合は、それらを括弧で囲むこと。唯一の例外は、標準の算術演算子(
+
、-
、*
、/
)です。それらの優先順位は広く理解されているからです。eslint:no-mixed-operators
Why? This improves readability and clarifies the developer’s intention.
なぜ? これにより読みやすさが向上し、開発者の意図が明確になります。
// bad const foo = a && b < 0 || c > 0 || d + 1 === 0; // bad const bar = a ** b - 5 % d; // bad // one may be confused into thinking (a || b) && c // (a || b) && c だと考えて混乱するかもしれません。 if (a || b && c) { return d; } // good const foo = (a && b < 0) || c > 0 || (d + 1 === 0); // good const bar = (a ** b) - (5 % d); // good if (a || (b && c)) { return d; } // good const bar = a + b / c * d;
Blocks
<a name="blocks--braces"></a><a name="16.1"></a>
-
16.1 Use braces with all multi-line blocks. eslint:
nonblock-statement-body-position
-
16.1 複数行のブロックには中括弧(
{}
)を使用すること。eslint:nonblock-statement-body-position
// bad if (test) return false; // good if (test) return false; // good if (test) { return false; } // bad function foo() { return false; } // good function bar() { return false; }
<a name="blocks--cuddled-elses"></a><a name="16.2"></a>
-
16.2 If you’re using multi-line blocks with
if
andelse
, putelse
on the same line as yourif
block’s closing brace. eslint:brace-style
-
16.2
if
とelse
を使った複数行のブロックの場合は、else
ブロックの閉じ括弧と同じ行にelse
を置くこと。eslint:brace-style
// bad if (test) { thing1(); thing2(); } else { thing3(); } // good if (test) { thing1(); thing2(); } else { thing3(); }
<a name="blocks--no-else-return"></a><a name="16.3"></a>
-
16.3 If an
if
block always executes areturn
statement, the subsequentelse
block is unnecessary. Areturn
in anelse if
block following anif
block that contains areturn
can be separated into multipleif
blocks. eslint:no-else-return
-
16.3
if
ブロックが常にreturn
文を実行するのであれば、それに続くelse
ブロックは不要です。return
を含むif
ブロックに続くelse if
ブロック内のreturn
は複数のif
ブロックに分けることができます。eslint:no-else-return
// bad function foo() { if (x) { return x; } else { return y; } } // bad function cats() { if (x) { return x; } else if (y) { return y; } } // bad function dogs() { if (x) { return x; } else { if (y) { return y; } } } // good function foo() { if (x) { return x; } return y; } // good function cats() { if (x) { return x; } if (y) { return y; } } // good function dogs(x) { if (x) { if (z) { return y; } } else { return z; } }
Control Statements
<a name="control-statements"></a>
-
17.1 In case your control statement (
if
,while
etc.) gets too long or exceeds the maximum line length, each (grouped) condition could be put into a new line. The logical operator should begin the line. <a name="control-statements"></a> -
17.1 制御文(
if
、while
など)が長くなり過ぎたり、最大行長を超えたりした場合、それぞれの(グループ化された)条件は新しい行に入れること。そして論理演算子で行を始めること。Why? Requiring operators at the beginning of the line keeps the operators aligned and follows a pattern similar to method chaining. This also improves readability by making it easier to visually follow complex logic.
なぜ? 行の先頭で演算子を要求すると、演算子は整列されたままになり、メソッド連結と同様のパターンに従います。これにより、複雑なロジックを視覚的に理解しやすくなるため、読みやすくなります。
// bad if ((foo === 123 || bar === 'abc') && doesItLookGoodWhenItBecomesThatLong() && isThisReallyHappening()) { thing1(); } // bad if (foo === 123 && bar === 'abc') { thing1(); } // bad if (foo === 123 && bar === 'abc') { thing1(); } // bad if ( foo === 123 && bar === 'abc' ) { thing1(); } // good if ( foo === 123 && bar === 'abc' ) { thing1(); } // good if ( (foo === 123 || bar === 'abc') && doesItLookGoodWhenItBecomesThatLong() && isThisReallyHappening() ) { thing1(); } // good if (foo === 123 && bar === 'abc') { thing1(); }
<a name="control-statement--value-selection"></a><a name="control-statements--value-selection"></a>
-
17.2 Don't use selection operators in place of control statements.
-
17.2 後続処理を選択するための演算子を制御文の代わりに使用しない。
// bad !isRunning && startRunning(); // good if (!isRunning) { startRunning(); }
Comments
<a name="comments--multiline"></a><a name="17.1"></a>
-
18.1 Use
/** ... */
for multi-line comments. -
18.1 複数行のコメントには
/ ** ... * /
を使用すること。// 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; }
<a name="comments--singleline"></a><a name="17.2"></a>
-
18.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. -
18.2 単一行コメントには
//
を使用すること。コメントを加えたいコードの上部に配置すること。また、コメントの前に空行を入ること。// bad const active = true; // is current tab // good // is current tab const active = true; // bad function getType() { console.log('fetching type...'); // set the default type to 'no type' const type = this._type || 'no type'; return type; } // good function getType() { console.log('fetching type...'); // set the default type to 'no type' const type = this._type || 'no type'; return type; } // also good function getType() { // set the default type to 'no type' const type = this._type || 'no type'; return type; }
<a name="comments--spaces"></a>
-
18.3 Start all comments with a space to make it easier to read. eslint:
spaced-comment
-
18.3 読みやすくするために、すべてのコメントをスペースで始めること。eslint:
spaced-comment
// bad //is current tab const active = true; // good // is current tab const active = true; // bad /** *make() returns a new element *based on the passed-in tag name */ function make(tag) { // ... return element; } // good /** * make() returns a new element * based on the passed-in tag name */ function make(tag) { // ... return element; }
<a name="comments--actionitems"></a><a name="17.3"></a>
- 18.4 Prefixing your comments with
FIXME
orTODO
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 areFIXME: -- need to figure this out
orTODO: -- need to implement
. - 18.4 問題を指摘して再考を促す場合や、問題の解決策を提案する場合など、コメントの前に
FIXME
やTODO
を付けることで他の開発者の素早い理解を助けることができます。これらは、何らかのアクションを伴うという意味で通常のコメントとは異なります。アクションとはFIXME -- 解決策が必要
もしくはTODO -- 実装が必要
です。
<a name="comments--fixme"></a><a name="17.4"></a>
-
18.5 Use
// FIXME:
to annotate problems. -
18.5 問題に対する注釈として
// FIXME:
を使用すること。class Calculator extends Abacus { constructor() { super(); // FIXME: shouldn't use a global here // FIXME: グローバル変数を使用するべきではない。 total = 0; } }
<a name="comments--todo"></a><a name="17.5"></a>
-
18.6 Use
// TODO:
to annotate solutions to problems. -
18.6 問題の解決策に対する注釈として
// TODO:
を使用すること。class Calculator extends Abacus { constructor() { super(); // TODO: total should be configurable by an options param // TODO: total はオプションパラメータとして設定されるべき。 this.total = 0; } }
Whitespace
<a name="whitespace--spaces"></a><a name="18.1"></a>
-
19.1 Use soft tabs (space character) set to 2 spaces. eslint:
indent
-
19.1 2スペースに設定されたソフトタブ(スペース文字)を使用すること。eslint:
indent
// bad function() { ∙∙∙∙const name; } // bad function() { ∙const name; } // good function() { ∙∙const name; }
<a name="whitespace--before-blocks"></a><a name="18.2"></a>
-
19.2 Place 1 space before the leading brace. eslint:
space-before-blocks
-
19.2 重要な中括弧(
{}
)の前にはスペースを1つ入れること。eslint:space-before-blocks
// 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', });
<a name="whitespace--around-keywords"></a><a name="18.3"></a>
-
19.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:keyword-spacing
-
19.3 制御構文(
if
文やwhile
文など)の丸括弧(()
)の前にはスペースを1つ入れること。関数宣言や関数呼び出し時の引数リストの前にはスペースは入れない。eslint:keyword-spacing
// bad if(isJedi) { fight (); } // good if (isJedi) { fight(); } // bad function fight () { console.log ('Swooosh!'); } // good function fight() { console.log('Swooosh!'); }
<a name="whitespace--infix-ops"></a><a name="18.4"></a>
-
19.4 Set off operators with spaces. eslint:
space-infix-ops
-
19.4 演算子の間はスペースを入れること。eslint:
space-infix-ops
// bad const x=y+5; // good const x = y + 5;
<a name="whitespace--newline-at-end"></a><a name="18.5"></a>
-
19.5 End files with a single newline character. eslint:
eol-last
-
19.5 ファイルの最後は改行文字を1つ入れること。eslint:
eol-last
// bad import { es6 } from './AirbnbStyleGuide'; // ... export default es6;
// bad import { es6 } from './AirbnbStyleGuide'; // ... export default es6;↵ ↵
// good import { es6 } from './AirbnbStyleGuide'; // ... export default es6;↵
<a name="whitespace--chains"></a><a name="18.6"></a>
-
19.6 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
no-whitespace-before-property
-
19.6 長くメソッドを連結する場合はインデントを使用すること。行がメソッド呼び出しではなく、新しい文であることを強調するために先頭にドット(.)を配置すること。eslint:
newline-per-chained-call
no-whitespace-before-property
// 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 const 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 const 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 const leds = stage.selectAll('.led').data(data);
<a name="whitespace--after-blocks"></a><a name="18.7"></a>
-
19.7 Leave a blank line after blocks and before the next statement.
-
19.7 文の前とブロックの後には改行を残すこと。
// bad if (foo) { return bar; } return baz; // good if (foo) { return bar; } return baz; // bad const obj = { foo() { }, bar() { }, }; return obj; // good const obj = { foo() { }, bar() { }, }; return obj; // bad const arr = [ function foo() { }, function bar() { }, ]; return arr; // good const arr = [ function foo() { }, function bar() { }, ]; return arr;
<a name="whitespace--padded-blocks"></a><a name="18.8"></a>
-
19.8 Do not pad your blocks with blank lines. eslint:
padded-blocks
-
19.8 ブロックに空行を挟み込まない。eslint:
padded-blocks
// bad function bar() { console.log(foo); } // also bad if (baz) { console.log(qux); } else { console.log(foo); } // good function bar() { console.log(foo); } // good if (baz) { console.log(qux); } else { console.log(foo); }
<a name="whitespace--in-parens"></a><a name="18.9"></a>
-
19.9 Do not add spaces inside parentheses. eslint:
space-in-parens
-
19.9 丸括弧(
()
)の内側にスペースを追加しない。// bad function bar( foo ) { return foo; } // good function bar(foo) { return foo; } // bad if ( foo ) { console.log(foo); } // good if (foo) { console.log(foo); }
<a name="whitespace--in-brackets"></a><a name="18.10"></a>
-
19.10 Do not add spaces inside brackets. eslint:
array-bracket-spacing
-
19.10 角括弧(
[]
)の内側にスペースを追加しない。eslint:array-bracket-spacing
// bad const foo = [ 1, 2, 3 ]; console.log(foo[ 0 ]); // good const foo = [1, 2, 3]; console.log(foo[0]);
<a name="whitespace--in-braces"></a><a name="18.11"></a>
-
19.11 Add spaces inside curly braces. eslint:
object-curly-spacing
-
19.11 中括弧(
{}
)の内側にスペースを追加すること。eslint:object-curly-spacing
// bad const foo = {clark: 'kent'}; // good const foo = { clark: 'kent' };
<a name="whitespace--max-len"></a><a name="18.12"></a>
-
19.12 Avoid having lines of code that are longer than 100 characters (including whitespace). Note: per above, long strings are exempt from this rule, and should not be broken up. eslint:
max-len
-
19.12 100文字を超えるコード行(空白を含む)を避ける。注:上記のとおり、長い文字列はこの規則から除外されており、分割しない。eslint:
max-len
Why? This ensures readability and maintainability.
なぜ? これは読みやすさと保守性を保証します。
// bad const foo = jsonData && jsonData.foo && jsonData.foo.bar && jsonData.foo.bar.baz && jsonData.foo.bar.baz.quux && jsonData.foo.bar.baz.quux.xyzzy; // bad $.ajax({ method: 'POST', url: 'https://airbnb.com/', data: { name: 'John' } }).done(() => console.log('Congratulations!')).fail(() => console.log('You have failed this city.')); // good const foo = jsonData && jsonData.foo && jsonData.foo.bar && jsonData.foo.bar.baz && jsonData.foo.bar.baz.quux && jsonData.foo.bar.baz.quux.xyzzy; // good $.ajax({ method: 'POST', url: 'https://airbnb.com/', data: { name: 'John' }, }) .done(() => console.log('Congratulations!')) .fail(() => console.log('You have failed this city.'));
<a name="whitespace--block-spacing"></a>
-
19.13 Require consistent spacing inside an open block token and the next token on the same line. This rule also enforces consistent spacing inside a close block token and previous token on the same line. eslint:
block-spacing
-
19.13 開いている中括弧(
{
)と同じ行の次の中括弧(}
)の間に一定のスペースを空けること。この規則は、同じ行の閉じ中括弧(}
)と前の中括弧({
)との間に一貫性のあるスペースを適用します。eslint:block-spacing
// bad function foo() {return true;} if (foo) { bar = 0;} // good function foo() { return true; } if (foo) { bar = 0; }
<a name="whitespace--comma-spacing"></a>
-
19.14 Avoid spaces before commas and require a space after commas. eslint:
comma-spacing
-
19.14 コンマの前にスペースを入れず、コンマの後にスペースを入れること。eslint:
comma-spacing
// bad var foo = 1,bar = 2; var arr = [1 , 2]; // good var foo = 1, bar = 2; var arr = [1, 2];
<a name="whitespace--computed-property-spacing"></a>
-
19.15 Enforce spacing inside of computed property brackets. eslint:
computed-property-spacing
-
19.15 計算プロパティの括弧の中にスペースは入れないこと。eslint:
computed-property-spacing
// bad obj[foo ] obj[ 'foo'] var x = {[ b ]: a} obj[foo[ bar ]] // good obj[foo] obj['foo'] var x = { [b]: a } obj[foo[bar]]
<a name="whitespace--func-call-spacing"></a>
-
19.16 Avoid spaces between functions and their invocations. eslint:
func-call-spacing
-
19.16 関数とその呼び出しの間にスペースを入れない。eslint:
func-call-spacing
// bad func (); func (); // good func();
<a name="whitespace--key-spacing"></a>
-
19.17 Enforce spacing between keys and values in object literal properties. eslint:
key-spacing
-
19.17 オブジェクトリテラルプロパティのキーと値の間のスペースを入れること。eslint:
key-spacing
// bad var obj = { "foo" : 42 }; var obj2 = { "foo":42 }; // good var obj = { "foo": 42 };
<a name="whitespace--no-trailing-spaces"></a>
- 19.18 Avoid trailing spaces at the end of lines. eslint:
no-trailing-spaces
- 19.18 行末に末尾のスペースを入れない。eslint:
no-trailing-spaces
<a name="whitespace--no-multiple-empty-lines"></a>
-
19.19 Avoid multiple empty lines and only allow one newline at the end of files. eslint:
no-multiple-empty-lines
-
19.19 複数の空行を避け、ファイルの終わりには改行を1つだけ入れること。eslint:
<!-- markdownlint-disable MD012 -->no-multiple-empty-lines
<!-- markdownlint-enable MD012 -->// bad var x = 1; var y = 2; // good var x = 1; var y = 2;
Commas
<a name="commas--leading-trailing"></a><a name="19.1"></a>
-
20.1 Leading commas: Nope. eslint:
comma-style
-
20.1 先頭のカンマは禁止。eslint:
comma-style
// bad const story = [ once , upon , aTime ]; // good const story = [ once, upon, aTime, ]; // bad const hero = { firstName: 'Ada' , lastName: 'Lovelace' , birthYear: 1815 , superPower: 'computers' }; // good const hero = { firstName: 'Ada', lastName: 'Lovelace', birthYear: 1815, superPower: 'computers', };
<a name="commas--dangling"></a><a name="19.2"></a>
-
20.2 Additional trailing comma: Yup. eslint:
comma-dangle
-
20.2 末尾のカンマ いいね:)。eslint:
comma-dangle
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 in legacy browsers.
なぜ? これはよりきれいなgit diffにつながります。また、Babelのようなトランスパイラーは、トランスコードされたコード内の追加の末尾のコンマを削除します。つまり、古いブラウザの末尾のコンマの問題を心配する必要はありません。
// bad - git diff without trailing comma const hero = { firstName: 'Florence', - lastName: 'Nightingale' + lastName: 'Nightingale', + inventorOf: ['coxcomb chart', 'modern nursing'] }; // good - git diff with trailing comma const hero = { firstName: 'Florence', lastName: 'Nightingale', + inventorOf: ['coxcomb chart', 'modern nursing'], };
// bad const hero = { firstName: 'Dana', lastName: 'Scully' }; const heroes = [ 'Batman', 'Superman' ]; // good const hero = { firstName: 'Dana', lastName: 'Scully', }; const heroes = [ 'Batman', 'Superman', ]; // bad function createHero( firstName, lastName, inventorOf ) { // does nothing } // good function createHero( firstName, lastName, inventorOf, ) { // does nothing } // good (note that a comma must not appear after a "rest" element) function createHero( firstName, lastName, inventorOf, ...heroArgs ) { // does nothing } // bad createHero( firstName, lastName, inventorOf ); // good createHero( firstName, lastName, inventorOf, ); // good (note that a comma must not appear after a "rest" element) createHero( firstName, lastName, inventorOf, ...heroArgs );
Semicolons
<a name="semicolons--required"></a><a name="20.1"></a>
-
Why? When JavaScript encounters a line break without a semicolon, it uses a set of rules called Automatic Semicolon Insertion to determine whether or not it should regard that line break as the end of a statement, and (as the name implies) place a semicolon into your code before the line break if it thinks so. ASI contains a few eccentric behaviors, though, and your code will break if JavaScript misinterprets your line break. These rules will become more complicated as new features become a part of JavaScript. Explicitly terminating your statements and configuring your linter to catch missing semicolons will help prevent you from encountering issues.
なぜ? JavaScriptはセミコロンなしで改行を検出すると、自動セミコロン挿入(Automatic Semicolon Insertion)と呼ばれる一連の規則を使用して、その改行をステートメントの終わりと見なし、(名前が示すとおり)改行の前にセミコロンを入れなければその行が壊れると考えた場所に、セミコロンを配置するかどうかを決定します。ただし、ASIにはいくつかの風変わりな動作が含まれており、JavaScriptが改行を誤って解釈した場合、コードは壊れます。新機能がJavaScriptの一部になるにつれて、これらのルールはより複雑になります。ステートメントを明示的に終了し、不足しているセミコロンを検知するようにリンターを構成すると、問題に遭遇するのを防ぐのに役立ちます。
// bad - raises exception const luke = {} const leia = {} [luke, leia].forEach(jedi => jedi.father = 'vader') // bad - raises exception const reaction = "No! That’s impossible!" (async function meanwhileOnTheFalcon() { // handle `leia`, `lando`, `chewie`, `r2`, `c3p0` // ... }()) // bad - returns `undefined` instead of the value on the next line - always happens when `return` is on a line by itself because of ASI! // 次の行の値の代わりに`undefined`を返します - ASIであるがため、`return`が単独で行にあるときは必ずこれは起こります! function foo() { return 'search your feelings, you know it to be foo' } // good const luke = {}; const leia = {}; [luke, leia].forEach((jedi) => { jedi.father = 'vader'; }); // good const reaction = "No! That’s impossible!"; (async function meanwhileOnTheFalcon() { // handle `leia`, `lando`, `chewie`, `r2`, `c3p0` // ... }()); // good function foo() { return 'search your feelings, you know it to be foo'; }
Type Casting & Coercion
<a name="coercion--explicit"></a><a name="21.1"></a>
<a name="coercion--strings"></a><a name="21.2"></a>
-
22.2 Strings: eslint:
no-new-wrappers
-
22.2 文字列の場合: eslint:
no-new-wrappers
// => this.reviewScore = 9; // bad const totalScore = new String(this.reviewScore); // typeof totalScore is "object" not "string" // bad const totalScore = this.reviewScore + ''; // invokes this.reviewScore.valueOf() // bad const totalScore = this.reviewScore.toString(); // isn’t guaranteed to return a string // good const totalScore = String(this.reviewScore);
<a name="coercion--numbers"></a><a name="21.3"></a>
-
22.3 Numbers: Use
Number
for type casting andparseInt
always with a radix for parsing strings. eslint:radix
no-new-wrappers
-
22.3 数値の場合: 型変換には
Number
を使用すること。parseInt
を使用する場合、常に型変換のための基数を引数に渡すこと。eslint:radix
no-new-wrappers
const inputValue = '4'; // bad const val = new Number(inputValue); // bad const val = +inputValue; // bad const val = inputValue >> 0; // bad const val = parseInt(inputValue); // good const val = Number(inputValue); // good const val = parseInt(inputValue, 10);
<a name="coercion--comment-deviations"></a><a name="21.4"></a>
-
22.4 If for whatever reason you are doing something wild and
parseInt
is your bottleneck and need to use Bitshift for performance reasons, leave a comment explaining why and what you’re doing. -
何らかの理由であなたがワイルドなことをしていて、
parseInt
がボトルネックであり、パフォーマンス上の理由からBitshiftを使用する必要がある場合は、その理由(why)と対処方法(what)を説明するコメントを残してください。// good /** * parseInt was the reason my code was slow. * Bitshifting the String to coerce it to a * Number made it a lot faster. * parseIntがボトルネックとなっていたため、 * ビットシフトで文字列を数値へ強制的に変換することで * パフォーマンスを改善させます。 */ const val = inputValue >> 0;
<a name="coercion--bitwise"></a><a name="21.5"></a>
-
22.5 Note: Be careful when using bitshift operations. Numbers are represented as 64-bit values, but bitshift operations always return a 32-bit integer (source). Bitshift can lead to unexpected behavior for integer values larger than 32 bits. Discussion. Largest signed 32-bit Int is 2,147,483,647:
-
22.5 注意 ビットシフト操作を使用するときは注意してください。数値は64ビット値として表されますが、ビットシフト操作は常に32ビット整数を返します。ここから。ビットシフトは、32ビットを超える整数値に対して予期しない動作を引き起こす可能性があります。ディスカッション。符号付き32ビット整数の最大値は2,147,483,647です。
2147483647 >> 0 //=> 2147483647 2147483648 >> 0 //=> -2147483648 2147483649 >> 0 //=> -2147483647
<a name="coercion--booleans"></a><a name="21.6"></a>
-
22.6 Booleans: eslint:
no-new-wrappers
-
22.6 真偽値の場合: eslint:
no-new-wrappers
const age = 0; // bad const hasAge = new Boolean(age); // good const hasAge = Boolean(age); // good const hasAge = !!age;
Naming Conventions
<a name="naming--descriptive"></a><a name="22.1"></a>
-
23.1 Avoid single letter names. Be descriptive with your naming. eslint:
id-length
-
23.1 1文字の名前は避ける。名前から意図が読み取れるようにすること。eslint:
id-length
// bad function q() { // ... } // good function query() { // ... }
<a name="naming--camelCase"></a><a name="22.2"></a>
-
23.2 Use camelCase when naming objects, functions, and instances. eslint:
camelcase
-
23.2 オブジェクト、関数、インスタンスにはキャメルケース(小文字から始まる)を使用すること。eslint:
camelcase
// bad const OBJEcttsssss = {}; const this_is_my_object = {}; function c() {} // good const thisIsMyObject = {}; function thisIsMyFunction() {}
<a name="naming--PascalCase"></a><a name="22.3"></a>
-
23.3 Use PascalCase only when naming constructors or classes. eslint:
new-cap
-
23.3 クラスやコンストラクタにはパスカルケース(大文字から始まる)を使用すること。eslint:
new-cap
// bad function user(options) { this.name = options.name; } const bad = new user({ name: 'nope', }); // good class User { constructor(options) { this.name = options.name; } } const good = new User({ name: 'yup', });
<a name="naming--leading-underscore"></a><a name="22.4"></a>
-
23.4 Do not use trailing or leading underscores. eslint:
no-underscore-dangle
-
23.4 末尾または先頭のアンダースコアを避ける。eslint:
no-underscore-dangle
Why? JavaScript does not have the concept of privacy in terms of properties or methods. Although a leading underscore is a common convention to mean “private”, in fact, these properties are fully public, and as such, are part of your public API contract. This convention might lead developers to wrongly think that a change won’t count as breaking, or that tests aren’t needed. tl;dr: if you want something to be “private”, it must not be observably present.
なぜ? JavaScriptは、プロパティやメソッドについてのプライバシーの概念を持っていません。先頭のアンダースコアは「非公開」を意味する一般的な規則ですが、実際にはこれらのプロパティは完全に公開されているため公開APIの一部です。この規約により、開発者は変更が壊れているとは見なされない、またはテストが必要ではないと誤って考える可能性があります。tl;dr: あなたが何かを「非公開」にしたいのであれば、それは明らかに存在してはいけません。
// bad this.__firstName__ = 'Panda'; this.firstName_ = 'Panda'; this._firstName = 'Panda'; // good this.firstName = 'Panda'; // good, in environments where WeakMaps are available // see https://kangax.github.io/compat-table/es6/#test-WeakMap const firstNames = new WeakMap(); firstNames.set(this, 'Panda');
<a name="naming--self-this"></a><a name="22.5"></a>
-
23.5 Don’t save references to
this
. Use arrow functions or Function#bind. -
23.5
this
の参照を保存するのを避ける。アロー関数かFunction#bindを利用すること。// bad function foo() { const self = this; return function () { console.log(self); }; } // bad function foo() { const that = this; return function () { console.log(that); }; } // good function foo() { return () => { console.log(this); }; }
<a name="naming--filename-matches-export"></a><a name="22.6"></a>
-
23.6 A base filename should exactly match the name of its default export.
-
23.6 ファイルを1つのクラスとしてexportする場合、ファイル名はクラス名と完全に一致させること。
// file 1 contents class CheckBox { // ... } export default CheckBox; // file 2 contents export default function fortyTwo() { return 42; } // file 3 contents export default function insideDirectory() {} // in some other file // bad import CheckBox from './checkBox'; // PascalCase import/export, camelCase filename import FortyTwo from './FortyTwo'; // PascalCase import/filename, camelCase export import InsideDirectory from './InsideDirectory'; // PascalCase import/filename, camelCase export // bad import CheckBox from './check_box'; // PascalCase import/export, snake_case filename import forty_two from './forty_two'; // snake_case import/filename, camelCase export import inside_directory from './inside_directory'; // snake_case import, camelCase export import index from './inside_directory/index'; // requiring the index file explicitly import insideDirectory from './insideDirectory/index'; // requiring the index file explicitly // good import CheckBox from './CheckBox'; // PascalCase export/import/filename import fortyTwo from './fortyTwo'; // camelCase export/import/filename import insideDirectory from './insideDirectory'; // camelCase export/import/directory name/implicit "index" // ^ supports both insideDirectory.js and insideDirectory/index.js
<a name="naming--camelCase-default-export"></a><a name="22.7"></a>
-
23.7 Use camelCase when you export-default a function. Your filename should be identical to your function’s name.
-
23.7 Default exportが関数の場合、キャメルケース(小文字から始まる)を使用すること。ファイル名は関数名と同じにすること。
function makeStyleGuide() { } export default makeStyleGuide;
<a name="naming--PascalCase-singleton"></a><a name="22.8"></a>
-
23.8 Use PascalCase when you export a constructor / class / singleton / function library / bare object.
-
23.8 シングルトン / function library / 単なるオブジェクトをexportする場合、パスカルケース(大文字から始まる)を使用すること。
const AirbnbStyleGuide = { es6: { } }; export default AirbnbStyleGuide;
<a name="naming--Acronyms-and-Initialisms"></a>
-
23.9 Acronyms and initialisms should always be all uppercased, or all lowercased.
-
23.9 略語およびinitialisms(複数の単語で構成される言葉の頭文字をとって一つの単語にしたもの)は、常にすべて大文字、またはすべて小文字にする必要があります。
Why? Names are for readability, not to appease a computer algorithm.
なぜ? 名前は読みやすくするためのもので、コンピュータのアルゴリズムをなだめるものではありません。
// bad import SmsContainer from './containers/SmsContainer'; // bad const HttpRequests = [ // ... ]; // good import SMSContainer from './containers/SMSContainer'; // good const HTTPRequests = [ // ... ]; // also good const httpRequests = [ // ... ]; // best import TextMessageContainer from './containers/TextMessageContainer'; // best const requests = [ // ... ];
<a name="naming--uppercase"></a>
-
23.10 You may optionally uppercase a constant only if it (1) is exported, (2) is a
const
(it can not be reassigned), and (3) the programmer can trust it (and its nested properties) to never change. -
23.10 (1)エクスポートされ、(2)
const
(再割り当てできない)であり、そして(3)プログラマがそれを(そしてネストされたプロパティも)変更しないと信頼できる場合に限り、定数を大文字にすることができます。Why? This is an additional tool to assist in situations where the programmer would be unsure if a variable might ever change. UPPERCASE_VARIABLES are letting the programmer know that they can trust the variable (and its properties) not to change.
-
What about all
const
variables? - This is unnecessary, so uppercasing should not be used for constants within a file. It should be used for exported constants however. -
What about exported objects? - Uppercase at the top level of export (e.g.
EXPORTED_OBJECT.key
) and maintain that all nested properties do not change.
なぜ? これは、変数が変更される可能性があるかどうかをプログラマが確信が持てないような状況で役立つ追加ツールです。UPPERCASE_VARIABLESは、変数(およびそのプロパティ)が変更されないように信頼できることをプログラマに知らせています。
- すべての
const
変数はどうですか? - これは不要です。ファイル内の定数には大文字を使用しないでください。ただしエクスポートされた定数には使用する必要があります。 - エクスポートされたオブジェクトはどうですか? - エクスポートの最上位レベルでは大文字(例えば
EXPORTED_OBJECT.key
)で、ネストされたすべてのプロパティが変更されないようにします。
// bad const PRIVATE_VARIABLE = 'should not be unnecessarily uppercased within a file'; // bad export const THING_TO_BE_CHANGED = 'should obviously not be uppercased'; // bad export let REASSIGNABLE_VARIABLE = 'do not use let with uppercase variables'; // --- // allowed but does not supply semantic value export const apiKey = 'SOMEKEY'; // better in most cases export const API_KEY = 'SOMEKEY'; // --- // bad - unnecessarily uppercases key while adding no semantic value export const MAPPING = { KEY: 'value' }; // good export const MAPPING = { key: 'value' };
-
Accessors
<a name="accessors--not-required"></a><a name="23.1"></a>
<a name="accessors--no-getters-setters"></a><a name="23.2"></a>
-
24.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()
andsetVal('hello')
. -
24.2 予期しない副作用を引き起こし、テスト、保守、および理由の説明が難しいため、JavaScriptのゲッター/セッターは使用しないこと。代わりに、アクセサ関数を作るのであれば、
getVal()
とかsetVal('hello')
とすること、// bad class Dragon { get age() { // ... } set age(value) { // ... } } // good class Dragon { getAge() { // ... } setAge(value) { // ... } }
<a name="accessors--boolean-prefix"></a><a name="23.3"></a>
-
24.3 If the property/method is a
boolean
, useisVal()
orhasVal()
. -
24.3 プロパティ/メソッドが
boolean
の場合は、isVal()
またはhasVal()
を使用すること。// bad if (!dragon.age()) { return false; } // good if (!dragon.hasAge()) { return false; }
<a name="accessors--consistent"></a><a name="23.4"></a>
-
24.4 It’s okay to create
get()
andset()
functions, but be consistent. -
24.4 一貫していれば、
get()
やset()
という関数を作成することを認める。class Jedi { constructor(options = {}) { const lightsaber = options.lightsaber || 'blue'; this.set('lightsaber', lightsaber); } set(key, val) { this[key] = val; } get(key) { return this[key]; } }
Events
<a name="events--hash"></a><a name="24.1"></a>
-
25.1 When attaching data payloads to events (whether DOM events or something more proprietary like Backbone events), pass an object literal (also known as 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:
-
25.1 データペイロードをイベント(DOMイベントまたはBackboneイベントのようなもっと独自のものかどうかにかかわらず)に添付するときは、生の値の代わりにオブジェクトリテラル(「ハッシュ」とも呼ばれる)を渡すこと。これにより、後の開発者は、イベントのすべてのハンドラを見つけて更新することなく、イベントペイロードにさらにデータを追加できます。たとえば、下の例より
// bad $(this).trigger('listingUpdated', listing.id); ... $(this).on('listingUpdated', function(e, listingId) { // do something with listingId });
prefer: こちらの方が好まれます:
// good $(this).trigger('listingUpdated', { listingId: listing.id }); ... $(this).on('listingUpdated', function(e, data) { // do something with data.listingId });
jQuery
<a name="jquery--dollar-prefix"></a><a name="25.1"></a>
-
26.1 Prefix jQuery object variables with a
$
. -
26.1 jQueryオブジェクトの変数は、先頭に
$
を付与すること。// bad const sidebar = $('.sidebar'); // good const $sidebar = $('.sidebar'); // good const $sidebarBtn = $('.sidebar-btn');
<a name="jquery--cache"></a><a name="25.2"></a>
-
26.2 Cache jQuery lookups.
-
26.2 jQueryの検索結果をキャッシュすること。
// bad function setSidebar() { $('.sidebar').hide(); // ...stuff... $('.sidebar').css({ 'background-color': 'pink' }); } // good function setSidebar() { const $sidebar = $('.sidebar'); $sidebar.hide(); // ...stuff... $sidebar.css({ 'background-color': 'pink' }); }
<a name="jquery--queries"></a><a name="25.3"></a>
- 26.3 For DOM queries use Cascading
$('.sidebar ul')
or parent > child$('.sidebar > ul')
. jsPerf - 26.3 DOMの検索には、
$('.sidebar ul')
や$('.sidebar > ul')
のカスケードを使用すること。jsPerf
<a name="jquery--find"></a><a name="25.4"></a>
-
26.4 Use
find
with scoped jQuery object queries. -
26.4 jQueryオブジェクトの検索には、スコープ付きの
find
を使用すること。// bad $('ul', '.sidebar').hide(); // bad $('.sidebar').find('ul').hide(); // good $('.sidebar ul').hide(); // good $('.sidebar > ul').hide(); // good $sidebar.find('ul').hide();
ECMAScript 5 Compatibility
<a name="es5-compat--kangax"></a><a name="26.1"></a>
<a name="ecmascript-6-styles"></a>
ECMAScript 6+ (ES 2015+) Styles
<a name="es6-styles"></a><a name="27.1"></a>
- Arrow Functions
- Classes
- Object Shorthand
- Object Concise
- Object Computed Properties
- Template Strings
- Destructuring
- Default Parameters
- Rest
- Array Spreads
- Let and Const
- Exponentiation Operator
- Iterators and Generators
- Modules
<a name="tc39-proposals"></a>
-
28.2 Do not use TC39 proposals that have not reached stage 3.
-
28.2 ステージ3に達していないTC39提案を使用しない。
Why? They are not finalized, and they are subject to change or to be withdrawn entirely. We want to use JavaScript, and proposals are not JavaScript yet.
なぜ? それらは最終決定されていません。そしてそれらは変更されるか、または完全に撤回される可能性があります。JavaScriptを使用したいのですが、提案はまだJavaScriptではありません。
Standard Library
The Standard Library contains utilities that are functionally broken but remain for legacy reasons.
標準ライブラリには機能的には壊れているがレガシーな理由で残っているユーティリティが含まれています。
<a name="standard-library--isnan"></a>
-
29.1 Use
Number.isNaN
instead of globalisNaN
. eslint:no-restricted-globals
-
29.1 グローバルな
isNaN
の代わりにNumber.isNaN
を使用すること。 eslint:no-restricted-globals
Why? The global
isNaN
coerces non-numbers to numbers, returning true for anything that coerces to NaN. If this behavior is desired, make it explicit.なぜ? グローバルな
isNaN
は数字ではないものを数字に強制変換し、NaNに強制変換されたものすべてにtrueを返します。 この動作が望ましい場合は、それを明示にしてください。// bad isNaN('1.2'); // false isNaN('1.2.3'); // true // good Number.isNaN('1.2.3'); // false Number.isNaN(Number('1.2.3')); // true
<a name="standard-library--isfinite"></a>
-
29.2 Use
Number.isFinite
instead of globalisFinite
. eslint:no-restricted-globals
-
29.2 グローバルな
isFinite
の代わりにNumber.isFinite
を使用する。 eslint:no-restricted-globals
Why? The global
isFinite
coerces non-numbers to numbers, returning true for anything that coerces to a finite number. If this behavior is desired, make it explicit. なぜ? グローバルなisFinite
は数字ではないものを数字に強制変換し、有限数に強制変換されたものすべてにtrueを返します。 この動作が望ましい場合は、それを明示にしてください。// bad isFinite('2e3'); // true // good Number.isFinite('2e3'); // false Number.isFinite(parseInt('2e3', 10)); // true
Testing
<a name="testing--yup"></a><a name="28.1"></a>
<a name="testing--for-real"></a><a name="28.2"></a>
- 30.2 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.
- We primarily use
mocha
andjest
at Airbnb.tape
is also used occasionally for small, separate modules. - 100% test coverage is a good goal to strive for, even if it’s not always practical to reach it.
- Whenever you fix a bug, write a regression test. A bug fixed without a regression test is almost certainly going to break again in the future.
- 30.2 もちろん、真剣に:
- どのテストフレームワークを使用する場合でも、テストを書く必要があります!
- 多くの小さな単純な関数を書くようにし、突然変異が起こる場所を最小限に抑えるようにしてください。
- スタブやモックについては注意してください - それ自体があなたのテストをより脆弱にする可能性があります。
- Airbnbでは主に
mocha
とjest
を使います。tape
は小さな別々のモジュールに時々使われます。 - 100%テストカバレッジは、それを達成することが必ずしも現実的ではない場合でも、努力するための良い目標です。
- あなたがバグを修正する時はいつでも_回帰テストを書くこと_。回帰テストなしで修正されたバグは、ほぼ確実に将来再び壊れるでしょう。
Performance
- On Layout & Web Performance
- String vs Array Concat
- Try/Catch Cost In a Loop
- Bang Function
- jQuery Find vs Context, Selector
- innerHTML vs textContent for script text
- Long String Concatenation
- Are Javascript functions like
map()
,reduce()
, andfilter()
optimized for traversing arrays? - Loading...
Resources
Learning ES6+
Read This
Tools
- Code Style Linters
- Neutrino Preset - @neutrinojs/airbnb
Other Style Guides
- Google JavaScript Style Guide
- jQuery Core Style Guidelines
- Principles of Writing Consistent, Idiomatic JavaScript
- StandardJS
Other Styles
- Naming this in nested functions - Christian Johansen
- Conditional Callbacks - Ross Allen
- Popular JavaScript Coding Conventions on GitHub - JeongHoon Byun
- Multiple var statements in JavaScript, not superfluous - Ben Alman
Further Reading
- Understanding JavaScript Closures - Angus Croll
- Basic JavaScript for the impatient programmer - Dr. Axel Rauschmayer
- You Might Not Need jQuery - Zack Bloom & Adam Schwartz
- ES6 Features - Luke Hoban
- Frontend Guidelines - Benjamin De Cock
Books
- JavaScript: The Good Parts - Douglas Crockford
- JavaScript Patterns - Stoyan Stefanov
- Pro JavaScript Design Patterns - Ross Harmes and Dustin Diaz
- High Performance Web Sites: Essential Knowledge for Front-End Engineers - Steve Souders
- Maintainable JavaScript - Nicholas C. Zakas
- JavaScript Web Applications - Alex MacCaw
- Pro JavaScript Techniques - John Resig
- Smashing Node.js: JavaScript Everywhere - Guillermo Rauch
- Secrets of the JavaScript Ninja - John Resig and Bear Bibeault
- Human JavaScript - Henrik Joreteg
- Superhero.js - Kim Joar Bekkelund, Mads Mobæk, & Olav Bjorkoy
- JSBooks - Julien Bouquillon
- Third Party JavaScript - Ben Vinegar and Anton Kovalyov
- Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript - David Herman
- Eloquent JavaScript - Marijn Haverbeke
- You Don’t Know JS: ES6 & Beyond - Kyle Simpson
Blogs
- JavaScript Weekly
- JavaScript, JavaScript...
- Bocoup Weblog
- Adequately Good
- NCZOnline
- Perfection Kills
- Ben Alman
- Dmitry Baranovskiy
- nettuts
Podcasts
In the Wild
This is a list of organizations that are using this style guide. Send us a pull request and we'll add you to the list.
このスタイルガイドを使用している組織のリストです。プルリクエストを送信すると、リストに追加されます。
- 123erfasst: 123erfasst/javascript
- 3blades: 3Blades
- 4Catalyzer: 4Catalyzer/javascript
- Aan Zee: AanZee/javascript
- Adult Swim: adult-swim/javascript
- Airbnb: airbnb/javascript
- AltSchool: AltSchool/javascript
- Apartmint: apartmint/javascript
- Ascribe: ascribe/javascript
- Avalara: avalara/javascript
- Avant: avantcredit/javascript
- Axept: axept/javascript
- BashPros: BashPros/javascript
- Billabong: billabong/javascript
- Bisk: bisk
- Bonhomme: bonhommeparis/javascript
- Brainshark: brainshark/javascript
- CaseNine: CaseNine/javascript
- Cerner: Cerner
- Chartboost: ChartBoost/javascript-style-guide
- ComparaOnline: comparaonline/javascript
- Compass Learning: compasslearning/javascript-style-guide
- DailyMotion: dailymotion/javascript
- DoSomething: DoSomething/eslint-config
- Digitpaint digitpaint/javascript
- Drupal: www.drupal.org
- Ecosia: ecosia/javascript
- Evernote: evernote/javascript-style-guide
- Evolution Gaming: evolution-gaming/javascript
- EvozonJs: evozonjs/javascript
- ExactTarget: ExactTarget/javascript
- Expensify Expensify/Style-Guide
- Flexberry: Flexberry/javascript-style-guide
- Gawker Media: gawkermedia
- General Electric: GeneralElectric/javascript
- Generation Tux: GenerationTux/javascript
- GoodData: gooddata/gdc-js-style
- GreenChef: greenchef/javascript
- Grooveshark: grooveshark/javascript
- Grupo-Abraxas: Grupo-Abraxas/javascript
- Honey: honeyscience/javascript
- How About We: howaboutwe/javascript
- Huballin: huballin
- HubSpot: HubSpot/javascript
- Hyper: hyperoslo/javascript-playbook
- InterCity Group: intercitygroup/javascript-style-guide
- Jam3: Jam3/Javascript-Code-Conventions
- JeopardyBot: kesne/jeopardy-bot
- JSSolutions: JSSolutions/javascript
- Kaplan Komputing: kaplankomputing/javascript
- KickorStick: kickorstick
- Kinetica Solutions: kinetica/javascript
- LEINWAND: LEINWAND/javascript
- Lonely Planet: lonelyplanet/javascript
- M2GEN: M2GEN/javascript
- Mighty Spring: mightyspring/javascript
- MinnPost: MinnPost/javascript
- MitocGroup: MitocGroup/javascript
- ModCloth: modcloth/javascript
- Money Advice Service: moneyadviceservice/javascript
- Muber: muber
- National Geographic: natgeo
- Nimbl3: nimbl3/javascript
- NullDev: NullDevCo/JavaScript-Styleguide
- Nulogy: nulogy/javascript
- Orange Hill Development: orangehill/javascript
- Orion Health: orionhealth/javascript
- OutBoxSoft: OutBoxSoft/javascript
- Peerby: Peerby/javascript
- Pier 1: Pier1/javascript
- Qotto: Qotto/javascript-style-guide
- Razorfish: razorfish/javascript-style-guide
- reddit: reddit/styleguide/javascript
- React: facebook.github.io/react/contributing/how-to-contribute.html#style-guide
- REI: reidev/js-style-guide
- Ripple: ripple/javascript-style-guide
- Sainsbury’s Supermarkets: jsainsburyplc
- SeekingAlpha: seekingalpha/javascript-style-guide
- Shutterfly: shutterfly/javascript
- Sourcetoad: sourcetoad/javascript
- Springload: springload
- StratoDem Analytics: stratodem/javascript
- SteelKiwi Development: steelkiwi/javascript
- StudentSphere: studentsphere/javascript
- SwoopApp: swoopapp/javascript
- SysGarage: sysgarage/javascript-style-guide
- Syzygy Warsaw: syzygypl/javascript
- Target: target/javascript
- Terra: terra
- TheLadders: TheLadders/javascript
- The Nerdery: thenerdery/javascript-standards
- T4R Technology: T4R-Technology/javascript
- UrbanSim: urbansim
- VoxFeed: VoxFeed/javascript-style-guide
- WeBox Studio: weboxstudio/javascript
- Weggo: Weggo/javascript
- Zillow: zillow/javascript
- ZocDoc: ZocDoc/javascript
Translation
This style guide is also available in other languages:
このスタイルガイドは他の言語でも利用できます。
- Brazilian Portuguese: armoucar/javascript-style-guide
- Bulgarian: borislavvv/javascript
- Catalan: fpmweb/javascript-style-guide
- Chinese (Simplified): lin-123/javascript
- Chinese (Traditional): jigsawye/javascript
- French: nmussy/javascript-style-guide
- German: timofurrer/javascript-style-guide
- Italian: sinkswim/javascript-style-guide
- Japanese: mitsuruog/javascript-style-guide
- Korean: ParkSB/javascript-style-guide
- Russian: leonidlebedev/javascript-airbnb
- Spanish: paolocarrasco/javascript-style-guide
- Thai: lvarayut/javascript-style-guide
- Turkish: eraycetinay/javascript
- Ukrainian: ivanzusko/javascript
- Vietnam: hngiang/javascript-style-guide
The JavaScript Style Guide Guide
Chat With Us About JavaScript
- Find us on gitter.
Contributors
License
(The MIT License)
Copyright (c) 2012 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.
Amendments
We encourage you to fork this guide and change the rules to fit your team’s style guide. Below, you may list some amendments to the style guide. This allows you to periodically update your style guide without having to deal with merge conflicts.
このガイドをフォークして、チームのスタイルガイドに合うようにルールを変更することをお勧めします。一番下に、スタイルガイドに対するいくつかの修正を追加してください。これにより、マージの競合に対処することなく、定期的にスタイルガイドを更新することができます。