Skip to content

manjuu-eater/javascript-style-guide

 
 

Repository files navigation

Airbnb JavaScript スタイルガイド() {

元文書:https://github.com/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またはそれと同等のシム/ポリフィルをアプリにインストールする必要があります。

CircleCI

This guide is available in other languages too. See Translation

このガイドは他の言語でも利用可能です。Translationを参照してください。

Other Style Guides

他のスタイルガイドたち

Table of Contents

  1. Types
  2. References
  3. Objects
  4. Arrays
  5. Destructuring
  6. Strings
  7. Functions
  8. Arrow Functions
  9. Classes & Constructors
  10. Modules
  11. Iterators and Generators
  12. Properties
  13. Variables
  14. Hoisting
  15. Comparison Operators & Equality
  16. Blocks
  17. Control Statements
  18. Comments
  19. Whitespace
  20. Commas
  21. Semicolons
  22. Type Casting & Coercion
  23. Naming Conventions
  24. Accessors
  25. Events
  26. jQuery
  27. ECMAScript 5 Compatibility
  28. ECMAScript 6+ (ES 2015+) Styles
  29. Standard Library
  30. Testing
  31. Performance
  32. Resources
  33. In the Wild
  34. Translation
  35. The JavaScript Style Guide Guide
  36. Chat With Us About JavaScript
  37. Contributors
  38. License
  39. Amendments

Types

  • 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は忠実にポリフィルされることはできないので、それらをネイティブにサポートしていないブラウザ/環境をターゲットにしているときは使用しない。

  • 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

⬆ back to top

References

  • 2.1 Use const for all of your references; avoid using var. 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;

  • 2.2 If you must reassign references, use let instead of var. eslint: no-var

  • 2.2 参照を再割当てする場合は var の代わりに let を使用すること。eslint: no-var

    Why? let is block-scoped rather than function-scoped like var.

    なぜ? letvarのように関数スコープではなくブロックスコープです。

    // bad
    var count = 1;
    if (true) {
      count += 1;
    }
    
    // good, use the let.
    let count = 1;
    if (true) {
      count += 1;
    }

  • 2.3 Note that both let and const are block-scoped.

  • 2.3 letconst は共にブロックスコープであることに注意すること。

    // 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

⬆ back to top

Objects

  • 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 = {};

  • 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,
    };

  • 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;
      },
    };

  • 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,
    };

  • 3.5 Group your shorthand properties at the beginning of your object declaration.

  • 3.5 プロパティの短縮構文はオブジェクト宣言の先頭にまとめること。

    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,
    };

  • 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,
    };

  • 3.7 Do not call Object.prototype methods directly, such as hasOwnProperty, propertyIsEnumerable, and isPrototypeOf. eslint: no-prototype-builtins

  • 3.7 hasOwnPropertypropertyIsEnumerableisPrototypeOfのような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));

  • 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 }

⬆ back to top

Arrays

  • 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 = [];

  • 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');

  • 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];

  • 4.4 To convert an iterable object to an array, use spreads ... instead of Array.from.

  • 4.4 繰り返し可能なオブジェクトを配列に変換する場合はArray.fromの代わりにスプレッド構文...を使用すること。

    const foo = document.querySelectorAll('.foo');
    
    // good
    const nodes = Array.from(foo);
    
    // best
    const nodes = [...foo];

  • 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);

  • 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);

  • 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;
    });

  • 4.8 Use line breaks after open and before close array brackets if an array has multiple lines

  • 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,
    ];

⬆ back to top

Destructuring

  • 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}`;
    }

  • 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;

  • 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);

⬆ back to top

Strings

  • 6.1 Use single quotes '' for strings. eslint: quotes

  • 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';

  • 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.';

  • 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}?`;
    }

  • 6.4 Never use eval() on a string, it opens too many vulnerabilities. eslint: no-eval
  • 6.4 絶対に eval() を利用しない。これは、いままで数多くの脆弱性を作って来たからです。eslint: no-eval

  • 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}'`;

⬆ back to top

