Quick Start
Identifiers
Must begin with:
- A letter 
A-Z a-z - A dollar sign 
$ - An underscore 
_ 
JavaScript identifiers are case sensitive, lastName and lastname are two different variables.
Usually, variables in JavaScript are named using Lower Camel Case:
firstName, lastName, masterCard, interCity
JavaScript uses the Unicode character set.
Comments
Single Line Comments:
// commentMulti-line Comments:
/* comment comment */
Variables
JavaScript variables can be declared in 4 ways:
- Automatically
 - Using 
var - Using 
let - Using 
const 
The
varkeyword should only be used in code written for older browsers.
 When to use var, let, or const
- Use 
constif :- the value should not be changed
 - the type should not be changed (Arrays and Objects)
 
 - Use 
letif you can’t useconst - Use 
varif you must support old browsers 
| Scope | Redeclare | Reassign | Hoisted | Binds this | |
|---|---|---|---|---|---|
| var | No | Yes | Yes | Yes | Yes | 
| let | Yes | No | Yes | No | No | 
| const | Yes | No | No | No | No | 
 let
Variables declared with let :
- have Block Scope
 - must be Declared before use
 - cannot be Redeclared in the same scope
 
 const
Variables declared with const :
- cannot be Redeclared
 - cannot be Reassigned
 - have Block Scope
 
const does not define a constant value, it defines a constant reference to a value.
You cannot reassign a constant value, but you can change the elements/properties of constant Array/Object.
 when to use const
Always declare a variable with const when you know that the value should not be changed.
Use const when declaring:
- A new Array
 - A new Object
 - A new Function
 - A new RegExp
 
Operators
Arithmetic Operators
| Operator | Description | 
|---|---|
| + | Addition | 
| - | Subtraction | 
| * | Multiplication | 
| ** | Exponentiation (ES2016) | 
| / | Division | 
| % | Modulus (Remainder) | 
| ++ | Increment | 
| -- | Decrement | 
Comparison Operators
| Operator | Description | 
|---|---|
| == | equal to | 
| === | equal value and equal type | 
| != | not equal | 
| !== | not equal value or not equal type | 
| > | greater than | 
| < | less than | 
| >= | greater than or equal to | 
| <= | less than or equal to | 
| ? | ternary operator | 
Logical Operators
| Operator | Description | 
|---|---|
| && | logical and | 
| || | logical or | 
| ! | logical not | 
Type Operators
| Operator | Description | 
|---|---|
| typeof | Returns the type of a variable | 
| instanceof | Returns true if an object is an instance of an object type | 
typeof "" // string
typeof "Alice" // string
typeof 1 // number
typeof 1.001 // number
Bitwise Operators
| Operator | Description | Example | Same as | Result | Decimal | 
|---|---|---|---|---|---|
| & | AND | 5 & 1 | 0101 & 0001 | 0001 | 1 | 
| | | OR | 5 | 1 | 0101 | 0001 | 0101 | 5 | 
| ~ | NOT | ~ 5 | ~0101 | 1010 | 10 | 
| ^ | XOR | 5 ^ 1 | 0101 ^ 0001 | 0100 | 4 | 
| << | left shift | 5 << 1 | 0101 << 1 | 1010 | 10 | 
| >> | right shift | 5 >> 1 | 0101 >> 1 | 0010 | 2 | 
| >>> | unsigned right shift | 5 >>> 1 | 0101 >>> 1 | 0010 | 2 | 
Data Types
JavaScript has 8 Datatypes:
- String
 - Number
 - Bigint
 - Boolean
 - Undefined
 - Null
 - Symbol
 - Object
 
