151 lines
3.6 KiB
Markdown
151 lines
3.6 KiB
Markdown
|
# Modern JavaScript/TypeScript
|
|||
|
|
|||
|
Note: run code quickly with https://codesandbox.io/s/
|
|||
|
|
|||
|
## Quirks
|
|||
|
|
|||
|
### Comparing scalar, arrays, and objects
|
|||
|
|
|||
|
#### Always use triple comparators (`===`) instead of double (`==`)
|
|||
|
|
|||
|
```javascript
|
|||
|
// ???
|
|||
|
console.assert('1' == 1)
|
|||
|
|
|||
|
// Better
|
|||
|
console.assert(!('1' === 1))
|
|||
|
console.assert('1' !== 1)
|
|||
|
```
|
|||
|
|
|||
|
#### Comparing non-scalar
|
|||
|
|
|||
|
Applied on arrays and objects, `==` and `===` will check for object identity, which is almost never what you want.
|
|||
|
|
|||
|
```javascript
|
|||
|
console.assert({a: 1} != {a: 1})
|
|||
|
console.assert({a: 1} !== {a: 1})
|
|||
|
|
|||
|
const obj = {a: 1}
|
|||
|
const obj2 = obj
|
|||
|
console.assert(obj == obj2)
|
|||
|
console.assert(obj === obj2)
|
|||
|
```
|
|||
|
|
|||
|
Use a library such as [lodash](https://lodash.com/) to properly compare objects and array
|
|||
|
|
|||
|
```javascript
|
|||
|
import _ from 'lodash'
|
|||
|
|
|||
|
console.assert(_.isEqual({a: 1}, {a: 1}))
|
|||
|
console.assert(_.isEqual([1, 2], [1, 2]))
|
|||
|
|
|||
|
|
|||
|
## Object assignment and destructuring
|
|||
|
|
|||
|
### Objects
|
|||
|
|
|||
|
```javascript
|
|||
|
const toaster = {size: 2, color: 'red', brand: 'NoName'};
|
|||
|
|
|||
|
// Get one object key
|
|||
|
const {size} = toaster;
|
|||
|
console.assert(size === 2)
|
|||
|
|
|||
|
// Get the rest with ...rest
|
|||
|
const {color, brand, ...rest} = toaster;
|
|||
|
console.assert(_.isEqual(rest, {size: 2}));
|
|||
|
```
|
|||
|
|
|||
|
### Array
|
|||
|
|
|||
|
```javascript
|
|||
|
const theArray = [1, 2, 3];
|
|||
|
const [first, second] = theArray;
|
|||
|
const [first1, second2, ...rest] = theArray;
|
|||
|
|
|||
|
console.assert(first === 1);
|
|||
|
console.assert(second === 2);
|
|||
|
console.assert(_.isEqualWith(rest, [3]));
|
|||
|
```
|
|||
|
|
|||
|
## `let` and `const`
|
|||
|
|
|||
|
```javascript
|
|||
|
const constantVar = 'a';
|
|||
|
|
|||
|
// Raises "constantVar" is read-only
|
|||
|
constantVar = 'b';
|
|||
|
|
|||
|
let mutableVar = 'a';
|
|||
|
mutableVar = 'a';
|
|||
|
|
|||
|
// Note: this will work ok
|
|||
|
const constantObject = {a: 1}
|
|||
|
constantObject.a = 2
|
|||
|
constantObject.b = 3
|
|||
|
|
|||
|
// Raises: "constantObject" is read-only
|
|||
|
constantObject = {a: 1}
|
|||
|
|
|||
|
// const and let are block scoped. A block is enclosed in {}
|
|||
|
{
|
|||
|
const a = 'a';
|
|||
|
console.log({a})
|
|||
|
}
|
|||
|
// Raises: ReferenceError: a is not defined
|
|||
|
console.log({a})
|
|||
|
```
|
|||
|
|
|||
|
Note: try to use `const` as much as you can.
|
|||
|
|
|||
|
- More constraints = safer code
|
|||
|
- Some kind of "immutability" is good (since `const` objects can be modified, it is not true immutability)
|
|||
|
- You can't define a `const` without providing its initial value
|
|||
|
- Most people do this in modern JS
|
|||
|
|
|||
|
Never use `var`:
|
|||
|
|
|||
|
- `var` variables are initialized with `undefined`, while `let` and `const` vars are not initialized and will raise an error if used before definition.
|
|||
|
- `var` is globally or function-scoped, depending on whether it is used inside a function.
|
|||
|
- `let` and `const` are block-scoped
|
|||
|
- `let` and `const` cannot be reused for the same variable name
|
|||
|
|
|||
|
## Arrow functions
|
|||
|
|
|||
|
The first advantage of arrow function is that they're shorter to write:
|
|||
|
|
|||
|
```javascript
|
|||
|
// You can define a function this way:
|
|||
|
const myFunction = function() {
|
|||
|
console.log("hello world");
|
|||
|
}
|
|||
|
|
|||
|
// With an arrow function, you save a few characters:
|
|||
|
const myArrowFunction = () => {
|
|||
|
console.log("hello world");
|
|||
|
}
|
|||
|
|
|||
|
// Some things, like params parentheses, and function code brackets, are optional
|
|||
|
const myFunctionToBeShortened = function(a) {
|
|||
|
return a;
|
|||
|
}
|
|||
|
|
|||
|
// Shorter arrow function
|
|||
|
const myFunctionToBeShortenedArrowV1 = (a) => {
|
|||
|
return a;
|
|||
|
}
|
|||
|
|
|||
|
// Shortest arrow function
|
|||
|
// Remove single param parenthesis, remove function code bracket, remove return
|
|||
|
const myFunctionToBeShortenedArrowV2 = a => a
|
|||
|
console.assert(myFunctionToBeShortenedArrowV2(1) === 1)
|
|||
|
```
|
|||
|
|
|||
|
Best practices:
|
|||
|
|
|||
|
- I usually keep the parameters parenthesis. If you add a parameter, you'll have to add them back.
|
|||
|
|
|||
|
## References
|
|||
|
|
|||
|
- [ES5 to ESNext — here’s every feature added to JavaScript since 2015](https://www.freecodecamp.org/news/es5-to-esnext-heres-every-feature-added-to-javascript-since-2015-d0c255e13c6e/)
|