Functions

  • 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() {
      // ...
    };

  • 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.');
    }());

  • 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

  • 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.');
      };
    }

  • 7.5 Never name a parameter arguments. This will take precedence over the arguments object that is given to every function scope.

  • 7.5 パラメータに arguments を指定しない。これは、関数スコープに渡される arguments オブジェクトの参照を上書きしてしまうためです。

    // bad
    function foo(name, options, arguments) {
      // ...
    }
    
    // good
    function foo(name, options, args) {
      // ...
    }

  • 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 like arguments.

    なぜ? ... を利用することで、いつくかのパラメータを利用したいことを明らかにすることができます。加えて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('');
    }

  • 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 = {}) {
      // ...
    }

  • 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

  • 7.9 Always put default parameters last.

  • 7.9 常にデフォルトパラメータは末尾に配置すること。

    // bad
    function handleThings(opts = {}, name) {
      // ...
    }
    
    // good
    function handleThings(name, opts = {}) {
      // ...
    }

  • 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');

  • 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() {};

  • 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;
    }

  • 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) {
      // ...
    }

  • 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 with apply.

    なぜ? それは分かりやすいです。コンテキストを提供する必要はありませんし、そして簡単にapplynewを構成することはできません。

    // 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]);

  • 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,
    );

⬆ back to top

アロー関数(Arrow Functions)

  • 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;
    });

  • 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 In case the expression spans over multiple lines, wrap it in parentheses for better readability.

  • 8.3 式の全長が複数行にまたがる場合は、可読性をより良くするため丸括弧()で囲うこと。

    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,
      )
    ));

  • 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;
    });

  • 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;
    };

  • 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
    )

⬆ back to top

Classes & Constructors

  • 9.1 Always use class. Avoid manipulating prototype 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;
      }
    }

  • 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];
      }
    }

  • 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);

  • 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()}`;
      }
    }

  • 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';
      }
    }

  • 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; }
    }

⬆ back to top

Modules

  • 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;

  • 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';

  • 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;

  • 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';

  • 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 };

  • 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() {}

  • 10.7 Put all imports above non-import statements. eslint: import/first

  • 10.7 すべてのimportをimport文以外の上に置くこと。 eslint: import/first

    Why? Since imports 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();

  • 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';

  • 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';

⬆ back to top

Iterators and Generators

  • 11.1 Don’t use iterators. Prefer JavaScript’s higher-order functions instead of loops like for-in or for-of. eslint: no-iterator no-restricted-syntax

  • 11.1 イテレータを使わない。for-infor-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, and Object.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);

  • 11.2 Don’t use generators for now.

  • 11.2 今のところgeneratorsは使用しない。

    Why? They don’t transpile well to ES5.

    Why? ES5にうまくトランスパイルできないから。

  • 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 for function, function* is a unique construct, different from function.

    なぜ? 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* () {
      // ...
    };

⬆ back to top

Properties

  • 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;

  • 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');

  • 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;

⬆ back to top

Variables

  • 13.1 Always use const or let 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 変数を宣言する際は、常にconstletを使用すること。使用しない場合はグローバル変数として宣言されてしまいます。グローバルな名前空間を汚染しないように、キャプテンプラネット(環境保護とエコロジーをテーマにしたスーパーヒーローアニメ)も警告しています。eslint: no-undef prefer-const

    // bad
    superPower = new SuperPower();
    
    // good
    const superPower = new SuperPower();

  • 13.2 Use one const or let 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';

  • 13.3 Group all your consts and then group all your lets.

  • 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;

  • 13.4 Assign variables where you need them, but place them in a reasonable place.

  • 13.4 変数を割り当てる際は、必要かつ合理的な場所で行うこと。

    Why? let and const are block scoped and not function scoped.

    なぜ? letconstはブロックスコープだからです。関数スコープではありません。

    // 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;
    }

  • 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`

  • 13.6 Avoid using unary increments and decrements (++, --). eslint no-plusplus

  • 13.6 インクリメント演算子(++)デクリメント演算子(--)を使わない。eslint no-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 of num++ or num ++. 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;

  • 13.7 Avoid linebreaks before or after = in an assignment. If your assignment violates max-len, surround the value in parens. eslint operator-linebreak.

  • 13.7 代入で=の前後に改行を入れない。あなたの代入がmax-lenに違反している場合は、値を丸括弧()で囲むこと。 eslint operator-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';

  • 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'はrestプロパティを隣に持つため、未使用でも無視されます。
    // これは、指定されたキーを省略したオブジェクトを抽出する形式です。
    var { type, ...coords } = data;
    // 'coords' is now the 'data' object without its 'type' property.
    // 'coords'は、今や'type'プロパティを持たない'data'オブジェクトになりました。

⬆ back to top

Hoisting

  • 14.1 var declarations get hoisted to the top of their closest enclosing function scope, their assignment does not. const and let 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宣言は、それらに最も近い包含関数スコープの一番上に引き上げられますが、それらの代入は引き継がれません。constletの宣言は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;
    }

  • 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');
      };
    }

  • 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');
      }
    }

⬆ back to top