Dynamic Types
JavaScript types are dynamic. This means that the same variable can be used to hold different data types:
let x; // undefined
x = 5; // number
x = "Alice"; // string
String
A string is a series of characters. Strings are written with quotes, you can use single or double quotes:
let name1 = "Alice"; // double quotes
let name2 = 'Foo' // single quotes
// Use quotes inside a string
let str1 = "It's OK";
let str2 = "She is 'Alice'";
let str3 = 'She is "Alice"';
String length
let text = "123";
console.log(text.length); // 3
Escape character
| Code | Result | 
|---|---|
| \b | Backspace | 
| \f | Form Feed | 
| \n | New Line | 
| \r | Carriage Return | 
| \t | Horizontal Tabulator | 
| \v | Vertical Tabulator | 
String Object
let x = new String("Alice");
Do not create String objects.
The
newkeyword complicates the code and slows down execution speed.
String objects can produce unexpected results:
let x = "Alice";
let y = new String("Alice");
let z = new String("Alice");
console.log(x == y); // true
console.log(x === y); // false
console.log("");
console.log(y == z); // false
console.log(y === z); // false
Comparing two JavaScript objects always returns false.
String methods
Extracting string parts
slice(start, end)substring(start, end)
let str = "Alice";
// slice
console.log(str.slice(1, 3)); // li
console.log(str.slice(2)); // ice
// if the parameter is negative, the position is counted from the end of the string
console.log(str.slice(-3, -1)); // ic
console.log(str.slice(-3)); // ice
// substring
// if parameter is negative, it will be treated as 0
console.log(str.substring(1, 3)); // li
console.log(str.substring(-1, 3)); // Ali
Replacing string content
replace()Thereplace()method replaces a specified value with another value in string.replace(old_string, new_string) // regexp are written without quotes replace(regexp, new_string)replaceAll()
let str = "My name is Alice Alice Alice";
// By default, replace() will only replace the first match
console.log(str.replace("Alice", "A")); // My name is A Alice Alice
// Use regexp
console.log(str.replace(/ALICE/ig, "A")); // My name is A A A
Converting to Upper and Lower Case
let str2 = "My name is Alice Alice Alice";
console.log(str2.toUpperCase());
console.log(str2.toLowerCase());
Concatenate
let x = "A";
let y = "B";
let z = "D";
console.log(x.concat(y, z)); // ABD
Trim
trim()trimStart()trimeEnd()
// trim() removes whitespace from both sides
let text1 = "  A  ";
console.log('"'+text1.trim()+'"'); // "A"
// trimStart() removes whitespace only from the start of string
console.log('"'+text1.trimStart()+'"') // "A  "
// trimStart() removes whitespace only from the end of string
console.log('"'+text1.trimEnd()+'"') // "  A"
Padding
padStart()padEnd()
let str = "5";
console.log(str.padStart(2, "0")); // 05
console.log(str.padStart(3, "0")); // 005
console.log(str.padEnd(2, "0")); // 50
console.log(str.padEnd(3, "0")); // 500
Extracting string characters
charAt(position)charCodeAt(position): returns a UTF-16 code- Property access 
[] 
let str = "abcd";
console.log(str.charAt(2)); // c
console.log(str.charCodeAt())// 99
console.log(str[2]); // c
Converting a string to an Array
split()
let str = "a,b,c,d";
str.split(","); // ['a', 'b', 'c', 'd']
Number
JavaScript numbers are always one type: 64-bit floating point.
let x1 = 2.00; // with decimals
let x2 = 34; // without decimals
// exponential notation
let y = 1e3; // 1000
let z = 1e-3; // 0.001
NaN - Not a Number
NaN is a JavaScript reserved word indicating that a number is not a legal number.
let x = 10 / "a"; // NaN
isNaN(x); // true
typeof NaN; // number 
BigInt
BigInt is used to store integer values that are too big to be represented by a normal JavaScript Number.
let x = BigInt("123456789012345678901234567890");
Boolean
Booleans can only have two values: true or false.
let x = 5;
let y = 5;
let z = 6;
(x == y) // true
(x == z) // false
Array
JavaScript arrays are written with square brackets.
Syntax:
const arry_name = [item1, item2, ...];
const names = ["Alice", "Foo", "Bar"];
Object
const person = {
  name: "Alice",
  age: 16
};
Undefined
A variable without a value, has the value undefined. The type is also undefined.
let car; // undefined
typeof car; // undefined
Functions
function name(param_list) {
    // code 
}
Functions used as variable values
let x = add;
console.log(x(1,2)) // 3
    
