# JavaScript https://developer.mozilla.org/en-US/docs/Web/JavaScript - Recognized for - First-class functions - Weak typing - Prototypes - Automatic semicolon comp. ## History Developed by Brenden Eich of Netscape, initially named Mocha, then LiveScript, and finally JavaScript. ## Variables [[naming]] convention: camel case. - `var` (the old way and should be avoided) - Global or function scope (due to hoisting) - Hoisted, declared, and not initialized, causing unexpected behaviors. - Redeclaration allowed (old value maintained unless assigned), causing confusion - Should be avoided since [[es6|ES6]] - `let` - Block scope - Redeclaration not allowed, reassignment allowed - `const` - Block scope - Redeclaration and reassignment not allowed - Without keyword - Will be in global scope (even if inside a block) - Hoisting - = Raise something up with ropes and pulleys - Move the declaration up (but not the initialization) ```js console.log(x); // will output undefined var x = 7; ``` - `ReferenceError` vs `undefined` - When entering a function, JS will search and execute all the `var`s and declare them all. ## Operators - `==` returns `true` for "same thing", `===` also requires "same type". Always use `===` unless `==` is intended. (type coercion) ## Functions ```js function func() { ... }; const func = function () { ... }; const func () => { ... }; // since ES6 ``` All functions are hoisted. ## Data Types ### Primitives - Boolean - Number - BigInt - `const x = 111111n` - String - double quote, single quote, backtick (template string, since [[es6]]) - Undefined type - Symbol type ### Objects - Prototype-based [[oop|object-oriented programming]] - `person.name` and `person["name"]` both works - Context: `this.name` - `const func = person.method.bind(person)`. Calling `func = person.method` will cause many `undefined`, since