{"action":"created","comment":{"url":"https://api.github.com/repos/signpost/javascript/pulls/comments/114666547","pull_request_review_id":36152889,"id":114666547,"diff_hunk":"@@ -72,921 +79,2324 @@\n \n **[⬆ back to top](#table-of-contents)**\n \n+## References\n+\n+  <a name=\"references--prefer-const\"></a><a name=\"2.1\"></a>\n+  - [2.1](#references--prefer-const) Use `const` for all of your references; avoid using `var`. eslint: [`prefer-const`](http://eslint.org/docs/rules/prefer-const.html), [`no-const-assign`](http://eslint.org/docs/rules/no-const-assign.html)\n+\n+    > Why? This ensures that you can't reassign your references, which can lead to bugs and difficult to comprehend code.\n+\n+    ```javascript\n+    // bad\n+    var a = 1;\n+    var b = 2;\n+\n+    // good\n+    const a = 1;\n+    const b = 2;\n+    ```\n+\n+  <a name=\"references--disallow-var\"></a><a name=\"2.2\"></a>\n+  - [2.2](#references--disallow-var) If you must reassign references, use `let` instead of `var`. This should rarely be the case for non-primitive data types. As a general rule of thumb, you should avoid `let` in combination with non-primitive data types. Re-assigning a variable should happen consciously. eslint: [`no-var`](http://eslint.org/docs/rules/no-var.html) jscs: [`disallowVar`](http://jscs.info/rule/disallowVar)\n+\n+    > Why? `let` is block-scoped rather than function-scoped like `var`.\n+\n+    ```javascript\n+    // bad\n+    var count = 1;\n+    if (true) {\n+        count += 1;\n+    }\n+\n+    // good, use the let.\n+    let count = 1;\n+    if (true) {\n+        count += 1;\n+    }\n+    ```\n+\n+  <a name=\"references--block-scope\"></a><a name=\"2.3\"></a>\n+  - [2.3](#references--block-scope) Note that both `let` and `const` are block-scoped.\n+\n+    ```javascript\n+    // const and let only exist in the blocks they are defined in.\n+    {\n+        let a = 1;\n+        const b = 1;\n+    }\n+    console.log(a); // ReferenceError\n+    console.log(b); // ReferenceError\n+    ```\n+\n+**[⬆ back to top](#table-of-contents)**\n+\n ## Objects\n \n-  - Use the literal syntax for object creation.\n+  <a name=\"objects--no-new\"></a><a name=\"3.1\"></a>\n+  - [3.1](#objects--no-new) Use the literal syntax for object creation. eslint: [`no-new-object`](http://eslint.org/docs/rules/no-new-object.html)\n \n     ```javascript\n     // bad\n-    var item = new Object();\n+    const item = new Object();\n \n     // good\n-    var item = {};\n+    const item = {};\n     ```\n \n-  - Don't use [reserved words](http://es5.github.io/#x7.6.1) as keys. It won't work in IE8. [More info](https://github.com/airbnb/javascript/issues/61)\n+  <a name=\"es6-computed-properties\"></a><a name=\"3.4\"></a>\n+  - [3.2](#es6-computed-properties) Use computed property names when creating objects with dynamic property names.\n+\n+    > Why? They allow you to define all the properties of an object in one place.\n \n     ```javascript\n+\n+    function getKey(k) {\n+        return `a key named ${k}`;\n+    }\n+\n     // bad\n-    var superman = {\n-      default: { clark: 'kent' },\n-      private: true\n+    const obj = {\n+        id: 5,\n+        name: 'San Francisco',\n     };\n+    obj[getKey('enabled')] = true;\n \n     // good\n-    var superman = {\n-      defaults: { clark: 'kent' },\n-      hidden: true\n+    const obj = {\n+        id: 5,\n+        name: 'San Francisco',\n+        [getKey('enabled')]: true,\n     };\n     ```\n \n-  - Use readable synonyms in place of reserved words.\n+  <a name=\"es6-object-shorthand\"></a><a name=\"3.5\"></a>\n+  - [3.3](#es6-object-shorthand) Use object method shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)\n \n     ```javascript\n     // bad\n-    var superman = {\n-      class: 'alien'\n-    };\n+    const atom = {\n+        value: 1,\n \n-    // bad\n-    var superman = {\n-      klass: 'alien'\n+        addValue: function (value) {\n+            return atom.value + value;\n+        },\n     };\n \n     // good\n-    var superman = {\n-      type: 'alien'\n+    const atom = {\n+        value: 1,\n+\n+        addValue(value) {\n+            return atom.value + value;\n+        },\n     };\n     ```\n \n-**[⬆ back to top](#table-of-contents)**\n-\n-## Arrays\n+  <a name=\"es6-object-concise\"></a><a name=\"3.6\"></a>\n+  - [3.4](#es6-object-concise) Use property value shorthand. eslint: [`object-shorthand`](http://eslint.org/docs/rules/object-shorthand.html) jscs: [`requireEnhancedObjectLiterals`](http://jscs.info/rule/requireEnhancedObjectLiterals)\n \n-  - Use the literal syntax for array creation\n+    > Why? It is shorter to write and descriptive.\n \n     ```javascript\n+    const lukeSkywalker = 'Luke Skywalker';\n+\n     // bad\n-    var items = new Array();\n+    const obj = {\n+        lukeSkywalker: lukeSkywalker,\n+    };\n \n     // good\n-    var items = [];\n+    const obj = {\n+        lukeSkywalker,\n+    };\n     ```\n \n-  - If you don't know array length use Array#push.\n+  <a name=\"objects--grouped-shorthand\"></a><a name=\"3.7\"></a>\n+  - [3.5](#objects--grouped-shorthand) Group your shorthand properties at the beginning of your object declaration.\n \n-    ```javascript\n-    var someStack = [];\n+    > Why? It's easier to tell which properties are using the shorthand.\n \n+    ```javascript\n+    const anakinSkywalker = 'Anakin Skywalker';\n+    const lukeSkywalker = 'Luke Skywalker';\n \n     // bad\n-    someStack[someStack.length] = 'abracadabra';\n+    const obj = {\n+        episodeOne: 1,\n+        twoJediWalkIntoACantina: 2,\n+        lukeSkywalker,\n+        episodeThree: 3,\n+        mayTheFourth: 4,\n+        anakinSkywalker,\n+    };\n \n     // good\n-    someStack.push('abracadabra');\n+    const obj = {\n+        lukeSkywalker,\n+        anakinSkywalker,\n+        episodeOne: 1,\n+        twoJediWalkIntoACantina: 2,\n+        episodeThree: 3,\n+        mayTheFourth: 4,\n+    };\n     ```\n \n-  - When you need to copy an array use Array#slice. [jsPerf](http://jsperf.com/converting-arguments-to-an-array/7)\n+  <a name=\"objects--quoted-props\"></a><a name=\"3.8\"></a>\n+  - [3.6](#objects--quoted-props) Only quote properties that are invalid identifiers. eslint: [`quote-props`](http://eslint.org/docs/rules/quote-props.html) jscs: [`disallowQuotedKeysInObjects`](http://jscs.info/rule/disallowQuotedKeysInObjects)\n \n-    ```javascript\n-    var len = items.length;\n-    var itemsCopy = [];\n-    var i;\n+    > Why? In general we consider it subjectively easier to read. It improves syntax highlighting, and is also more easily optimized by many JS engines.\n \n+    ```javascript\n     // bad\n-    for (i = 0; i < len; i++) {\n-      itemsCopy[i] = items[i];\n-    }\n+    const bad = {\n+        'foo': 3,\n+        'bar': 4,\n+        'data-blah': 5,\n+    };\n \n     // good\n-    itemsCopy = items.slice();\n+    const good = {\n+        foo: 3,\n+        bar: 4,\n+        'data-blah': 5,\n+    };\n     ```\n \n-  - To convert an array-like object to an array, use Array#slice.\n+  <a name=\"objects--prototype-builtins\"></a>\n+  - [3.7](#objects--prototype-builtins) Do not call `Object.prototype` methods directly, such as `hasOwnProperty`, `propertyIsEnumerable`, and `isPrototypeOf`.\n+\n+    > 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)`).\n \n     ```javascript\n-    function trigger() {\n-      var args = Array.prototype.slice.call(arguments);\n-      ...\n-    }\n+    // bad\n+    console.log(object.hasOwnProperty(key));\n+\n+    // good\n+    console.log(Object.prototype.hasOwnProperty.call(object, key));\n+\n+    // best\n+    const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.\n+    /* or */\n+    import has from 'has';\n+    // ...\n+    console.log(has.call(object, key));\n     ```\n \n **[⬆ back to top](#table-of-contents)**\n \n+## Arrays\n \n-## Strings\n-\n-  - Use single quotes `''` for strings\n+  <a name=\"arrays--literals\"></a><a name=\"4.1\"></a>\n+  - [4.1](#arrays--literals) Use the literal syntax for array creation. eslint: [`no-array-constructor`](http://eslint.org/docs/rules/no-array-constructor.html)\n \n     ```javascript\n     // bad\n-    var name = \"Bob Parr\";\n+    const items = new Array();\n \n     // good\n-    var name = 'Bob Parr';\n+    const items = [];\n+    ```\n+\n+  <a name=\"arrays--push\"></a><a name=\"4.2\"></a>\n+  - [4.2](#arrays--push) Use [Array#push](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push) instead of direct assignment to add items to an array.\n+\n+    ```javascript\n+    const someStack = [];\n \n     // bad\n-    var fullName = \"Bob \" + this.lastName;\n+    someStack[someStack.length] = 'abracadabra';\n \n     // good\n-    var fullName = 'Bob ' + this.lastName;\n+    someStack.push('abracadabra');\n     ```\n \n-  - Strings longer than 80 characters should be written across multiple lines using string concatenation.\n-  - Note: If overused, long strings with concatenation could impact performance. [jsPerf](http://jsperf.com/ya-string-concat) & [Discussion](https://github.com/airbnb/javascript/issues/40)\n+  <a name=\"es6-array-spreads\"></a><a name=\"4.3\"></a>\n+  - [4.3](#es6-array-spreads) Use array spreads `...` to copy arrays. Note that this will create a shallow copy of the array.\n \n     ```javascript\n     // bad\n-    var errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';\n+    const len = items.length;\n+    const itemsCopy = [];\n+    let i;\n \n-    // bad\n-    var errorMessage = 'This is a super long error that was thrown because \\\n-    of Batman. When you stop to think about how Batman had anything to do \\\n-    with this, you would get nowhere \\\n-    fast.';\n+    for (i = 0; i < len; i += 1) {\n+        itemsCopy[i] = items[i];\n+    }\n \n     // good\n-    var errorMessage = 'This is a super long error that was thrown because ' +\n-      'of Batman. When you stop to think about how Batman had anything to do ' +\n-      'with this, you would get nowhere fast.';\n+    const itemsCopy = [...items];\n     ```\n \n-  - When programmatically building up a string, use Array#join instead of string concatenation. Mostly for IE: [jsPerf](http://jsperf.com/string-vs-array-concat/2).\n+  <a name=\"arrays--from\"></a><a name=\"4.4\"></a>\n+  - [4.4](#arrays--from) To convert an array-like object to an array, use [Array.from](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from).\n \n     ```javascript\n-    var items;\n-    var messages;\n-    var length;\n-    var i;\n+    const foo = document.querySelectorAll('.foo');\n+    const nodes = Array.from(foo);\n+    ```\n \n-    messages = [{\n-      state: 'success',\n-      message: 'This one worked.'\n-    }, {\n-      state: 'success',\n-      message: 'This one worked as well.'\n-    }, {\n-      state: 'error',\n-      message: 'This one did not work.'\n-    }];\n+**[⬆ back to top](#table-of-contents)**\n \n-    length = messages.length;\n+<a name=\"arrays--bracket-newline\"></a>\n+  - [4.6](#arrays--bracket-newline) Use line breaks after open and before close array brackets if an array has multiple lines\n \n-    // bad\n-    function inbox(messages) {\n-      items = '<ul>';\n+  ```javascript\n+  // bad\n+  const arr = [\n+      [0, 1], [2, 3], [4, 5],\n+  ];\n \n-      for (i = 0; i < length; i++) {\n-        items += '<li>' + messages[i].message + '</li>';\n-      }\n+  const objectInArray = [{\n+      id: 1,\n+  }, {\n+      id: 2,\n+  }];\n \n-      return items + '</ul>';\n-    }\n+  const numberInArray = [\n+      1, 2,\n+  ];\n \n-    // good\n-    function inbox(messages) {\n-      items = [];\n+  // good\n+  const arr = [[0, 1], [2, 3], [4, 5]];\n \n-      for (i = 0; i < length; i++) {\n-        items[i] = messages[i].message;\n-      }\n+  const objectInArray = [\n+      {\n+          id: 1,\n+      },\n+      {\n+          id: 2,\n+      },\n+  ];\n \n-      return '<ul><li>' + items.join('</li><li>') + '</li></ul>';\n-    }\n-    ```\n+  const numberInArray = [\n+      1,\n+      2,\n+  ];\n+  ```\n \n **[⬆ back to top](#table-of-contents)**\n \n+## Destructuring\n \n-## Functions\n+  <a name=\"destructuring--object\"></a><a name=\"5.1\"></a>\n+  - [5.1](#destructuring--object) Use object destructuring when accessing and using multiple properties of an object. jscs: [`requireObjectDestructuring`](http://jscs.info/rule/requireObjectDestructuring)\n \n-  - Function expressions:\n+    > Why? Destructuring saves you from creating temporary references for those properties.\n \n     ```javascript\n-    // anonymous function expression - note the space between the function keyword and the param list\n-    var anonymous = function () {\n-      return true;\n-    };\n+    // bad\n+    function getFullName(user) {\n+        const firstName = user.firstName;\n+        const lastName = user.lastName;\n \n-    // named function expression\n-    var named = function named() {\n-      return true;\n-    };\n+        return `${firstName} ${lastName}`;\n+    }\n \n-    // immediately-invoked function expression (IIFE)\n-    (function() {\n-      console.log('Welcome to the Internet. Please follow me.');\n-    })();\n+    // good\n+    function getFullName(user) {\n+        const { firstName, lastName } = user;\n+        return `${firstName} ${lastName}`;\n+    }\n+\n+    // best\n+    function getFullName({ firstName, lastName }) {\n+        return `${firstName} ${lastName}`;\n+    }\n     ```\n \n-  - 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.\n-  - **Note:** ECMA-262 defines a `block` as a list of statements. A function declaration is not a statement. [Read ECMA-262's note on this issue](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97).\n+  <a name=\"destructuring--array\"></a><a name=\"5.2\"></a>\n+  - [5.2](#destructuring--array) Use array destructuring. jscs: [`requireArrayDestructuring`](http://jscs.info/rule/requireArrayDestructuring)\n \n     ```javascript\n+    const arr = [1, 2, 3, 4];\n+\n     // bad\n-    if (currentUser) {\n-      function test() {\n-        console.log('Nope.');\n-      }\n-    }\n+    const first = arr[0];\n+    const second = arr[1];\n \n     // good\n-    var test;\n-    if (currentUser) {\n-      test = function test() {\n-        console.log('Yup.');\n-      };\n-    }\n+    const [first, second] = arr;\n     ```\n \n-  - Never name a parameter `arguments`, this will take precedence over the `arguments` object that is given to every function scope.\n+  <a name=\"destructuring--object-over-array\"></a><a name=\"5.3\"></a>\n+  - [5.3](#destructuring--object-over-array) Use object destructuring for multiple return values, not array destructuring. jscs: [`disallowArrayDestructuringReturn`](http://jscs.info/rule/disallowArrayDestructuringReturn)\n+\n+    > Why? You can add new properties over time or change the order of things without breaking call sites.\n \n     ```javascript\n     // bad\n-    function nope(name, options, arguments) {\n-      // ...stuff...\n+    function processInput(input) {\n+        // then a miracle occurs\n+        return [left, right, top, bottom];\n     }\n \n+    // the caller needs to think about the order of return data\n+    const [left, __, top] = processInput(input);\n+\n     // good\n-    function yup(name, options, args) {\n-      // ...stuff...\n+    function processInput(input) {\n+        // then a miracle occurs\n+        return { left, right, top, bottom };\n     }\n+\n+    // the caller selects only the data they need\n+    const { left, top } = processInput(input);\n     ```\n \n+\n **[⬆ back to top](#table-of-contents)**\n \n+## Strings\n \n+  <a name=\"strings--quotes\"></a><a name=\"6.1\"></a>\n+  - [6.1](#strings--quotes) Use single quotes `''` for strings. eslint: [`quotes`](http://eslint.org/docs/rules/quotes.html) jscs: [`validateQuoteMarks`](http://jscs.info/rule/validateQuoteMarks)\n \n-## Properties\n+    ```javascript\n+    // bad\n+    const name = \"Capt. Janeway\";\n+\n+    // bad - template literals should contain interpolation or newlines\n+    const name = `Capt. Janeway`;\n+\n+    // good\n+    const name = 'Capt. Janeway';\n+    ```\n+\n+  <a name=\"strings--line-length\"></a><a name=\"6.2\"></a>\n+  - [6.2](#strings--line-length) Strings that cause the line to go over 100/120 characters should not be written across multiple lines using string concatenation.\n \n-  - Use dot notation when accessing properties.\n+    > Why? Broken strings are painful to work with and make code less searchable.\n \n     ```javascript\n-    var luke = {\n-      jedi: true,\n-      age: 28\n-    };\n+    // bad\n+    const errorMessage = 'This is a super long error that was thrown because \\\n+    of Batman. When you stop to think about how Batman had anything to do \\\n+    with this, you would get nowhere \\\n+    fast.';\n \n     // bad\n-    var isJedi = luke['jedi'];\n+    const errorMessage = 'This is a super long error that was thrown because ' +\n+        'of Batman. When you stop to think about how Batman had anything to do ' +\n+        'with this, you would get nowhere fast.';\n \n     // good\n-    var isJedi = luke.jedi;\n+    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.';\n     ```\n \n-  - Use subscript notation `[]` when accessing properties with a variable.\n+  <a name=\"es6-template-literals\"></a><a name=\"6.4\"></a>\n+  - [6.3](#es6-template-literals) When programmatically building up strings, use template strings instead of concatenation. eslint: [`prefer-template`](http://eslint.org/docs/rules/prefer-template.html) [`template-curly-spacing`](http://eslint.org/docs/rules/template-curly-spacing) jscs: [`requireTemplateStrings`](http://jscs.info/rule/requireTemplateStrings)\n+\n+    > Why? Template strings give you a readable, concise syntax with proper newlines and string interpolation features.\n \n     ```javascript\n-    var luke = {\n-      jedi: true,\n-      age: 28\n-    };\n+    // bad\n+    function sayHi(name) {\n+        return 'How are you, ' + name + '?';\n+    }\n \n-    function getProp(prop) {\n-      return luke[prop];\n+    // bad\n+    function sayHi(name) {\n+        return ['How are you, ', name, '?'].join();\n     }\n \n-    var isJedi = getProp('jedi');\n-    ```\n+    // bad\n+    function sayHi(name) {\n+        return `How are you, ${ name }?`;\n+    }\n \n-**[⬆ back to top](#table-of-contents)**\n+    // good\n+    function sayHi(name) {\n+        return `How are you, ${name}?`;\n+    }\n+    ```\n \n+  <a name=\"strings--eval\"></a><a name=\"6.5\"></a>\n+  - [6.4](#strings--eval) Never use `eval()` on a string, it opens too many vulnerabilities.\n \n-## Variables\n+  <a name=\"strings--escaping\"></a>\n+  - [6.5](#strings--escaping) Do not unnecessarily escape characters in strings. eslint: [`no-useless-escape`](http://eslint.org/docs/rules/no-useless-escape)\n \n-  - Always use `var` to declare variables. Not doing so will result in global variables. We want to avoid polluting the global namespace. Captain Planet warned us of that.\n+    > Why? Backslashes harm readability, thus they should only be present when necessary.\n \n     ```javascript\n     // bad\n-    superPower = new SuperPower();\n+    const foo = '\\'this\\' \\i\\s \\\"quoted\\\"';\n \n     // good\n-    var superPower = new SuperPower();\n+    const foo = '\\'this\\' is \"quoted\"';\n+    const foo = `my name is '${name}'`;\n     ```\n \n-  - Use one `var` declaration per variable.\n-    It's easier to add new variable declarations this way, and you never have\n-    to worry about swapping out a `;` for a `,` or introducing punctuation-only\n-    diffs. \n+**[⬆ back to top](#table-of-contents)**\n+\n+\n+## Functions\n+\n+  <a name=\"functions--declarations\"></a><a name=\"7.1\"></a>\n+  - [7.1](#functions--declarations) Use named function expressions instead of function declarations. eslint: [`func-style`](http://eslint.org/docs/rules/func-style) jscs: [`disallowFunctionDeclarations`](http://jscs.info/rule/disallowFunctionDeclarations)\n+\n+    > 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 name the expression - anonymous functions can make it harder to locate the problem in an Error's call stack. ([Discussion](https://github.com/airbnb/javascript/issues/794))\n \n     ```javascript\n     // bad\n-    var items = getItems(),\n-        goSportsTeam = true,\n-        dragonball = 'z';\n+    function foo() {\n+        // ...\n+    }\n \n     // bad\n-    // (compare to above, and try to spot the mistake)\n-    var items = getItems(),\n-        goSportsTeam = true;\n-        dragonball = 'z';\n+    const foo = function () {\n+        // ...\n+    };\n \n     // good\n-    var items = getItems();\n-    var goSportsTeam = true;\n-    var dragonball = 'z';\n+    const foo = function bar() {\n+        // ...\n+    };\n     ```\n \n-  - Declare unassigned variables last. This is helpful when later on you might need to assign a variable depending on one of the previous assigned variables.\n+  <a name=\"functions--in-blocks\"></a><a name=\"7.2\"></a>\n+  - [7.2](#functions--in-blocks) Never declare a function in a non-function block (if, while, etc). Assign the function to a variable instead. Browsers will allow you to do it, but they all interpret it differently, which is bad news bears. eslint: [`no-loop-func`](http://eslint.org/docs/rules/no-loop-func.html)\n \n-    ```javascript\n-    // bad\n-    var i, len, dragonball,\n-        items = getItems(),\n-        goSportsTeam = true;\n+  <a name=\"functions--note-on-blocks\"></a><a name=\"7.3\"></a>\n+  - [7.3](#functions--note-on-blocks) **Note:** ECMA-262 defines a `block` as a list of statements. A function declaration is not a statement. [Read ECMA-262's note on this issue](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97).\n \n+    ```javascript\n     // bad\n-    var i;\n-    var items = getItems();\n-    var dragonball;\n-    var goSportsTeam = true;\n-    var len;\n+    if (currentUser) {\n+        function test() {\n+            console.log('Nope.');\n+        }\n+    }\n \n     // good\n-    var items = getItems();\n-    var goSportsTeam = true;\n-    var dragonball;\n-    var length;\n-    var i;\n+    let test;\n+    if (currentUser) {\n+        test = () => {\n+            console.log('Yup.');\n+        };\n+    }\n     ```\n \n-  - Assign variables at the top of their scope. This helps avoid issues with variable declaration and assignment hoisting related issues.\n+  <a name=\"functions--arguments-shadow\"></a><a name=\"7.4\"></a>\n+  - [7.4](#functions--arguments-shadow) Never name a parameter `arguments`. This will take precedence over the `arguments` object that is given to every function scope.\n \n     ```javascript\n     // bad\n-    function() {\n-      test();\n-      console.log('doing stuff..');\n+    function foo(name, options, arguments) {\n+        // ...\n+    }\n \n-      //..other stuff..\n+    // good\n+    function foo(name, options, args) {\n+        // ...\n+    }\n+    ```\n \n-      var name = getName();\n+  <a name=\"es6-rest\"></a><a name=\"7.5\"></a>\n+  - [7.5](#es6-rest) Never use `arguments`, opt to use rest syntax `...` instead. eslint: [`prefer-rest-params`](http://eslint.org/docs/rules/prefer-rest-params)\n \n-      if (name === 'test') {\n-        return false;\n-      }\n+    > Why? `...` is explicit about which arguments you want pulled. Plus, rest arguments are a real Array, and not merely Array-like like `arguments`.\n \n-      return name;\n+    ```javascript\n+    // bad\n+    function concatenateAll() {\n+        const args = Array.prototype.slice.call(arguments);\n+        return args.join('');\n     }\n \n     // good\n-    function() {\n-      var name = getName();\n+    function concatenateAll(...args) {\n+        return args.join('');\n+    }\n+    ```\n \n-      test();\n-      console.log('doing stuff..');\n+  <a name=\"es6-default-parameters\"></a><a name=\"7.6\"></a>\n+  - [7.6](#es6-default-parameters) Use default parameter syntax rather than mutating function arguments.\n \n-      //..other stuff..\n+    ```javascript\n+    // really bad\n+    function handleThings(opts) {\n+        // No! We shouldn't mutate function arguments.\n+        // Double bad: if opts is falsy it'll be set to an object which may\n+        // be what you want but it can introduce subtle bugs.\n+        opts = opts || {};\n+        // ...\n+    }\n \n-      if (name === 'test') {\n-        return false;\n-      }\n+    // still bad\n+    function handleThings(opts) {\n+        if (opts === void 0) {\n+          opts = {};\n+        }\n+        // ...\n+    }\n \n-      return name;\n+    // good\n+    function handleThings(opts = {}) {\n+        // ...\n     }\n+    ```\n \n-    // bad\n-    function() {\n-      var name = getName();\n+  <a name=\"functions--default-side-effects\"></a><a name=\"7.7\"></a>\n+  - [7.7](#functions--default-side-effects) Avoid side effects with default parameters. A default parameter should always be an assignment to a specific value.\n \n-      if (!arguments.length) {\n-        return false;\n-      }\n+    > Why? They are confusing to reason about.\n \n-      return true;\n+    ```javascript\n+    var b = 1;\n+    // bad\n+    function count(a = b++) {\n+        console.log(a);\n     }\n+    count();  // 1\n+    count();  // 2\n+    count(3); // 3\n+    count();  // 3\n \n     // good\n-    function() {\n-      if (!arguments.length) {\n-        return false;\n-      }\n+    function example(num = 5, options = {}) {\n+        // ...\n+    }\n+    ```\n+\n+  <a name=\"functions--defaults-last\"></a><a name=\"7.8\"></a>\n+  - [7.8](#functions--defaults-last) Always put default parameters last.\n \n-      var name = getName();\n+    ```javascript\n+    // bad\n+    function handleThings(opts = {}, name) {\n+        // ...\n+    }\n \n-      return true;\n+    // good\n+    function handleThings(name, opts = {}) {\n+        // ...\n     }\n     ```\n \n-**[⬆ back to top](#table-of-contents)**\n+  <a name=\"functions--constructor\"></a><a name=\"7.9\"></a>\n+  - [7.9](#functions--constructor) Never use the Function constructor to create a new function. eslint: [`no-new-func`](http://eslint.org/docs/rules/no-new-func)\n \n+    > Why? Creating a function in this way evaluates a string similarly to eval(), which opens vulnerabilities.\n \n-## Hoisting\n+    ```javascript\n+    // bad\n+    const add = new Function('a', 'b', 'return a + b');\n \n-  - Variable declarations get hoisted to the top of their scope, their assignment does not.\n+    // still bad\n+    const subtract = Function('a', 'b', 'return a - b');\n+    ```\n \n-    ```javascript\n-    // we know this wouldn't work (assuming there\n-    // is no notDefined global variable)\n-    function example() {\n-      console.log(notDefined); // => throws a ReferenceError\n-    }\n+  <a name=\"functions--signature-spacing\"></a><a name=\"7.10\"></a>\n+  - [7.10](#functions--signature-spacing) Spacing in a function signature. eslint: [`space-before-function-paren`](http://eslint.org/docs/rules/space-before-function-paren) [`space-before-blocks`](http://eslint.org/docs/rules/space-before-blocks)\n \n-    // creating a variable declaration after you\n-    // reference the variable will work due to\n-    // variable hoisting. Note: the assignment\n-    // value of `true` is not hoisted.\n-    function example() {\n-      console.log(declaredButNotAssigned); // => undefined\n-      var declaredButNotAssigned = true;\n-    }\n+    > Why? Consistency is good, and you shouldn’t have to add or remove a space when adding or removing a name.\n \n-    // The interpreter is hoisting the variable\n-    // declaration to the top of the scope.\n-    // Which means our example could be rewritten as:\n-    function example() {\n-      var declaredButNotAssigned;\n-      console.log(declaredButNotAssigned); // => undefined\n-      declaredButNotAssigned = true;\n-    }\n+    ```javascript\n+    // bad\n+    const f = function(){};\n+    const g = function (){};\n+    const h = function() {};\n+\n+    // good\n+    const y = function a() {};\n     ```\n \n-  - Anonymous function expressions hoist their variable name, but not the function assignment.\n+  <a name=\"functions--naming\"></a><a name=\"7.11\"></a>\n+  - [7.11](#functions--naming) Always name functions or use arrow functions. Arrow functions can (and should) be used whenever the their scope does not require its own `this`, `arguments`, `super` or `new.target`.\n \n-    ```javascript\n-    function example() {\n-      console.log(anonymous); // => undefined\n+  > Why? Arrow functions are concise and elegant, plus they preserve the scope of the outer block thus eliminating the need to save a reference to `this`.\n+\n+  ```javascript\n+  // bad\n+  const f = function () {};\n+\n+  // good\n+  const g = function g() {};\n+\n+  // better\n+  // this implicitly sets the function's name to 'h'\n+  const h = () => {}\n+  ```\n \n-      anonymous(); // => TypeError anonymous is not a function\n+  <a name=\"functions--mutate-params\"></a><a name=\"7.12\"></a>\n+  - [7.12](#functions--mutate-params) Never mutate parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)\n \n-      var anonymous = function() {\n-        console.log('anonymous function expression');\n-      };\n+    > Why? Manipulating objects passed in as parameters can cause unwanted variable side effects in the original caller.\n+\n+    ```javascript\n+    // bad\n+    function f1(obj) {\n+        obj.key = 1;\n+    }\n+\n+    // good\n+    function f2(obj) {\n+        const key = Object.prototype.hasOwnProperty.call(obj, 'key') ? obj.key : 1;\n     }\n     ```\n \n-  - Named function expressions hoist the variable name, not the function name or the function body.\n+  <a name=\"functions--reassign-params\"></a><a name=\"7.13\"></a>\n+  - [7.13](#functions--reassign-params) Never reassign parameters. eslint: [`no-param-reassign`](http://eslint.org/docs/rules/no-param-reassign.html)\n+\n+    > Why? Reassigning parameters can lead to unexpected behavior, especially when accessing the `arguments` object. It can also cause optimization issues, especially in V8.\n \n     ```javascript\n-    function example() {\n-      console.log(named); // => undefined\n+    // bad\n+    function f1(a) {\n+        a = 1;\n+        // ...\n+    }\n \n-      named(); // => TypeError named is not a function\n+    function f2(a) {\n+        if (!a) { a = 1; }\n+        // ...\n+    }\n \n-      superPower(); // => ReferenceError superPower is not defined\n+    // good\n+    function f3(a) {\n+        const b = a || 1;\n+        // ...\n+    }\n \n-      var named = function superPower() {\n-        console.log('Flying');\n-      };\n+    function f4(a = 1) {\n+        // ...\n     }\n+    ```\n \n-    // the same is true when the function name\n-    // is the same as the variable name.\n-    function example() {\n-      console.log(named); // => undefined\n+  <a name=\"functions--spread-vs-apply\"></a><a name=\"7.14\"></a>\n+  - [7.14](#functions--spread-vs-apply) Prefer the use of the spread operator `...` to call variadic functions. eslint: [`prefer-spread`](http://eslint.org/docs/rules/prefer-spread)\n \n-      named(); // => TypeError named is not a function\n+    > Why? It's cleaner, you don't need to supply a context, and you can not easily compose `new` with `apply`.\n \n-      var named = function named() {\n-        console.log('named');\n-      }\n-    }\n+    ```javascript\n+    // bad\n+    const x = [1, 2, 3, 4, 5];\n+    console.log.apply(console, x);\n+\n+    // good\n+    const x = [1, 2, 3, 4, 5];\n+    console.log(...x);\n+\n+    // bad\n+    new (Function.prototype.bind.apply(Date, [null, 2016, 8, 5]));\n+\n+    // good\n+    new Date(...[2016, 8, 5]);\n     ```\n \n-  - Function declarations hoist their name and the function body.\n+  <a name=\"functions--signature-invocation-indentation\"></a>\n+  - [7.15](#functions--signature-invocation-indentation) 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.\n \n     ```javascript\n-    function example() {\n-      superPower(); // => Flying\n+    // bad\n+    function foo(bar,\n+                 baz,\n+                 quux) {\n+      // ...\n+    }\n \n-      function superPower() {\n-        console.log('Flying');\n-      }\n+    // good\n+    function foo(\n+        bar,\n+        baz,\n+        quux,\n+    ) {\n+        // ...\n     }\n-    ```\n \n-  - For more information refer to [JavaScript Scoping & Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting) by [Ben Cherry](http://www.adequatelygood.com/)\n+    // bad\n+    console.log(foo,\n+        bar,\n+        baz);\n+\n+    // good\n+    console.log(\n+        foo,\n+        bar,\n+        baz,\n+    );\n+    ```\n \n **[⬆ back to top](#table-of-contents)**\n \n+## Arrow Functions\n \n+  <a name=\"arrows--use-them\"></a><a name=\"8.1\"></a>\n+  - [8.1](#arrows--use-them) When you must use function expressions (as when passing an anonymous function), use arrow function notation. eslint: [`prefer-arrow-callback`](http://eslint.org/docs/rules/prefer-arrow-callback.html), [`arrow-spacing`](http://eslint.org/docs/rules/arrow-spacing.html) jscs: [`requireArrowFunctions`](http://jscs.info/rule/requireArrowFunctions)\n \n-## Conditional Expressions & Equality\n-\n-  - Use `===` and `!==` over `==` and `!=`.\n-  - Conditional expressions are evaluated using coercion with the `ToBoolean` method and always follow these simple rules:\n+    > 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.\n \n-    + **Objects** evaluate to **true**\n-    + **Undefined** evaluates to **false**\n-    + **Null** evaluates to **false**\n-    + **Booleans** evaluate to **the value of the boolean**\n-    + **Numbers** evaluate to **false** if **+0, -0, or NaN**, otherwise **true**\n-    + **Strings** evaluate to **false** if an empty string `''`, otherwise **true**\n+    > Why not? If you have a fairly complicated function, you might move that logic out into its own function declaration.\n \n     ```javascript\n-    if ([0]) {\n-      // true\n-      // An array is an object, objects evaluate to true\n+    // bad\n+    [1, 2, 3].map(function (x) {\n+        const y = x + 1;\n+        return x * y;\n+    });\n+\n+    // good\n+    [1, 2, 3].map((x) => {\n+        const y = x + 1;\n+        return x * y;\n+    });\n+    ```\n+\n+  <a name=\"arrows--implicit-return\"></a><a name=\"8.2\"></a>\n+  - [8.2](#arrows--implicit-return) If the function body consists of a single expression, omit the braces and use the implicit return. Otherwise, keep the braces and use a `return` statement. eslint: [`arrow-parens`](http://eslint.org/docs/rules/arrow-parens.html), [`arrow-body-style`](http://eslint.org/docs/rules/arrow-body-style.html) jscs:  [`disallowParenthesesAroundArrowParam`](http://jscs.info/rule/disallowParenthesesAroundArrowParam), [`requireShorthandArrowFunctions`](http://jscs.info/rule/requireShorthandArrowFunctions)","path":"README.md","position":1136,"original_position":1136,"commit_id":"68f3c0142ec3b497fa983c2d0f45b146ca899d63","original_commit_id":"68f3c0142ec3b497fa983c2d0f45b146ca899d63","user":{"login":"adressel","id":5394703,"avatar_url":"https://avatars2.githubusercontent.com/u/5394703?v=3","gravatar_id":"","url":"https://api.github.com/users/adressel","html_url":"https://github.com/adressel","followers_url":"https://api.github.com/users/adressel/followers","following_url":"https://api.github.com/users/adressel/following{/other_user}","gists_url":"https://api.github.com/users/adressel/gists{/gist_id}","starred_url":"https://api.github.com/users/adressel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adressel/subscriptions","organizations_url":"https://api.github.com/users/adressel/orgs","repos_url":"https://api.github.com/users/adressel/repos","events_url":"https://api.github.com/users/adressel/events{/privacy}","received_events_url":"https://api.github.com/users/adressel/received_events","type":"User","site_admin":false},"body":"I'll change this rule slightly. I think that arrow functions should always be used without curly braces if possible. We should discuss whether or not to include parentheses around a single argument in this case (as I know that there are different opinions on the team). ","created_at":"2017-05-03T22:18:30Z","updated_at":"2017-05-03T22:18:30Z","html_url":"https://github.com/signpost/javascript/pull/4#discussion_r114666547","pull_request_url":"https://api.github.com/repos/signpost/javascript/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/signpost/javascript/pulls/comments/114666547"},"html":{"href":"https://github.com/signpost/javascript/pull/4#discussion_r114666547"},"pull_request":{"href":"https://api.github.com/repos/signpost/javascript/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/signpost/javascript/pulls/4","id":118853409,"html_url":"https://github.com/signpost/javascript/pull/4","diff_url":"https://github.com/signpost/javascript/pull/4.diff","patch_url":"https://github.com/signpost/javascript/pull/4.patch","issue_url":"https://api.github.com/repos/signpost/javascript/issues/4","number":4,"state":"open","locked":false,"title":"Update signpost styleguide (readme)","user":{"login":"adressel","id":5394703,"avatar_url":"https://avatars2.githubusercontent.com/u/5394703?v=3","gravatar_id":"","url":"https://api.github.com/users/adressel","html_url":"https://github.com/adressel","followers_url":"https://api.github.com/users/adressel/followers","following_url":"https://api.github.com/users/adressel/following{/other_user}","gists_url":"https://api.github.com/users/adressel/gists{/gist_id}","starred_url":"https://api.github.com/users/adressel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adressel/subscriptions","organizations_url":"https://api.github.com/users/adressel/orgs","repos_url":"https://api.github.com/users/adressel/repos","events_url":"https://api.github.com/users/adressel/events{/privacy}","received_events_url":"https://api.github.com/users/adressel/received_events","type":"User","site_admin":false},"body":"This PR's goal is to discuss and then update the README in Signpost's javascript style guide. While there are other files from the merge with airbnb/master, let's please focus on discussing the file README.md on the top level of this repository.\r\nIn a subsequent PR, I intend to update the linters with the rules we agree on.\r\n\r\nThanks to Matt E for giving me some of his inputs!","created_at":"2017-05-03T20:58:13Z","updated_at":"2017-05-03T22:18:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b0282fcd93b495fa1fda8f4fa3efd2c96d48382f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/signpost/javascript/pulls/4/commits","review_comments_url":"https://api.github.com/repos/signpost/javascript/pulls/4/comments","review_comment_url":"https://api.github.com/repos/signpost/javascript/pulls/comments{/number}","comments_url":"https://api.github.com/repos/signpost/javascript/issues/4/comments","statuses_url":"https://api.github.com/repos/signpost/javascript/statuses/68f3c0142ec3b497fa983c2d0f45b146ca899d63","head":{"label":"adressel:master","ref":"master","sha":"68f3c0142ec3b497fa983c2d0f45b146ca899d63","user":{"login":"adressel","id":5394703,"avatar_url":"https://avatars2.githubusercontent.com/u/5394703?v=3","gravatar_id":"","url":"https://api.github.com/users/adressel","html_url":"https://github.com/adressel","followers_url":"https://api.github.com/users/adressel/followers","following_url":"https://api.github.com/users/adressel/following{/other_user}","gists_url":"https://api.github.com/users/adressel/gists{/gist_id}","starred_url":"https://api.github.com/users/adressel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adressel/subscriptions","organizations_url":"https://api.github.com/users/adressel/orgs","repos_url":"https://api.github.com/users/adressel/repos","events_url":"https://api.github.com/users/adressel/events{/privacy}","received_events_url":"https://api.github.com/users/adressel/received_events","type":"User","site_admin":false},"repo":{"id":89613969,"name":"javascript","full_name":"adressel/javascript","owner":{"login":"adressel","id":5394703,"avatar_url":"https://avatars2.githubusercontent.com/u/5394703?v=3","gravatar_id":"","url":"https://api.github.com/users/adressel","html_url":"https://github.com/adressel","followers_url":"https://api.github.com/users/adressel/followers","following_url":"https://api.github.com/users/adressel/following{/other_user}","gists_url":"https://api.github.com/users/adressel/gists{/gist_id}","starred_url":"https://api.github.com/users/adressel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adressel/subscriptions","organizations_url":"https://api.github.com/users/adressel/orgs","repos_url":"https://api.github.com/users/adressel/repos","events_url":"https://api.github.com/users/adressel/events{/privacy}","received_events_url":"https://api.github.com/users/adressel/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/adressel/javascript","description":"JavaScript Style Guide","fork":true,"url":"https://api.github.com/repos/adressel/javascript","forks_url":"https://api.github.com/repos/adressel/javascript/forks","keys_url":"https://api.github.com/repos/adressel/javascript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adressel/javascript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adressel/javascript/teams","hooks_url":"https://api.github.com/repos/adressel/javascript/hooks","issue_events_url":"https://api.github.com/repos/adressel/javascript/issues/events{/number}","events_url":"https://api.github.com/repos/adressel/javascript/events","assignees_url":"https://api.github.com/repos/adressel/javascript/assignees{/user}","branches_url":"https://api.github.com/repos/adressel/javascript/branches{/branch}","tags_url":"https://api.github.com/repos/adressel/javascript/tags","blobs_url":"https://api.github.com/repos/adressel/javascript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adressel/javascript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adressel/javascript/git/refs{/sha}","trees_url":"https://api.github.com/repos/adressel/javascript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adressel/javascript/statuses/{sha}","languages_url":"https://api.github.com/repos/adressel/javascript/languages","stargazers_url":"https://api.github.com/repos/adressel/javascript/stargazers","contributors_url":"https://api.github.com/repos/adressel/javascript/contributors","subscribers_url":"https://api.github.com/repos/adressel/javascript/subscribers","subscription_url":"https://api.github.com/repos/adressel/javascript/subscription","commits_url":"https://api.github.com/repos/adressel/javascript/commits{/sha}","git_commits_url":"https://api.github.com/repos/adressel/javascript/git/commits{/sha}","comments_url":"https://api.github.com/repos/adressel/javascript/comments{/number}","issue_comment_url":"https://api.github.com/repos/adressel/javascript/issues/comments{/number}","contents_url":"https://api.github.com/repos/adressel/javascript/contents/{+path}","compare_url":"https://api.github.com/repos/adressel/javascript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adressel/javascript/merges","archive_url":"https://api.github.com/repos/adressel/javascript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adressel/javascript/downloads","issues_url":"https://api.github.com/repos/adressel/javascript/issues{/number}","pulls_url":"https://api.github.com/repos/adressel/javascript/pulls{/number}","milestones_url":"https://api.github.com/repos/adressel/javascript/milestones{/number}","notifications_url":"https://api.github.com/repos/adressel/javascript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adressel/javascript/labels{/name}","releases_url":"https://api.github.com/repos/adressel/javascript/releases{/id}","deployments_url":"https://api.github.com/repos/adressel/javascript/deployments","created_at":"2017-04-27T15:42:30Z","updated_at":"2017-05-01T15:39:38Z","pushed_at":"2017-05-03T20:50:25Z","git_url":"git://github.com/adressel/javascript.git","ssh_url":"git@github.com:adressel/javascript.git","clone_url":"https://github.com/adressel/javascript.git","svn_url":"https://github.com/adressel/javascript","homepage":null,"size":407,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"signpost:master","ref":"master","sha":"07848b4f59e0020578111be643ba45f73d631753","user":{"login":"signpost","id":296903,"avatar_url":"https://avatars2.githubusercontent.com/u/296903?v=3","gravatar_id":"","url":"https://api.github.com/users/signpost","html_url":"https://github.com/signpost","followers_url":"https://api.github.com/users/signpost/followers","following_url":"https://api.github.com/users/signpost/following{/other_user}","gists_url":"https://api.github.com/users/signpost/gists{/gist_id}","starred_url":"https://api.github.com/users/signpost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signpost/subscriptions","organizations_url":"https://api.github.com/users/signpost/orgs","repos_url":"https://api.github.com/users/signpost/repos","events_url":"https://api.github.com/users/signpost/events{/privacy}","received_events_url":"https://api.github.com/users/signpost/received_events","type":"Organization","site_admin":false},"repo":{"id":27802226,"name":"javascript","full_name":"signpost/javascript","owner":{"login":"signpost","id":296903,"avatar_url":"https://avatars2.githubusercontent.com/u/296903?v=3","gravatar_id":"","url":"https://api.github.com/users/signpost","html_url":"https://github.com/signpost","followers_url":"https://api.github.com/users/signpost/followers","following_url":"https://api.github.com/users/signpost/following{/other_user}","gists_url":"https://api.github.com/users/signpost/gists{/gist_id}","starred_url":"https://api.github.com/users/signpost/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/signpost/subscriptions","organizations_url":"https://api.github.com/users/signpost/orgs","repos_url":"https://api.github.com/users/signpost/repos","events_url":"https://api.github.com/users/signpost/events{/privacy}","received_events_url":"https://api.github.com/users/signpost/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/signpost/javascript","description":"JavaScript Style Guide","fork":true,"url":"https://api.github.com/repos/signpost/javascript","forks_url":"https://api.github.com/repos/signpost/javascript/forks","keys_url":"https://api.github.com/repos/signpost/javascript/keys{/key_id}","collaborators_url":"https://api.github.com/repos/signpost/javascript/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/signpost/javascript/teams","hooks_url":"https://api.github.com/repos/signpost/javascript/hooks","issue_events_url":"https://api.github.com/repos/signpost/javascript/issues/events{/number}","events_url":"https://api.github.com/repos/signpost/javascript/events","assignees_url":"https://api.github.com/repos/signpost/javascript/assignees{/user}","branches_url":"https://api.github.com/repos/signpost/javascript/branches{/branch}","tags_url":"https://api.github.com/repos/signpost/javascript/tags","blobs_url":"https://api.github.com/repos/signpost/javascript/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/signpost/javascript/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/signpost/javascript/git/refs{/sha}","trees_url":"https://api.github.com/repos/signpost/javascript/git/trees{/sha}","statuses_url":"https://api.github.com/repos/signpost/javascript/statuses/{sha}","languages_url":"https://api.github.com/repos/signpost/javascript/languages","stargazers_url":"https://api.github.com/repos/signpost/javascript/stargazers","contributors_url":"https://api.github.com/repos/signpost/javascript/contributors","subscribers_url":"https://api.github.com/repos/signpost/javascript/subscribers","subscription_url":"https://api.github.com/repos/signpost/javascript/subscription","commits_url":"https://api.github.com/repos/signpost/javascript/commits{/sha}","git_commits_url":"https://api.github.com/repos/signpost/javascript/git/commits{/sha}","comments_url":"https://api.github.com/repos/signpost/javascript/comments{/number}","issue_comment_url":"https://api.github.com/repos/signpost/javascript/issues/comments{/number}","contents_url":"https://api.github.com/repos/signpost/javascript/contents/{+path}","compare_url":"https://api.github.com/repos/signpost/javascript/compare/{base}...{head}","merges_url":"https://api.github.com/repos/signpost/javascript/merges","archive_url":"https://api.github.com/repos/signpost/javascript/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/signpost/javascript/downloads","issues_url":"https://api.github.com/repos/signpost/javascript/issues{/number}","pulls_url":"https://api.github.com/repos/signpost/javascript/pulls{/number}","milestones_url":"https://api.github.com/repos/signpost/javascript/milestones{/number}","notifications_url":"https://api.github.com/repos/signpost/javascript/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/signpost/javascript/labels{/name}","releases_url":"https://api.github.com/repos/signpost/javascript/releases{/id}","deployments_url":"https://api.github.com/repos/signpost/javascript/deployments","created_at":"2014-12-10T04:29:34Z","updated_at":"2017-05-03T20:59:49Z","pushed_at":"2017-05-03T20:58:14Z","git_url":"git://github.com/signpost/javascript.git","ssh_url":"git@github.com:signpost/javascript.git","clone_url":"https://github.com/signpost/javascript.git","svn_url":"https://github.com/signpost/javascript","homepage":null,"size":591,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":1,"forks":4,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/signpost/javascript/pulls/4"},"html":{"href":"https://github.com/signpost/javascript/pull/4"},"issue":{"href":"https://api.github.com/repos/signpost/javascript/issues/4"},"comments":{"href":"https://api.github.com/repos/signpost/javascript/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/signpost/javascript/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/signpost/javascript/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/signpost/javascript/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/signpost/javascript/statuses/68f3c0142ec3b497fa983c2d0f45b146ca899d63"}}}}
{"actor":{"display_login":"adressel"}}