Comparison Operators & Equality

  • 15.1 Use === and !== over == and !=. eslint: eqeqeq
  • 15.1 ==!=より===!==を使用すること。eslint: eqeqeq

  • 15.2 Conditional statements such as the if statement evaluate their expression using coercion with the ToBoolean abstract method and always follow these simple rules:

    • 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と評価されます。
    • undefinedfalseと評価されます。
    • nullfalseと評価されます。
    • 真偽値boolean型の値として評価されます。
    • 数値trueと評価されます。しかし、+0, -0, or NaNの場合は falseです。
    • 文字列trueと評価されます。しかし、空文字''の場合はfalse です。
    if ([0]) {
      // true
      // An array is an object, objects evaluate to true
      // 配列はオブジェクトなのでtrueとして評価されます。
    }

  • 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) {
      // ...
    }

  • 15.5 Use braces to create blocks in case and default clauses that contain lexical declarations (e.g. let, const, function, and class). eslint: no-case-declarations

  • 15.5 casedefault節でブロックを作成するには中括弧({})を使うこと。(例えば letconstfunctionclass) eslint: no-case-declarations

    Why? Lexical declarations are visible in the entire switch block but only get initialized when assigned, which only happens when its case is reached. This causes problems when multiple case clauses attempt to define the same thing.

    なぜ? レキシカル宣言は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 {}
      }
    }

  • 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;

  • 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;

  • 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;

⬆ back to top

Blocks

  • 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;
    }

  • 16.2 If you’re using multi-line blocks with if and else, put else on the same line as your if block’s closing brace. eslint: brace-style

  • 16.2 ifelseを使った複数行のブロックの場合は、elseブロックの閉じ括弧と同じ行にelseを置くこと。eslint: brace-style

    // bad
    if (test) {
      thing1();
      thing2();
    }
    else {
      thing3();
    }
    
    // good
    if (test) {
      thing1();
      thing2();
    } else {
      thing3();
    }

  • 16.3 If an if block always executes a return statement, the subsequent else block is unnecessary. A return in an else if block following an if block that contains a return can be separated into multiple if 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;
      }
    }

⬆ back to top

Control Statements

  • 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.

  • 17.1 制御文(ifwhileなど)が長くなり過ぎたり、最大行長を超えたりした場合、それぞれの(グループ化された)条件は新しい行に入れること。そして論理演算子で行を始めること。

    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();
    }

  • 17.2 Don't use selection operators in place of control statements.

  • 17.2 後続処理を選択するための演算子を制御文の代わりに使用しない。

    // bad
    !isRunning && startRunning();
    
    // good
    if (!isRunning) {
      startRunning();
    }

⬆ back to top

Comments

  • 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;
    }

  • 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;
    }

  • 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;
    }

  • 18.4 Prefixing your comments with FIXME or TODO helps other developers quickly understand if you’re pointing out a problem that needs to be revisited, or if you’re suggesting a solution to the problem that needs to be implemented. These are different than regular comments because they are actionable. The actions are FIXME: -- need to figure this out or TODO: -- need to implement.
  • 18.4 問題を指摘して再考を促す場合や、問題の解決策を提案する場合など、コメントの前にFIXMETODOを付けることで他の開発者の素早い理解を助けることができます。これらは、何らかのアクションを伴うという意味で通常のコメントとは異なります。アクションとはFIXME -- 解決策が必要もしくはTODO -- 実装が必要です。

  • 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;
      }
    }

  • 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;
      }
    }

⬆ back to top

Whitespace

  • 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;
    }

  • 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',
    });

  • 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!');
    }

  • 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;

  • 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);

  • 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;

  • 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);
    }

  • 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);
    }

  • 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]);

  • 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.'));

  • 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; }

  • 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];

  • 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]]

  • 19.16 Avoid spaces between functions and their invocations. eslint: func-call-spacing

  • 19.16 関数とその呼び出しの間にスペースを入れない。eslint: func-call-spacing

    // bad
    func ();
    
    func
    ();
    
    // good
    func();

  • 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 };

  • 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: no-multiple-empty-lines

    // bad
    var x = 1;
    
    
    
    var y = 2;
    
    // good
    var x = 1;
    
    var y = 2;

⬆ back to top

Commas

  • 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',
    };

  • 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
    );

⬆ back to top

Semicolons

  • 21.1 Yup. eslint: semi

  • 21.1 もちろん。eslint: semi

    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';
    }

    Read more.

⬆ back to top

Type Casting & Coercion

  • 22.1 Perform type coercion at the beginning of the statement.
  • 22.1 文の先頭で型の強制を行うこと。

  • 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);

  • 22.3 Numbers: Use Number for type casting and parseInt 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);

  • 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;

  • 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

  • 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;

