{"id":36383942,"url":"https://github.com/timofurrer/javascript-style-guide","last_synced_at":"2026-01-11T15:00:13.525Z","repository":{"id":6966209,"uuid":"8218880","full_name":"timofurrer/javascript-style-guide","owner":"timofurrer","description":"Ein vernünftiger Ansatz für einen JavaScript-Style-Guide","archived":true,"fork":false,"pushed_at":"2013-11-20T22:03:42.000Z","size":133,"stargazers_count":35,"open_issues_count":0,"forks_count":10,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-05-02T06:07:48.423Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timofurrer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-02-15T13:38:15.000Z","updated_at":"2023-10-23T11:45:27.000Z","dependencies_parsed_at":"2022-09-13T02:22:40.945Z","dependency_job_id":null,"html_url":"https://github.com/timofurrer/javascript-style-guide","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/timofurrer/javascript-style-guide","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fjavascript-style-guide","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fjavascript-style-guide/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fjavascript-style-guide/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fjavascript-style-guide/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timofurrer","download_url":"https://codeload.github.com/timofurrer/javascript-style-guide/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timofurrer%2Fjavascript-style-guide/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28309482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T14:58:17.114Z","status":"ssl_error","status_checked_at":"2026-01-11T14:55:53.580Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-11T15:00:12.220Z","updated_at":"2026-01-11T15:00:13.222Z","avatar_url":"https://github.com/timofurrer.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"Original Repository: [airbnb/javascript](https://github.com/airbnb/javascript)\n\n# Airbnb JavaScript Style Guide() {\n\n*Ein vernünftiger Ansatz für einen JavaScript-Style-Guide*\n\n\n## \u003ca name='TOC'\u003eInhaltsverzeichnis\u003c/a\u003e\n\n  1. [Datentypen](#types)\n  1. [Objekte](#objects)\n  1. [Arrays](#arrays)\n  1. [Zeichenketten](#strings)\n  1. [Funktionen](#functions)\n  1. [Eigenschaften](#properties)\n  1. [Variablen](#variables)\n  1. [Hoisting](#hoisting)\n  1. [Bedingungen und Gleichheit](#conditionals)\n  1. [Blöcke](#blocks)\n  1. [Kommentare](#comments)\n  1. [Whitespace](#whitespace)\n  1. [Führende Kommas](#leading-commas)\n  1. [Semikolons](#semicolons)\n  1. [Typumwandlung](#type-coercion)\n  1. [Namenskonventionen](#naming-conventions)\n  1. [Zugriffsmethoden](#accessors)\n  1. [Konstruktoren](#constructors)\n  1. [Events](#events)\n  1. [Module](#modules)\n  1. [jQuery](#jquery)\n  1. [ES5 Kompatibilität](#es5)\n  1. [Testing](#testing)\n  1. [Performance](#performance)\n  1. [Ressourcen](#resources)\n  1. [In the Wild](#in-the-wild)\n  1. [Übersetzungen](#translation)\n  1. [The JavaScript Style Guide Guide](#guide-guide)\n  1. [Contributors](#contributors)\n  1. [Lizenz](#license)\n\n## \u003ca name='types'\u003eDatentypen\u003c/a\u003e\n\n  - **Primitive Typen**: Bei primitiven Datentypen wird immer direkt auf deren Wert zugegriffen.\n\n    + `string`\n    + `number`\n    + `boolean`\n    + `null`\n    + `undefined`\n\n    ```javascript\n    var foo = 1,\n        bar = foo;\n\n    bar = 9;\n\n    console.log(foo, bar); // =\u003e 1, 9\n    ```\n  - **Komplexe Typen**: Bei komplexen Datentypen wird immer auf eine Referenz zugegriffen.\n\n    + `object`\n    + `array`\n    + `function`\n\n    ```javascript\n    var foo = [1, 2],\n        bar = foo;\n\n    bar[0] = 9;\n\n    console.log(foo[0], bar[0]); // =\u003e 9, 9\n    ```\n\n    **[[⬆]](#TOC)**\n\n## \u003ca name='objects'\u003eObjekte\u003c/a\u003e\n\n  - Benutze die `literal syntax`, um Objekte zu erzeugen.\n\n    ```javascript\n    // schlecht\n    var item = new Object();\n\n    // gut\n    var item = {};\n    ```\n\n  - Benutze keine [reservierten Wörter](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words) für Attribute.\n\n    ```javascript\n    // schlecht\n    var superman = {\n      class: 'superhero',\n      default: { clark: 'kent' },\n      private: true\n    };\n\n    // gut\n    var superman = {\n      klass: 'superhero',\n      defaults: { clark: 'kent' },\n      hidden: true\n    };\n    ```\n  - Benutze wenn dann geeignete Synonyme für die reservierten Wörter.\n  \n    ```javascript\n    // schlecht\n    var superman = {\n      class: 'alien'\n    };\n\n    // schlecht\n    var superman = {\n      klass: 'alien'\n    };\n    \n    // gut\n    var superman = {\n      type: 'alien'\n    };\n    ```\n    **[[⬆]](#TOC)**\n\n## \u003ca name='arrays'\u003eArrays\u003c/a\u003e\n\n  - Benutze die `literal syntax`, um Arrays zu erzeugen.\n\n    ```javascript\n    // schlecht\n    var items = new Array();\n\n    // gut\n    var items = [];\n    ```\n\n  - Wenn du die Array-Länge nicht kennst, benutze `Array#push`.\n\n    ```javascript\n    var someStack = [];\n\n\n    // schlecht\n    someStack[someStack.length] = 'abracadabra';\n\n    // gut\n    someStack.push('abracadabra');\n    ```\n\n  - Wenn du ein Array kopieren möchtest, benutze `Array#slice`. [jsPerf](http://jsperf.com/converting-arguments-to-an-array/7)\n\n    ```javascript\n    var len = items.length,\n        itemsCopy = [],\n        i;\n\n    // schlecht\n    for (i = 0; i \u003c len; i++) {\n      itemsCopy[i] = items[i];\n    }\n\n    // gut\n    itemsCopy = items.slice();\n    ```\n  \n  - Wenn du ein Array ähnliches Objekt kopieren möchtest, benutze `Array#slice`.\n    \n    ```javascript\n    function trigger() {\n      var args = Array.prototype.slice.call(arguments);\n      ...\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='strings'\u003eZeichenketten\u003c/a\u003e\n\n  - Benutze einfache Anführungszeichen `''` für Zeichenketten\n\n    ```javascript\n    // schlecht\n    var name = \"Bob Parr\";\n\n    // gut\n    var name = 'Bob Parr';\n\n    // schlecht\n    var fullName = \"Bob \" + this.lastName;\n\n    // gut\n    var fullName = 'Bob ' + this.lastName;\n    ```\n\n  - Zeichenketten die länger als 80 Zeichen lang sind, sollten mit Hilfe von `string concatenation` auf mehrere Zeilen aufgeteilt werden.\n  - Beachte: Benutzt man `string concatenation` zu oft kann dies die performance beeinträchtigen. [jsPerf](http://jsperf.com/ya-string-concat) \u0026 [Discussion](https://github.com/airbnb/javascript/issues/40)\n\n    ```javascript\n    // schlecht\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\n    // schlecht\n    var errorMessage = 'This is a super long error that \\\n    was thrown because of Batman. \\\n    When you stop to think about \\\n    how Batman had anything to do \\\n    with this, you would get nowhere \\\n    fast.';\n\n\n    // gut\n    var errorMessage = 'This is a super long error that ' +\n      'was thrown because of Batman.' +\n      'When you stop to think about ' +\n      'how Batman had anything to do ' +\n      'with this, you would get nowhere ' +\n      'fast.';\n    ```\n\n  - Wenn man im Programmverlauf eine Zeichenkette dynamisch zusammensetzen muss, sollte man `Array#join` einer `string concatenation` vorziehen. Vorallem für den IE. [jsPerf](http://jsperf.com/string-vs-array-concat/2).\n\n    ```javascript\n    var items,\n        messages,\n        length, i;\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\n    length = messages.length;\n\n    // schlecht\n    function inbox(messages) {\n      items = '\u003cul\u003e';\n\n      for (i = 0; i \u003c length; i++) {\n        items += '\u003cli\u003e' + messages[i].message + '\u003c/li\u003e';\n      }\n\n      return items + '\u003c/ul\u003e';\n    }\n\n    // gut\n    function inbox(messages) {\n      items = [];\n\n      for (i = 0; i \u003c length; i++) {\n        items[i] = messages[i].message;\n      }\n\n      return '\u003cul\u003e\u003cli\u003e' + items.join('\u003c/li\u003e\u003cli\u003e') + '\u003c/li\u003e\u003c/ul\u003e';\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='functions'\u003eFunktionen\u003c/a\u003e\n\n  - Funktionsausdrücke:\n\n    ```javascript\n    // anonyme Fuktionsausdrücke\n    var anonymous = function() {\n      return true;\n    };\n\n    // benannte Funktionsausdrücke\n    var named = function named() {\n      return true;\n    };\n\n    // direkt ausgeführte Funktionsausdrücke (IIFE)\n    (function() {\n      console.log('Welcome to the Internet. Please follow me.');\n    })();\n    ```\n\n  - Vermeide Funktionen in `non-function blocks` zu deklarieren. Anstelle sollte die Funktion einer Variablen zugewiesen werden. Dies hat den Grund, dass die verschiedenen Browser dies unterschiedlich interpretieren.\n  - **Beachte:** ECMA-262 definiert einen Block als eine Abfolge/Liste von Statements. Eine Funktion hingegen ist **kein** 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    // schlecht\n    if (currentUser) {\n      function test() {\n        console.log('Nope.');\n      }\n    }\n\n    // gut\n    if (currentUser) {\n      var test = function test() {\n        console.log('Yup.');\n      };\n    }\n    ```\n\n  - Benenne einen Parameter nie `arguments`, denn dies wird das `arguments`-Objekt, dass in jedem Funktionskörper zur Verfügung steht, überschreiben.\n\n    ```javascript\n    // schlecht\n    function nope(name, options, arguments) {\n      // ...stuff...\n    }\n\n    // gut\n    function yup(name, options, args) {\n      // ...stuff...\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n\n## \u003ca name='properties'\u003eEigenschaften\u003c/a\u003e\n\n  - Benutze die Punktnotation, um auf die Eigenschaften eines Objekts zuzugreifen.\n\n    ```javascript\n    var luke = {\n      jedi: true,\n      age: 28\n    };\n\n    // schlecht\n    var isJedi = luke['jedi'];\n\n    // gut\n    var isJedi = luke.jedi;\n    ```\n\n  - Benutze die Indexnotation `[]`, um auf die Eigenschaften eines Objekts zuzugreifen, sofern der Index eine Variable ist.\n\n    ```javascript\n    var luke = {\n      jedi: true,\n      age: 28\n    };\n\n    function getProp(prop) {\n      return luke[prop];\n    }\n\n    var isJedi = getProp('jedi');\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='variables'\u003eVariablen\u003c/a\u003e\n\n  - Benutze immer `var`, um Variablen zu deklarieren. Tut man dies nicht, werden die Variablen im globalen Namespace erzeugt – was nicht gewüscht werden sollte.\n\n    ```javascript\n    // schlecht\n    superPower = new SuperPower();\n\n    // gut\n    var superPower = new SuperPower();\n    ```\n\n  - Benutze immer nur ein `var`, um mehrere aufeinanderfolgende Variablen zu deklarieren. Deklariere jede Variable auf einer eigenen Zeile.\n\n    ```javascript\n    // schlecht\n    var items = getItems();\n    var goSportsTeam = true;\n    var dragonball = 'z';\n\n    // gut\n    var items = getItems(),\n        goSportsTeam = true,\n        dragonball = 'z';\n    ```\n\n  - Deklariere Variablen ohne direkte Zuweisung immer als letztes. Dies ist vorallem hilfreich, wenn man später eine Variable anhand einer zuvor deklarierten Variable initialisieren möchte.\n\n    ```javascript\n    // schlecht\n    var i, len, dragonball,\n        items = getItems(),\n        goSportsTeam = true;\n\n    // schlecht\n    var i, items = getItems(),\n        dragonball,\n        goSportsTeam = true,\n        len;\n\n    // gut\n    var items = getItems(),\n        goSportsTeam = true,\n        dragonball,\n        length,\n        i;\n    ```\n\n  - Weise den Wert einer Variable, wenn möglich, immer am Anfang des Gültigkeitsbereichs zu. Dies hilft Problemen mit der Variablendeklaration vorzubeugen.\n\n    ```javascript\n    // schlecht\n    function() {\n      test();\n      console.log('doing stuff..');\n\n      //..other stuff..\n\n      var name = getName();\n\n      if (name === 'test') {\n        return false;\n      }\n\n      return name;\n    }\n\n    // gut\n    function() {\n      var name = getName();\n\n      test();\n      console.log('doing stuff..');\n\n      //..other stuff..\n\n      if (name === 'test') {\n        return false;\n      }\n\n      return name;\n    }\n\n    // schlecht\n    function() {\n      var name = getName();\n\n      if (!arguments.length) {\n        return false;\n      }\n\n      return true;\n    }\n\n    // gut\n    function() {\n      if (!arguments.length) {\n        return false;\n      }\n\n      var name = getName();\n\n      return true;\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='hoisting'\u003eHoisting\u003c/a\u003e\n\n  - Variablendeklarationen werden vom Interpreter an den Beginn eines Gültigkeitbereichs genommen, genannt (`hoisting`). Wohingegen die Zuweisung an der ursprünglichen Stelle bleibt.\n\n    ```javascript\n    // Dies wird nicht funktionen (angenommen\n    // notDefined ist keine globale Variable)\n    function example() {\n      console.log(notDefined); // =\u003e throws a ReferenceError\n    }\n\n    // Wird eine Variable nach seiner ersten\n    // Referenzierung deklariert, funktioniert\n    // dies dank des hoistings.\n    // Beachte aber, dass die Zuweisung von true\n    // erst nach der Referenzierung stattfindet.\n    function example() {\n      console.log(declaredButNotAssigned); // =\u003e undefined\n      var declaredButNotAssigned = true;\n    }\n\n    // Der Interpreter nimmt die Variablendeklaration\n    // an den Beginn des Gültigkeitbereichs.\n    // So kann das Beispiel wiefolgt umgeschrieben\n    // werden:\n    function example() {\n      var declaredButNotAssigned;\n      console.log(declaredButNotAssigned); // =\u003e undefined\n      declaredButNotAssigned = true;\n    }\n    ```\n\n  - Anonyme Funktionen `hoisten` ihren Variablennamen, aber nicht die Funktionszuweisung.\n\n    ```javascript\n    function example() {\n      console.log(anonymous); // =\u003e undefined\n\n      anonymous(); // =\u003e TypeError anonymous is not a function\n\n      var anonymous = function() {\n        console.log('anonymous function expression');\n      };\n    }\n    ```\n\n  - Benannte Funktionen `hoisten` ihren Variablennamen, aber nicht der Funktionsname oder Funktionskörper.\n\n    ```javascript\n    function example() {\n      console.log(named); // =\u003e undefined\n\n      named(); // =\u003e TypeError named is not a function\n\n      superPower(); // =\u003e ReferenceError superPower is not defined\n\n      var named = function superPower() {\n        console.log('Flying');\n      };\n\n\n      // Das gleiche gilt, wenn der Funktionsname\n      // derselbe ist, wie der Variablenname\n      function example() {\n        console.log(named); // =\u003e undefined\n\n        named(); // =\u003e TypeError named is not a function\n\n        var named = function named() {\n          console.log('named');\n        };\n      }\n    }\n    ```\n\n  - Funktionsdeklarationen `hoisten` ihren Namen und ihren Funktionskörper.\n\n    ```javascript\n    function example() {\n      superPower(); // =\u003e Flying\n\n      function superPower() {\n        console.log('Flying');\n      }\n    }\n    ```\n\n  - Für weitere Informationen siehe hier: [JavaScript Scoping \u0026 Hoisting](http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting) by [Ben Cherry](http://www.adequatelygood.com/)\n\n    **[[⬆]](#TOC)**\n\n\n\n## \u003ca name='conditionals'\u003eBedingungen und Gleichheit\u003c/a\u003e\n\n  - Ziehe `===` und `!==` gegenüber `==` und `!=` vor.\n  - Bedingungsausdrücke werden immer gezwungen der `ToBoolean` Methode ausgewertet zu werden. Diese folgt den folgenden einfachen Grundregeln:\n\n    + **Objekte** werden als **true** gewertet\n    + **Undefined** wird als **false** gewertet\n    + **Null** wird als **false** gewertet\n    + **Booleans** werden als **der Wert des Booleans** gewertet\n    + **Zahlen** werden als **false** gewertet sofern **+0, -0, or NaN**, ansonsten als **true**\n    + **Zeichenketten** werden als **false** gewertet, sofern sie leer ist `''`, ansonsten als **true**\n\n    ```javascript\n    if ([0]) {\n      // true\n      // Arrays sind Objekte und Objekte werden als true ausgewertet\n    }\n    ```\n\n  - Benutze `shortcuts`\n\n    ```javascript\n    // schlecht\n    if (name !== '') {\n      // ...stuff...\n    }\n\n    // gut\n    if (name) {\n      // ...stuff...\n    }\n\n    // schlecht\n    if (collection.length \u003e 0) {\n      // ...stuff...\n    }\n\n    // gut\n    if (collection.length) {\n      // ...stuff...\n    }\n    ```\n\n  - Für weitere Informationen siehe hier: [Truth Equality and JavaScript](http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108) by Angus Croll\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='blocks'\u003eBlöcke\u003c/a\u003e\n\n  - Benutze geschweifte Klammern für alle mehrzeiligen Blöcke.\n\n    ```javascript\n    // schlecht\n    if (test)\n      return false;\n\n    // gut\n    if (test) return false;\n\n    // gut\n    if (test) {\n      return false;\n    }\n\n    // schlecht\n    function() { return false; }\n\n    // gut\n    function() {\n      return false;\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='comments'\u003eKommentare\u003c/a\u003e\n\n  - Benutze `/** ... */` für mehrzeilige Kommentare. Daran kann eine Beschreibung, eine Typendefinition und Werte für alle Parameter und den Rückgabewert angegeben werden.\n\n    ```javascript\n    // schlecht\n    // make() returns a new element\n    // based on the passed in tag name\n    //\n    // @param \u003cString\u003e tag\n    // @return \u003cElement\u003e element\n    function make(tag) {\n\n      // ...stuff...\n\n      return element;\n    }\n\n    // gut\n    /**\n     * make() returns a new element\n     * based on the passed in tag name\n     *\n     * @param \u003cString\u003e tag\n     * @return \u003cElement\u003e element\n     */\n    function make(tag) {\n\n      // ...stuff...\n\n      return element;\n    }\n    ```\n\n  - Benutze `//` für einzeilige Kommentare. Platziere den Kommentar auf einer separaten Zeile oberhalb der beschriebenen Zeile. Vor den Kommentar kommt eine Leerzeile.\n\n    ```javascript\n    // schlecht\n    var active = true;  // is current tab\n\n    // gut\n    // is current tab\n    var active = true;\n\n    // schlecht\n    function getType() {\n      console.log('fetching type...');\n      // set the default type to 'no type'\n      var type = this._type || 'no type';\n\n      return type;\n    }\n\n    // gut\n    function getType() {\n      console.log('fetching type...');\n\n      // set the default type to 'no type'\n      var type = this._type || 'no type';\n\n      return type;\n    }\n    ```\n  - Benutze wenn möglich die Prefixe `FIXME` oder `TODO` für die Kommentare. Sie erleichtert die Arbeit für andere Entwickler und sich selbst. So kann man Codestellen, die eine Verbesserung brauchen oder noch nicht implementiert sind, ohne grosse Mühe auffinden.\n  - Benutze `FIXME` um Probleme zu markieren\n    \n    ```javascript\n    function Calculator() {\n      \n      // FIXME: brauche eine globale Variable\n      total = 0;\n\n      return this;\n    }\n    ```\n  \n  - Benutze `TODO` um Hinweise für mögliche Lösungen für ein bestimmtes Problem zu geben, welches noch behoben werden muss.\n    \n    ```javascript\n    function Calculator() {      \n\n      // FIXME: dieses Member sollte über einen Parameter konfigurierbar sein\n      this.total = 0;\n\n      return this;\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='whitespace'\u003eWhitespace\u003c/a\u003e\n\n  - Benutze weiche Tabulatoren (`soft tabs`) mit 2 Leerzeichen.\n\n    ```javascript\n    // schlecht\n    function() {\n    ∙∙∙∙var name;\n    }\n\n    // schlecht\n    function() {\n    ∙var name;\n    }\n\n    // gut\n    function() {\n    ∙∙var name;\n    }\n    ```\n  - Platziere ein Leerzeichen vor einer öffnenden Klammer.\n\n    ```javascript\n    // schlecht\n    function test(){\n      console.log('test');\n    }\n\n    // gut\n    function test() {\n      console.log('test');\n    }\n\n    // schlecht\n    dog.set('attr',{\n      age: '1 year',\n      breed: 'Bernese Mountain Dog'\n    });\n\n    // gut\n    dog.set('attr', {\n      age: '1 year',\n      breed: 'Bernese Mountain Dog'\n    });\n    ```\n  - Platziere eine Leerzeile an das Ende der Datei.\n\n    ```javascript\n    // schlecht\n    (function(global) {\n      // ...stuff...\n    })(this);\n    ```\n\n    ```javascript\n    // gut\n    (function(global) {\n      // ...stuff...\n    })(this);\n\n    ```\n\n  - Rücke bei langen Methodenverkettungen ein.\n\n    ```javascript\n    // schlecht\n    $('#items').find('.selected').highlight().end().find('.open').updateCount();\n\n    // gut\n    $('#items')\n      .find('.selected')\n        .highlight()\n        .end()\n      .find('.open')\n        .updateCount();\n\n    // schlecht\n    var leds = stage.selectAll('.led').data(data).enter().append(\"svg:svg\").class('led', true)\n        .attr('width',  (radius + margin) * 2).append(\"svg:g\")\n        .attr(\"transform\", \"translate(\" + (radius + margin) + \",\" + (radius + margin) + \")\")\n        .call(tron.led);\n\n    // gut\n    var leds = stage.selectAll('.led')\n        .data(data)\n      .enter().append(\"svg:svg\")\n        .class('led', true)\n        .attr('width',  (radius + margin) * 2)\n      .append(\"svg:g\")\n        .attr(\"transform\", \"translate(\" + (radius + margin) + \",\" + (radius + margin) + \")\")\n        .call(tron.led);\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='leading-commas'\u003eFührende Kommas\u003c/a\u003e\n\n  - Führende Kommas: **Nein.**\n\n    ```javascript\n    // schlecht\n    var once\n      , upon\n      , aTime;\n\n    // gut\n    var once,\n        upon,\n        aTime;\n\n    // schlecht\n    var hero = {\n        firstName: 'Bob'\n      , lastName: 'Parr'\n      , heroName: 'Mr. Incredible'\n      , superPower: 'strength'\n    };\n\n    // gut\n    var hero = {\n      firstName: 'Bob',\n      lastName: 'Parr',\n      heroName: 'Mr. Incredible',\n      superPower: 'strength'\n    };\n    ```\n    \n  - Zusätzliche Kommas am Ende einer Aufzählung: **Nein**. Denn dies kann zu Problemen mit IE6/7 und IE9 führen. Auch kann es in einigen Implementation on ES3 dazu führen, dass die Länge des Arrays um eins zu gross wird. Was in ES5 beschrieben wurde: [source](http://es5.github.io/#D)\n    \u003e Edition 5 clarifies the fact that a trailing comma at the end of an ArrayInitialiser does not add to the length of the array. This is not a semantic change from Edition 3 but some implementations may have previously misinterpreted this.\n\n    ```javascript\n    // schlecht\n    var hero = {\n      firstName: 'Kevin',\n      lastName: 'Flynn',\n    };\n\n    var heroes = [\n      'Batman',\n      'Superman',\n    ];\n\n    // gut\n    var hero = {\n      firstName: 'Kevin',\n      lastName: 'Flynn'\n    };\n\n    var heroes = [\n      'Batman',\n      'Superman'\n    ];\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='semicolons'\u003eSemikolons\u003c/a\u003e\n\n  - **Ja.**\n\n    ```javascript\n    // schlecht\n    (function() {\n      var name = 'Skywalker'\n      return name\n    })()\n\n    // gut\n    (function() {\n      var name = 'Skywalker';\n      return name;\n    })();\n\n    // gut\n    ;(function() {\n      var name = 'Skywalker';\n      return name;\n    })();\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='type-coercion'\u003eTypumwandlung\u003c/a\u003e\n\n  - Benutze `type coercion` am Anfang eines Statements.\n  - Bei Zeichenketten:\n\n    ```javascript\n    //  =\u003e this.reviewScore = 9;\n\n    // schlecht\n    var totalScore = this.reviewScore + '';\n\n    // gut\n    var totalScore = '' + this.reviewScore;\n\n    // schlecht\n    var totalScore = '' + this.reviewScore + ' total score';\n\n    // gut\n    var totalScore = this.reviewScore + ' total score';\n    ```\n\n  - Benutze immer `parseInt` für Zahlen und gebe immer eine Basis für die Typumwandlung an.\n  - Wenn man aus [Performancegründen](http://jsperf.com/coercion-vs-casting/3) kein `parseInt` verwenden will und ein `Bitshifting` benutzt, sollte man einen Kommentar hinterlassen, wieso dies gemacht wurde.\n\n    ```javascript\n    var inputValue = '4';\n\n    // schlecht\n    var val = new Number(inputValue);\n\n    // schlecht\n    var val = +inputValue;\n\n    // schlecht\n    var val = inputValue \u003e\u003e 0;\n\n    // schlecht\n    var val = parseInt(inputValue);\n\n    // gut\n    var val = Number(inputValue);\n\n    // gut\n    var val = parseInt(inputValue, 10);\n\n    // gut\n    /**\n     * parseInt was the reason my code was slow.\n     * Bitshifting the String to coerce it to a\n     * Number made it a lot faster.\n     */\n    var val = inputValue \u003e\u003e 0;\n    ```\n\n  - Bei Booleans:\n\n    ```javascript\n    var age = 0;\n\n    // schlecht\n    var hasAge = new Boolean(age);\n\n    // gut\n    var hasAge = Boolean(age);\n\n    // gut\n    var hasAge = !!age;\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='naming-conventions'\u003eNamenskonventionen\u003c/a\u003e\n\n  - Benutze keine `einzeichigen` Namen. Die Namen sollten beschreibend sein.\n\n    ```javascript\n    // schlecht\n    function q() {\n      // ...stuff...\n    }\n\n    // gut\n    function query() {\n      // ..stuff..\n    }\n    ```\n\n  - Benutze `camelCase`, um Objekte, Funktionen und Instanzen zu benennen.\n\n    ```javascript\n    // schlecht\n    var OBJEcttsssss = {};\n    var this_is_my_object = {};\n    var this-is-my-object = {};\n    function c() {};\n    var u = new user({\n      name: 'Bob Parr'\n    });\n\n    // gut\n    var thisIsMyObject = {};\n    function thisIsMyFunction() {};\n    var user = new User({\n      name: 'Bob Parr'\n    });\n    ```\n\n  - Benutze `PascalCase`, um Klassen und Konstrukturen zu benennen.\n\n    ```javascript\n    // schlecht\n    function user(options) {\n      this.name = options.name;\n    }\n\n    var bad = new user({\n      name: 'nope'\n    });\n\n    // gut\n    function User(options) {\n      this.name = options.name;\n    }\n\n    var good = new User({\n      name: 'yup'\n    });\n    ```\n\n  - Benutze führende Untenstriche `_`, um private Eigenschaften zu benennen.\n\n    ```javascript\n    // schlecht\n    this.__firstName__ = 'Panda';\n    this.firstName_ = 'Panda';\n\n    // gut\n    this._firstName = 'Panda';\n    ```\n\n  - Um eine Referenz an `this` zuzuweisen, benutze `_this`.\n\n    ```javascript\n    // schlecht\n    function() {\n      var self = this;\n      return function() {\n        console.log(self);\n      };\n    }\n\n    // schlecht\n    function() {\n      var that = this;\n      return function() {\n        console.log(that);\n      };\n    }\n\n    // gut\n    function() {\n      var _this = this;\n      return function() {\n        console.log(_this);\n      };\n    }\n    ```\n\n  - Gib deinen Funktionen einen Namen. Dies ist hilfreich für den `stack trace`.\n\n    ```javascript\n    // schlecht\n    var log = function(msg) {\n      console.log(msg);\n    };\n\n    // gut\n    var log = function log(msg) {\n      console.log(msg);\n    };\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='accessors'\u003eZugriffsmethoden\u003c/a\u003e\n\n  - Zugriffsmethoden für Objekteigenschaften sind nicht von Nöten.\n  - Macht man dennoch Zugriffsmethoden, benutze `getVal()` und `setVal('hello')`.\n\n    ```javascript\n    // schlecht\n    dragon.age();\n\n    // gut\n    dragon.getAge();\n\n    // schlecht\n    dragon.age(25);\n\n    // gut\n    dragon.setAge(25);\n    ```\n\n  - Wenn die Eigenschaft ein Boolean ist, benutze `isVal()` oder `hasVal()`.\n\n    ```javascript\n    // schlecht\n    if (!dragon.age()) {\n      return false;\n    }\n\n    // gut\n    if (!dragon.hasAge()) {\n      return false;\n    }\n    ```\n\n  - Es ist in Ordnung `get()`- und `set()`-Methoden zu erstellen, aber sei konsistent.\n\n    ```javascript\n    function Jedi(options) {\n      options || (options = {});\n      var lightsaber = options.lightsaber || 'blue';\n      this.set('lightsaber', lightsaber);\n    }\n\n    Jedi.prototype.set = function(key, val) {\n      this[key] = val;\n    };\n\n    Jedi.prototype.get = function(key) {\n      return this[key];\n    };\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='constructors'\u003eKonstruktoren\u003c/a\u003e\n\n  - Weise die Methoden dem `prototype` des Objektes zu, anstelle den `prototype` mit einem neuen Objekt zu überschreiben. Wenn man den `prototype` überschreibt wird eine Vererbung unmöglich, denn damit wird die Basis überschrieben!\n\n    ```javascript\n    function Jedi() {\n      console.log('new jedi');\n    }\n\n    // schlecht\n    Jedi.prototype = {\n      fight: function fight() {\n        console.log('fighting');\n      },\n\n      block: function block() {\n        console.log('blocking');\n      }\n    };\n\n    // gut\n    Jedi.prototype.fight = function fight() {\n      console.log('fighting');\n    };\n\n    Jedi.prototype.block = function block() {\n      console.log('blocking');\n    };\n    ```\n\n  - Methoden können `this` zurückgeben, um eine Methodenverkettung zu ermöglichen.\n\n    ```javascript\n    // schlecht\n    Jedi.prototype.jump = function() {\n      this.jumping = true;\n      return true;\n    };\n\n    Jedi.prototype.setHeight = function(height) {\n      this.height = height;\n    };\n\n    var luke = new Jedi();\n    luke.jump(); // =\u003e true\n    luke.setHeight(20) // =\u003e undefined\n\n    // gut\n    Jedi.prototype.jump = function() {\n      this.jumping = true;\n      return this;\n    };\n\n    Jedi.prototype.setHeight = function(height) {\n      this.height = height;\n      return this;\n    };\n\n    var luke = new Jedi();\n\n    luke.jump()\n      .setHeight(20);\n    ```\n\n\n  - Es ist in Ordnung eine eigene `toString()`-Methode zu schreiben, aber man sollte sicherstellen, dass diese korrekt funktioniert und keine Nebeneffekte hat.\n\n    ```javascript\n    function Jedi(options) {\n      options || (options = {});\n      this.name = options.name || 'no name';\n    }\n\n    Jedi.prototype.getName = function getName() {\n      return this.name;\n    };\n\n    Jedi.prototype.toString = function toString() {\n      return 'Jedi - ' + this.getName();\n    };\n    ```\n\n    **[[⬆]](#TOC)**\n    \n    \n## \u003ca name='events'\u003eEvents\u003c/a\u003e\n\n  - Wenn man Daten zu einem Event hinzufügen möchte, dann soll man einen `hash` einem `raw value` vorziehen. Denn es lässt einen einfach weitere Parameter hinzuzufügen ohne den Eventhandler für den existieren Parameter zu bearbeiten.\n    \n    ```javascript\n    // schlecht\n    $(this).trigger('listingUpdated', listing.id);\n\n    ...\n\n    $(this).on('listingUpdated', function(e, listingId) {\n      // do something with listingId\n    });\n    ```\n    \n    Bevorzuge:\n    \n    ```javascript\n    // gut\n    $(this).trigger('listingUpdated', { listingId : listing.id });\n\n    ...\n    \n    $(this).on('listingUpdated', function(e, data) {\n      // do something with data.listingId\n    });\n    ```\n    \n    **[[⬆]](#TOC)**\n    \n\n## \u003ca name='modules'\u003eModule\u003c/a\u003e\n\n  - Ein Modul sollte mit einem `!` beginnen. Dies stellt sicher, dass wenn in einem Modul das abschliessende Semikolon vergessen wurde, keine Fehler entstehen, wenn die Scripte zusammengeschnitten werden.\n  - Eine Datei sollte in `camelCase` benannt sein, in einem Ordner mit dem selben Namen liegen und dem Namen entsprechen mit dem es exportiert wird.\n  - Benutze eine Methode `noConflict()`, welche das exportierte Modul auf die vorhergehende Version setzt und diese zurück gibt.\n  - Deklariere immer `'use strict';` am Anfang des Moduls.\n\n    ```javascript\n    // fancyInput/fancyInput.js\n\n    !function(global) {\n      'use strict';\n\n      var previousFancyInput = global.FancyInput;\n\n      function FancyInput(options) {\n        this.options = options || {};\n      }\n\n      FancyInput.noConflict = function noConflict() {\n        global.FancyInput = previousFancyInput;\n        return FancyInput;\n      };\n\n      global.FancyInput = FancyInput;\n    }(this);\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='jquery'\u003ejQuery\u003c/a\u003e\n\n  - Stelle allen jQuery-Objektvariablen ein `$` voran.\n\n    ```javascript\n    // schlecht\n    var sidebar = $('.sidebar');\n\n    // gut\n    var $sidebar = $('.sidebar');\n    ```\n\n  - Speichere `jQuery lookups`, sofern sie mehrmals gebraucht werden.\n\n    ```javascript\n    // schlecht\n    function setSidebar() {\n      $('.sidebar').hide();\n\n      // ...stuff...\n\n      $('.sidebar').css({\n        'background-color': 'pink'\n      });\n    }\n\n    // gut\n    function setSidebar() {\n      var $sidebar = $('.sidebar');\n      $sidebar.hide();\n\n      // ...stuff...\n\n      $sidebar.css({\n        'background-color': 'pink'\n      });\n    }\n    ```\n\n  - Für DOM-Abfragen benutze `Cascading`: `$('.sidebar ul')` oder parent \u003e child `$('.sidebar \u003e .ul')`. [jsPerf](http://jsperf.com/jquery-find-vs-context-sel/16)\n  - Benutze `find` mit `scoped jQuery object queries`\n\n    ```javascript\n    // schlecht\n    $('.sidebar', 'ul').hide();\n\n    // schlecht\n    $('.sidebar').find('ul').hide();\n\n    // gut\n    $('.sidebar ul').hide();\n\n    // gut\n    $('.sidebar \u003e ul').hide();\n\n    // gut (langsamer)\n    $sidebar.find('ul');\n\n    // gut (schneller)\n    $($sidebar[0]).find('ul');\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='es5'\u003eECMAScript 5 Kompatibilität\u003c/a\u003e\n\n  - Verweis auf [Kangax](https://twitter.com/kangax/)'s ES5 [Kompatibilitätstabelle](http://kangax.github.com/es5-compat-table/)\n\n  **[[⬆]](#TOC)**\n\n\n## \u003ca name='testing'\u003eTesting\u003c/a\u003e\n\n  - **Ja.**\n\n    ```javascript\n    function() {\n      return true;\n    }\n    ```\n\n    **[[⬆]](#TOC)**\n\n\n## \u003ca name='performance'\u003ePerformance\u003c/a\u003e\n\n  - [On Layout \u0026 Web Performance](http://kellegous.com/j/2013/01/26/layout-performance/)\n  - [String vs Array Concat](http://jsperf.com/string-vs-array-concat/2)\n  - [Try/Catch Cost In a Loop](http://jsperf.com/try-catch-in-loop-cost)\n  - [Bang Function](http://jsperf.com/bang-function)\n  - [jQuery Find vs Context, Selector](http://jsperf.com/jquery-find-vs-context-sel/13)\n  - [innerHTML vs textContent for script text](http://jsperf.com/innerhtml-vs-textcontent-for-script-text)\n  - [Long String Concatenation](http://jsperf.com/ya-string-concat)\n  - Loading...\n\n  **[[⬆]](#TOC)**\n\n\n## \u003ca name='resources'\u003eRessourcen\u003c/a\u003e\n\n\n**Lese dieses**\n\n  - [Annotated ECMAScript 5.1](http://es5.github.com/)\n\n**Andere Styleguides**\n\n  - [Google JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)\n  - [jQuery Core Style Guidelines](http://docs.jquery.com/JQuery_Core_Style_Guidelines)\n  - [Principles of Writing Consistent, Idiomatic JavaScript](https://github.com/rwldrn/idiomatic.js/)\n\n**Andere Styles**\n\n  - [Naming this in nested functions](https://gist.github.com/4135065) - Christian Johansen\n  - [Conditional Callbacks](https://github.com/airbnb/javascript/issues/52)\n  - [Popular JavaScript Coding Conventions on Github](http://sideeffect.kr/popularconvention/#javascript)\n\n**Bücher**\n\n  - [JavaScript: The Good Parts](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742) - Douglas Crockford\n  - [JavaScript Patterns](http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752) - Stoyan Stefanov\n  - [Pro JavaScript Design Patterns](http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X)  - Ross Harmes and Dustin Diaz\n  - [High Performance Web Sites: Essential Knowledge for Front-End Engineers](http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309) - Steve Souders\n  - [Maintainable JavaScript](http://www.amazon.com/Maintainable-JavaScript-Nicholas-C-Zakas/dp/1449327680) - Nicholas C. Zakas\n  - [JavaScript Web Applications](http://www.amazon.com/JavaScript-Web-Applications-Alex-MacCaw/dp/144930351X) - Alex MacCaw\n  - [Pro JavaScript Techniques](http://www.amazon.com/Pro-JavaScript-Techniques-John-Resig/dp/1590597273) - John Resig\n  - [Smashing Node.js: JavaScript Everywhere](http://www.amazon.com/Smashing-Node-js-JavaScript-Everywhere-Magazine/dp/1119962595) - Guillermo Rauch\n  - [Secrets of the JavaScript Ninja](http://www.amazon.com/Secrets-JavaScript-Ninja-John-Resig/dp/193398869X) - John Resig and Bear Bibeault\n  - [Human JavaScript](http://humanjavascript.com/) - Henrik Joreteg\n  - [Superhero.js](http://superherojs.com/) - Kim Joar Bekkelund, Mads Mobæk, \u0026 Olav Bjorkoy\n  - [JSBooks](http://jsbooks.revolunet.com/)\n\n**Blogs**\n\n  - [DailyJS](http://dailyjs.com/)\n  - [JavaScript Weekly](http://javascriptweekly.com/)\n  - [JavaScript, JavaScript...](http://javascriptweblog.wordpress.com/)\n  - [Bocoup Weblog](http://weblog.bocoup.com/)\n  - [Adequately Good](http://www.adequatelygood.com/)\n  - [NCZOnline](http://www.nczonline.net/)\n  - [Perfection Kills](http://perfectionkills.com/)\n  - [Ben Alman](http://benalman.com/)\n  - [Dmitry Baranovskiy](http://dmitry.baranovskiy.com/)\n  - [Dustin Diaz](http://dustindiaz.com/)\n  - [nettuts](http://net.tutsplus.com/?s=javascript)\n\n  **[[⬆]](#TOC)**\n\n## \u003ca name='in-the-wild'\u003eIn the Wild\u003c/a\u003e\n\n  Dies ist eine Liste von Organisationen, welche diesen Style Guide benutzen. Sende uns einen `Pull request` oder öffne einen `issue` und wir werden dich der Liste hinzufügen.\n\n  - **Aan Zee**: [AanZee/javascript](https://github.com/AanZee/javascript)\n  - **Airbnb**: [airbnb/javascript](https://github.com/airbnb/javascript)\n  - **American Insitutes for Research**: [AIRAST/javascript](https://github.com/AIRAST/javascript)\n  - **Compass Learning**: [compasslearning/javascript-style-guide](https://github.com/compasslearning/javascript-style-guide)\n  - **ExactTarget**: [ExactTarget/javascript](https://github.com/ExactTarget/javascript)\n  - **Gawker Media**: [gawkermedia/javascript](https://github.com/gawkermedia/javascript)\n  - **GeneralElectric**: [GeneralElectric/javascript](https://github.com/GeneralElectric/javascript)\n  - **GoodData**: [gooddata/gdc-js-style](https://github.com/gooddata/gdc-js-style)\n  - **Grooveshark**: [grooveshark/javascript](https://github.com/grooveshark/javascript)\n  - **How About We**: [howaboutwe/javascript](https://github.com/howaboutwe/javascript)\n  - **Mighty Spring**: [mightyspring/javascript](https://github.com/mightyspring/javascript)\n  - **MinnPost**: [MinnPost/javascript](https://github.com/MinnPost/javascript)\n  - **ModCloth**: [modcloth/javascript](https://github.com/modcloth/javascript)\n  - **National Geographic**: [natgeo/javascript](https://github.com/natgeo/javascript)\n  - **National Park Service**: [nationalparkservice/javascript](https://github.com/nationalparkservice/javascript)\n  - **Razorfish**: [razorfish/javascript-style-guide](https://github.com/razorfish/javascript-style-guide)\n  - **Shutterfly**: [shutterfly/javascript](https://github.com/shutterfly/javascript)\n  - **Userify**: [userify/javascript](https://github.com/userify/javascript)\n  - **Zillow**: [zillow/javascript](https://github.com/zillow/javascript)\n  - **ZocDoc**: [ZocDoc/javascript](https://github.com/ZocDoc/javascript)\n\n  **[[⬆]](#TOC)**\n\n## \u003ca name='translation'\u003eÜbersetzungen\u003c/a\u003e\n\n  Dieser Styleguide ist in den folgenden Sprachen erhältlich:\n\n  - :en: **Englisch**: [airbnb/javascript](https://github.com/airbnb/javascript)\n  - :jp: **Japanisch**: [mitsuruog/javacript-style-guide](https://github.com/mitsuruog/javacript-style-guide)\n  - :br: **Portugisisch**: [armoucar/javascript-style-guide](https://github.com/armoucar/javascript-style-guide)\n  - :cn: **Chinesisch**: [adamlu/javascript-style-guide](https://github.com/adamlu/javascript-style-guide)\n  - :es: **Spanisch**: [paolocarrasco/javascript-style-guide](https://github.com/paolocarrasco/javascript-style-guide)\n  - :kr: **Koreanisch**: [tipjs/javascript-style-guide](https://github.com/tipjs/javascript-style-guide)\n  - :fr: **Französisch**: [nmussy/javascript-style-guide](https://github.com/nmussy/javascript-style-guide)\n\n\n  **[[⬆]](#TOC)**\n\n## \u003ca name='guide-guide'\u003eThe JavaScript Style Guide Guide\u003c/a\u003e\n\n  - [Reference](//github.com/airbnb/javascript/wiki/The-JavaScript-Style-Guide-Guide)\n\n  **[[⬆]](#TOC)**\n\n## \u003ca name='authors'\u003eContributors\u003c/a\u003e\n\n  - [View Contributors](https://github.com/airbnb/javascript/graphs/contributors)\n\n  **[[⬆]](#TOC)**\n\n\n## \u003ca name='license'\u003eLizenz\u003c/a\u003e\n\n(The MIT License)\n\nCopyright (c) 2012 Airbnb\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n**[[⬆]](#TOC)**\n\n# };\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimofurrer%2Fjavascript-style-guide","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimofurrer%2Fjavascript-style-guide","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimofurrer%2Fjavascript-style-guide/lists"}