function add(a, b) {
    return a+b
}
Object
const person = {
  name: "Alice",
  age: 16
};
// Access properties
console.log(person.name) // Alice
console.log(person.["age"]) // 16
Object methods
const person2 = {
    name: "Alice",
    age: 16,
    info: function() {
        return this.name + ", " + this.age;
    }
};
console.log(person2.info()); // Alice, 16
if-else
if (conditin) {
	// code
} else if {
	// code
} else {
	// code
}
switch
switch (expression) {
    case x:
        // code
        break;
    case y:
        // code
        break;
    default:
        // code
}
Loop
JavaScript supports different kinds of loops:
for- loops through a block of code a number of timesfor/in- loops through the properties of an objectfor/of- loops through the values of an iterable objectwhile- loops through a block of code while a specified condition is truedo/while- also loops through a block of code while a specified condition is true
for
for exp1; conditoin; exp2 {
    // code
}
for-in
Do not use for in over an Array if the index order is important.
The index order is implementation-dependent, and array values may not be accessed in the order you expect.
It is better to use a for loop, a for of loop, or Array.forEach() when the order is important.
for (key in obejet) {
    // code
}
const person = {
  name: "Alice",
  age: 16
};
for (let key in person) {   
	console.log(person[key]);
}
for-of
for (variable of iterable) {
    // code
}
const arr = [1, 2, 3];
for (let n of arr) {
	console.log(n);
}
while, do-while
while (condition) {
    // code
}
do {
    // code
} while (condition)
Set
A JavaScript Set is a collection of unique values. Each value can only occur once in a Set.
| Method | Description | 
|---|---|
| new Set() | Creates a new Set | 
| add() | Adds a new element to the Set | 
| delete() | Removes an element from a Set | 
| has() | Returns true if a value exists in the Set | 
| forEach() | Invokes a callback for each element in the Set | 
| values() | Returns an iterator with all the values in a Set | 
| Property | Description | 
|---|---|
| size | Returns the number of elements in a Set | 
// create set
const letters = new Set(["a", "b", "c"]);
// add element
letters.add("d");
// forEach()
letters.forEach(function(ele) {
    console.log(ele);
});
Map
A Map holds key-value pairs where the keys can be any datatype.
A Map remembers the original insertion order of the keys.
| Method | Description | 
|---|---|
| new Map() | Creates a new Map | 
| set() | Sets the value for a key in a Map | 
| get() | Gets the value for a key in a Map | 
| delete() | Removes a Map element specified by the key | 
| has() | Returns true if a key exists in a Map | 
| forEach() | Calls a function for each key/value pair in a Map | 
| entries() | Returns an iterator with the [key, value] pairs in a Map | 
| Property | Description | 
|---|---|
| size | Returns the number of elements in a Map | 
// create map
const m = new Map([
   ["a", 1],
   ["b", 2],
   ["c", 3]
]);
// set
m.set("d", 4);
// get
console.log(m.get("b")); // 2
Map and Object
| Object | Map | |
|---|---|---|
| Iterable | Not directly iterable | Directly iterable | 
| Size | Do not have a size property | Have a size property | 
| Key Types | Keys must be Strings (or Symbols) | Keys can be any datatype | 
| Key Order | Keys are not well ordered | Keys are ordered by insertion | 
| Defaults | Have default keys | Do not have default keys | 
Error
The try statement defines a code block to run (to try).
The catch statement defines a code block to handle any error.
The finally statement defines a code block to run regardless of the result.
The throw statement defines a custom error.
try {
  Block of code to try
}
catch(err) {
  Block of code to handle errors
}
finally {
  Block of code to be executed regardless of the try / catch result
}
Strict mode
"use strict"; Defines that JavaScript code should be executed in "strict mode".
Arrow function
Arrow functions allow us to write shorter function syntax:
hello = function() {
    return "hello";
}
hello = () => {
    return "hello";
}
hello = () => "hello";
Class
Use the keyword class to create a class.
Always add a method named constructor():
class ClassName {
    constructor() {
        //...
    }
    method1() {...}
    method2() {...}
    method3() {...}
    ...
}
class Car {
    constructor(name, year) {
        this.name = name;
        this.year = year;
    }
}
const car1 = new Car("Ford", 2014);
const car2 = nwe Car("Audi", 2019);
Module
JavaScript modules allow you to break up your code into separate files.
Named exports
export const name = "Alice";
export const age = 16;
const name = "Alice";
const age = 16;
export {name, age};
Default exports
export default message = () => {
    const name = "Alice";
    const age = 16;
    return name + " " + age;
}
Import
// import named exports
import {name, age} from "xxx.js";
// import default exports
import message from "xxx.js";
Async
Promise object
"Producing code" is code that can take some time
"Consuming code" is code that must wait for the result
A Promise is a JavaScript object that links producing code and consuming code
A JavaScript Promise object contains both the producing code and calls to the consuming code:
let myPromise = new Promise(function(myResolve, myReject) {
// "Producing Code" (May take some time)
  myResolve(); // when successful
  myReject();  // when error
});
// "Consuming Code" (Must wait for a fulfilled Promise)
myPromise.then(
  function(value) { /* code if successful */ },
  function(error) { /* code if some error */ }
);
When the producing code obtains the result, it should call one of the two callbacks:
| Result | Call | 
|---|---|
| Success | myResolve(result value) | 
| Error | myReject(error object) | 
Properties
A JavaScript Promise object can be:
- Pending
 - Fulfilled
 - Rejected
 