⬆ back to top

Naming Conventions

  • 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() {
      // ...
    }

  • 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() {}

  • 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',
    });

  • 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');

  • 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);
      };
    }

  • 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

  • 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;

  • 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;

  • 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 = [
      // ...
    ];

  • 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'
    };

⬆ back to top

Accessors

  • 24.1 Accessor functions for properties are not required.
  • 24.1 プロパティのためのアクセサ(Accessor)関数は必須ではありません。

  • 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() and setVal('hello').

  • 24.2 予期しない副作用を引き起こし、テスト、保守、および理由の説明が難しいため、JavaScriptのゲッター/セッターは使用しないこと。代わりに、アクセサ関数を作るのであれば、getVal()とか setVal('hello')とすること、

    // bad
    class Dragon {
      get age() {
        // ...
      }
    
      set age(value) {
        // ...
      }
    }
    
    // good
    class Dragon {
      getAge() {
        // ...
      }
    
      setAge(value) {
        // ...
      }
    }

  • 24.3 If the property/method is a boolean, use isVal() or hasVal().

  • 24.3 プロパティ/メソッドがbooleanの場合は、isVal()またはhasVal()を使用すること。

    // bad
    if (!dragon.age()) {
      return false;
    }
    
    // good
    if (!dragon.hasAge()) {
      return false;
    }

  • 24.4 It’s okay to create get() and set() 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];
      }
    }

⬆ back to top

Events

  • 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
    });

⬆ back to top

jQuery

  • 26.1 Prefix jQuery object variables with a $.

  • 26.1 jQueryオブジェクトの変数は、先頭に$を付与すること。

    // bad
    const sidebar = $('.sidebar');
    
    // good
    const $sidebar = $('.sidebar');
    
    // good
    const $sidebarBtn = $('.sidebar-btn');

  • 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'
      });
    }

  • 26.3 For DOM queries use Cascading $('.sidebar ul') or parent > child $('.sidebar > ul'). jsPerf
  • 26.3 DOMの検索には、$('.sidebar ul')$('.sidebar > ul')のカスケードを使用すること。jsPerf

  • 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();

⬆ back to top

ECMAScript 5 Compatibility

⬆ back to top

ECMAScript 6+ (ES 2015+) Styles

  • 28.1 This is a collection of links to the various ES6+ features.
  • 28.1 これは、さまざまなES6+機能へのリンク集です。
  1. Arrow Functions
  2. Classes
  3. Object Shorthand
  4. Object Concise
  5. Object Computed Properties
  6. Template Strings
  7. Destructuring
  8. Default Parameters
  9. Rest
  10. Array Spreads
  11. Let and Const
  12. Exponentiation Operator
  13. Iterators and Generators
  14. Modules

  • 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ではありません。

⬆ back to top

Standard Library

The Standard Library contains utilities that are functionally broken but remain for legacy reasons.

標準ライブラリには機能的には壊れているがレガシーな理由で残っているユーティリティが含まれています。

  • 29.1 Use Number.isNaN instead of global isNaN. 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

  • 29.2 Use Number.isFinite instead of global isFinite. 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

⬆ back to top

Testing

  • 30.1 Yup.

  • 30.1 もちろん

    function foo() {
      return true;
    }

  • 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 and jest 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では主に mochajestを使います。tapeは小さな別々のモジュールに時々使われます。
    • 100%テストカバレッジは、それを達成することが必ずしも現実的ではない場合でも、努力するための良い目標です。
    • あなたがバグを修正する時はいつでも_回帰テストを書くこと_。回帰テストなしで修正されたバグは、ほぼ確実に将来再び壊れるでしょう。

⬆ back to top

Performance

⬆ back to top

Resources

Learning ES6+

Read This

Tools

Other Style Guides

Other Styles

Further Reading

Books

Blogs

Podcasts

⬆ back to top

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.

このスタイルガイドを使用している組織のリストです。プルリクエストを送信すると、リストに追加されます。

⬆ back to top

Translation

This style guide is also available in other languages:

このスタイルガイドは他の言語でも利用できます。

The JavaScript Style Guide Guide

Chat With Us About JavaScript

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.

⬆ back to top

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.

このガイドをフォークして、チームのスタイルガイドに合うようにルールを変更することをお勧めします。一番下に、スタイルガイドに対するいくつかの修正を追加してください。これにより、マージの競合に対処することなく、定期的にスタイルガイドを更新することができます。

};

About

常に気をつけたい、JavaScriptへの正しい接し方

Resources

Stars

Watchers

Forks

Packages

No packages published