DEV Community

StormyTalent
StormyTalent

Posted on

50+ hints JS(ES6+) developer must know (6th part)

Hi, StormyTalent again.
And I will continue my blog about 50+ JS hints.

Hoisting
var declarations get hoisted to the top of their closest enclosing function scope, their assignment does not. const and let declarations are blessed with a new concept called Temporal Dead Zones (TDZ). It’s important to know why typeof is no longer safe.

// we know this wouldn’t work (assuming there // is no notDefined global variable) function example() { console.log(notDefined); // => throws a ReferenceError } // creating a variable declaration after you // reference the variable will work due to // variable hoisting. Note: the assignment // value of `true` is not hoisted. function example() { console.log(declaredButNotAssigned); // => undefined var declaredButNotAssigned = true; } // the interpreter is hoisting the variable // declaration to the top of the scope, // which means our example could be rewritten as: function example() { let declaredButNotAssigned; console.log(declaredButNotAssigned); // => undefined declaredButNotAssigned = true; } // using const and let function example() { console.log(declaredButNotAssigned); // => throws a ReferenceError console.log(typeof declaredButNotAssigned); // => throws a ReferenceError const declaredButNotAssigned = true; } 
Enter fullscreen mode Exit fullscreen mode

Anonymous function expressions hoist their variable name, but not the function assignment.

function example() { console.log(anonymous); // => undefined anonymous(); // => TypeError anonymous is not a function var anonymous = function () { console.log('anonymous function expression'); }; } 
Enter fullscreen mode Exit fullscreen mode

Named function expressions hoist the variable name, not the function name or the function body.

function example() { console.log(named); // => undefined named(); // => TypeError named is not a function superPower(); // => ReferenceError superPower is not defined var named = function superPower() { console.log('Flying'); }; } // the same is true when the function name // is the same as the variable name. function example() { console.log(named); // => undefined named(); // => TypeError named is not a function var named = function named() { console.log('named'); }; } 
Enter fullscreen mode Exit fullscreen mode

Function declarations hoist their name and the function body.

function example() { superPower(); // => Flying function superPower() { console.log('Flying'); } } 
Enter fullscreen mode Exit fullscreen mode

Comparison Operators & Equality
Use shortcuts for booleans, but explicit comparisons for strings and numbers.

// bad if (isValid === true) { // ... } // good if (isValid) { // ... } // bad if (name) { // ... } // good if (name !== '') { // ... } // bad if (collection.length) { // ... } // good if (collection.length > 0) { // ... } 
Enter fullscreen mode Exit fullscreen mode

Use braces to create blocks in case and default clauses that contain lexical declarations (e.g. let, const, function, and class).

// bad switch (foo) { case 1: let x = 1; break; case 2: const y = 2; break; case 3: function f() { // ... } break; default: class C {} } // good switch (foo) { case 1: { let x = 1; break; } case 2: { const y = 2; break; } case 3: { function f() { // ... } break; } case 4: bar(); break; default: { class C {} } } 
Enter fullscreen mode Exit fullscreen mode

Ternaries should not be nested and generally be single line expressions.

// bad const foo = maybe1 > maybe2 ? "bar" : value1 > value2 ? "baz" : null; // split into 2 separated ternary expressions const maybeNull = value1 > value2 ? 'baz' : null; // better const foo = maybe1 > maybe2 ? 'bar' : maybeNull; // best const foo = maybe1 > maybe2 ? 'bar' : maybeNull; 
Enter fullscreen mode Exit fullscreen mode

Avoid unneeded ternary statements.

// bad const foo = a ? a : b; const bar = c ? true : false; const baz = c ? false : true; // good const foo = a || b; const bar = !!c; const baz = !c; 
Enter fullscreen mode Exit fullscreen mode

When mixing operators, enclose them in parentheses. The only exception is the standard arithmetic operators: +, -, and ** since their precedence is broadly understood. We recommend enclosing / and * in parentheses because their precedence can be ambiguous when they are mixed.

// bad const foo = a && b < 0 || c > 0 || d + 1 === 0; // bad const bar = a ** b - 5 % d; // bad // one may be confused into thinking (a || b) && c if (a || b && c) { return d; } // bad const bar = a + b / c * d; // good const foo = (a && b < 0) || c > 0 || (d + 1 === 0); // good const bar = a ** b - (5 % d); // good if (a || (b && c)) { return d; } // good const bar = a + (b / c) * d; 
Enter fullscreen mode Exit fullscreen mode

Blocks

Use braces with all multiline blocks.

// bad if (test) return false; // good if (test) return false; // good if (test) { return false; } // bad function foo() { return false; } // good function bar() { return false; } 
Enter fullscreen mode Exit fullscreen mode

If you’re using multiline blocks with if and else, put else on the same line as your if block’s closing brace.

// bad if (test) { thing1(); thing2(); } else { thing3(); } // good if (test) { thing1(); thing2(); } else { thing3(); } 
Enter fullscreen mode Exit fullscreen mode

If an if block always executes a return statement, the subsequent else block is unnecessary. A return in an else if block following an if block that contains a return can be separated into multiple if blocks.

// bad function foo() { if (x) { return x; } else { return y; } } // bad function cats() { if (x) { return x; } else if (y) { return y; } } // bad function dogs() { if (x) { return x; } else { if (y) { return y; } } } // good function foo() { if (x) { return x; } return y; } // good function cats() { if (x) { return x; } if (y) { return y; } } // good function dogs(x) { if (x) { if (z) { return y; } } else { return z; } } 
Enter fullscreen mode Exit fullscreen mode

Thank for your time.

Top comments (1)

Collapse
 
andrewbaisden profile image
Andrew Baisden

Add markdown syntax highlighting to the code blocks to increase readability. A lot of people don't realise its possible to do 😄