The Promise object supports two properties: state and result.
While a Promise object is "pending" (working), the result is undefined.
When a Promise object is "fulfilled", the result is a value.
When a Promise object is "rejected", the result is an error object.
| myPromise.state | myPromise.result | 
|---|---|
| "pending" | undefined | 
| "fulfilled" | a result value | 
| "rejected" | an error object | 
You cannot access the Promise properties state and result.
You must use a Promise method to handle promises.
Use promise
Promise.then() takes two arguments, a callback for success and another for failure.
Both are optional, so you can add a callback for success or failure only.
myPromise.then(
  function(value) { /* code if successful */ },
  function(error) { /* code if some error */ }
);
function myDisplayer(some) {
  document.getElementById("demo").innerHTML = some;
}
let myPromise = new Promise(function(myResolve, myReject) {
  let x = 0;
// The producing code (this may take some time)
  if (x == 0) {
    myResolve("OK");
  } else {
    myReject("Error");
  }
});
myPromise.then(
  function(value) {myDisplayer(value);},
  function(error) {myDisplayer(error);}
);
async
async makes a function return a Promise
await makes a function wait for a Promise
async function myFunction() {
  return "Hello";
}
// same as 
function myFunction() {
  return Promise.resolve("Hello");
}
The await keyword can only be used inside an async function.
The await keyword makes the function pause the execution and wait for a resolved promise before it continues:
let value = await promise;
example
async function myDisplay() {
  let myPromise = new Promise(function(resolve) {
    resolve("I love You !!");
  });
  document.getElementById("demo").innerHTML = await myPromise;
}
myDisplay();
async function myDisplay() {
  let myPromise = new Promise(function(resolve) {
    setTimeout(function() {resolve("I love You !!");}, 3000);
  });
  document.getElementById("demo").innerHTML = await myPromise;
}
myDisplay();
async function getFile() {
  let myPromise = new Promise(function(resolve) {
    let req = new XMLHttpRequest();
    req.open('GET', "mycar.html");
    req.onload = function() {
      if (req.status == 200) {
        resolve(req.response);
      } else {
        resolve("File not Found");
      }
    };
    req.send();
  });
  document.getElementById("demo").innerHTML = await myPromise;
}
getFile();
