Expression and Operator
- Primary expressions
 - Left-hand-side expressions
 - Increment and decrement
 - Unary operators
 - Arithmetic operators
 - Relational operators
 - Equality operators
 - Bitwise shift operators
 - Binary bitwise operators
 - Binary logical operators
 - Conditional operator
 - Assignment operators
 - Comma operator
 - Recap
 
Primary expressions
Celsius to Fahrenheit conversion

Option 1
let fahrenheit = 50;
let celsius = fahrenheit - 32 / 1.8;
console.log(celsius); //=> 32.2
Option 2
// grouping operator
let fahrenheit = 50;
let celsius = (fahrenheit - 32) / 1.8;
console.log(celsisu); //=> 10
References:
- Operator precedence
 - Abstract syntax trees on Javascript
 - Esprima
 - Javascript AST Visualizer
 - AST Explorer
 
Left-hand-side expressions
// object.property
let obj = { number: 10 };
console.log(obj.number); //=> 10
// spread operator
let numbers = [1, 2, 3];
console.log(...numbers, 4, 5); //=> [1, 2, 3, 4, 5]
Increment and decrement
// postfix increment
let number = 10;
console.log(number++); //=> 10
// prefix increment
let number = 10;
console.log(++number); //=> 11
// postfix decrement
let number = 10;
console.log(number--); //=> 10
// prefix decrement
let number = 10;
console.log(--number); //=> 9
Unary operators
// delete operator
let numbers = [1, 2, 3];
console.log(numbers); //=> [ 1, 2, 3 ]
delete numbers[1];
console.log(numbers); //=> [ 1, , 3 ]
// typeof operator
let number = 1;
console.log(typeof number); //=> number
let name = 'Lorem ipsum';
console.log(typeof name); //=> string
let numbers = [1, 2, 3];
console.log(typeof numbers); //=> object
// unary plus operator
let number = '15';
console.log(number); //=>  "15"
console.log(+number); //=>  15
// unary negation operator
let number = -15;
console.log(number); //=>  -15 11111111111111111111111111110001
console.log(-number); //=>  15 00000000000000000000000000001111
// bitwise not
let number = 16;
console.log(number); //=>   16 00000000000000000000000000010000
console.log(~number); //=> -17 11111111111111111111111111101111
// logical not
let number = 16;
console.log(!number); //=> false
Arithmetic operators
// addition operator
console.log(10 + 3); //=> 13
console.log(true + 3); //=> 4
// subtraction operator
console.log(10 - 3); //=> 7
console.log(1.4 - 1.2); //=> 0.19999999999999996 (IEEE 754)
// multiplication operator
console.log(10 * 3); //=> 30
// division operator
console.log(10 / 3); //=> 3.3333333333333335
console.log(parseInt(10 / 3)); //=> 3 - Integer division
console.log(Math.trunc(10 / 3)); //=> 3 - Integer division
// remainder operator
console.log(10 % 3); //=> 1
// exponentiation operator
console.log(10 ** 3); //=> 1000  Math.pow(10, 3)
Relational operators
// in operator
let numbers = [1, 2, 3];
console.log(0 in numbers); //=> true
console.log(1 in numbers); //=> true
console.log(3 in numbers); //=> false
console.log('value' in { value: 1 }); //=> true
console.log('PI' in Math); //=> true
// instanceof operator
console.log('' instanceof String); //=>           false
console.log(new String() instanceof String); //=> true
// less than operator
console.log(1 < 10); //=> true
// less than or equal operator
console.log(1 <= 10); //=> true
// greater than operator
console.log(10 > 1); //=> true
// greater than or equal operator
console.log(10 >= 1); //=> true
Equality operators
false == false, 0, “0”, “”, [], [0]
// equality operator: type–converting comparisons
console.log(1 == 1); //=>     true
console.log(1 == '1'); //=>   true
console.log(1 == '1a'); //=>  false
console.log(1 == true); //=>  true
console.log(0 == false); //=> true
// inequality operator
console.log(1 != 'a'); //=>   true
console.log(1 != false); //=> true
console.log(1 != true); //=>  false
// identity/strict equality: strict and type–converting comparisons
console.log(1 === 1); //=>     true
console.log(1 === '1'); //=>   false
console.log('1' === '1'); //=> true
// non-identity
console.log(1 !== '1'); //=>   true
console.log('' !== true); //=> true
console.log(1 !== 1); //=>     false
References:
Bitwise shift operators
Bitwise operators treat their operands as a sequence of 32 bits
-(2 ** 32) to 2 ** 31 - 1
-2147483648 to 2147483647
// left shitf operator - each step means "multiply by two"
console.log(9); //=>      00000000000000000000000000001001   9
console.log(9 << 2); //=> 00000000000000000000000000100100  36
// sign-propagating right shift operator - each step means "divide by two"
console.log(9); //=>       00000000000000000000000000001001   9
console.log(9 >> 2); //=>  00000000000000000000000000000010   2
console.log(-9); //=>      11111111111111111111111111110110  -9
console.log(-9 >> 2); //=> 11111111111111111111111111111101  -3
// zero-fill right shift operator
console.log(9); //=>        00000000000000000000000000001001   9
console.log(9 >>> 2); //=>  00000000000000000000000000000010   2
console.log(-9); //=>       11111111111111111111111111110110  -9
console.log(-9 >>> 2); //=> 00111111111111111111111111111101  1073741821
Binary bitwise operators
// bitwise and operator
console.log(9); //=>      00000000000000000000000000001001   9
console.log(14); //=>     00000000000000000000000000001110  14
console.log(14 & 9); //=> 00000000000000000000000000000100   8
// bitwise or operator
console.log(9); //=>      00000000000000000000000000001001   9
console.log(14); //=>     00000000000000000000000000001110  14
console.log(14 | 9); //=> 00000000000000000000000000001111  15
// bitwise xor operator
console.log(9); //=>      00000000000000000000000000001001   9
console.log(14); //=>     00000000000000000000000000001110  14
console.log(14 ^ 9); //=> 00000000000000000000000000000101   7
Binary logical operators
false == false, 0, “”, null, undefined, NaN
// logical and operator
console.log(true && true); //=> true
console.log(true && 10); //=>   10
console.log(false && 10); //=>  false
// logical or operator
console.log(false || false); //=> false
console.log(false || true); //=>  true
console.log(false || 10); //=>    10
Precedence
// Logical AND > Logical OR
console.log((false && true) || true); //=> true
console.log(false && (true || true)); //=> false
Value Default
let variable;
let temp = variable || 10;
console.log(temp); //=> 10
let variable = 1;
let temp = variable || 10;
console.log(temp); //=> 1
Conditional operator (ternary)
// conditional operator
let number = 10;
let kind = number % 2 == 0 ? 'even' : 'odd';
console.log(kind); //=> 'even'
Assignment operators
// assign operator
let variable = 10;
console.log(variable); //=> 10
Shorthand: *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=
// addition assignment operator
let variable = 10; // 10
variable += 1; // variable = variable + 1
console.log(variable); //=> 11
Comma operator
// comma operator
let x, y;
Recap
Groups
| Operator type | Operator | Operator Name | 
|---|---|---|
| Arithmetic Operators | … + … | Addition | 
| … / … | Division | |
| … ** … | Exponentiation | |
| … * … | Multiplication | |
| … % … | Remainder | |
| … - … | Subtraction | |
| … ++ | Postfix Increment | |
| … -- | Postfix Decrement | |
| -- … | Prefix Decrement | |
| ++ … | Prefix Increment | |
| - … | Unary negation | |
| + … | Unary plus | |
| Assignment Operators | … += … | Addition assignment | 
| … &= … | Bitwise AND assignment | |
| … |= … | Bitwise OR assignment | |
| … ^= … | Bitwise XOR assignment | |
| … /= … | Division assignment | |
| … **= … | Exponentiation assignment | |
| … <<= … | Left shift assignment | |
| … *= … | Multiplication assignment | |
| … %= … | Remainder assignment | |
| … >>= … | Right shift assignment | |
| … = … | Assignment | |
| … -= … | Subtraction assignment | |
| … >>>= … | Unsigned right shift assignment | |
| Bitwise Operators | … & … | Bitwise AND | 
| … << … | Bitwise left shift | |
| ~ … | Bitwise NOT | |
| … | … | Bitwise OR | |
| … >> … | Bitwise right shift | |
| … >>> … | Bitwise unsigned right shift | |
| … ^ … | Bitwise XOR | |
| Comparison Operators | … == … | Equality | 
| … != … | Inequality | |
| … === … | Identity | |
| … !== … | Non-identity | |
| … > … | Greater than | |
| … >= … | Greater than or equal | |
| … < … | Less than | |
| … <= … | Less than or equal | |
| Logical Operators | … && … | Logical AND | 
| … || … | Logical OR | |
| ! … | Logical NOT | |
| Conditional Operator | … ? … : … | Conditional / Ternary | 
| Comma Operator | … , … | Comma / Sequence | 
Operators List
| Operator type | Operators | 
|---|---|
| Primary expressions | this, function, class, function*, yield, yield*, async function*, await, [], {}, /ab+c/i, ( ) | 
    
| Left-hand-side expressions | object.property, object["property"], new, new.target, super, ...obj | 
    
| Increment and decrement | A++, A--, ++A, --A | 
    
| Unary operators | delete, void, typeof, +, -, ~, ! | 
    
| Arithmetic operators | +, -, *, /, %, ** | 
    
| Relational operators | in, instanceof, <, <=, >, >= | 
    
| Equality operators | ==, !=, ===, !== | 
    
| Bitwise shift operators | <<, >>, >>> | 
    
| Binary bitwise operators | &, |, ^ | 
    
| Binary logical operators | &&, || | 
    
| Assignment operators | =, *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=, [a, b] = [1, 2], {a, b} = {a:1, b:2} | 
    
| Conditional operator | (condition ? ifTrue : ifFalse) | 
    
| Comma operator | , |