Intro
๋ถ๋ช JS๋ฅผ ์ฐ๊ณ ์๋๋ฐ C์ธ์ด์ค๋ฝ๊ฒ ์ฝ๋ฉํ๋ ๋ด ์์ ์ ๋ฐ๊ฒฌํ์ฌ ์ด๋ ๊ฒ ์ต์ ๋ฌธ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค ! (์ฃผ์ํ ๊ฒ๋ง)
ES7(2016)
1. Array.prototype.includes()
๋ฐฐ์ด ๋ด์ ๊ฐ์ด ์๋์ง ์๋์ง ํ์ธ
๊ฐ์ด ์์ผ๋ฉด True, ์์ผ๋ฉด false ๋ฅผ ๋ฐํ
assert([1, 2, 3].includes(2) === true);
assert([1, 2, 3].includes(4) === false);
assert([1, 2, NaN].includes(NaN) === true);
assert([1, 2, -0].includes(+0) === true);
assert([1, 2, +0].includes(-0) === true);
assert(["a", "b", "c"].includes("a") === true);
assert(["a", "b", "c"].includes("a", 1) === false);
2. Exponentiation Operator(์ ๊ณฑ์ฐ์ฐ์)
let cubed = 2 ** 3;
// same as: 2 * 2 * 2
let a = 2;
a **= 2;
// same as: a = a * a;
let b = 3;
b **= 3;
// same as: b = b * b * b;
ES8(2017)
1.Object.values / Object.entries
values ๋งค์๋๋ ๊ฐ์ฒด ๋ด ๋ชจ๋ value ๊ฐ๋ค์ ๋ฐฐ์ด ํํ๋ก ๋ฐํ
entries ๋ฉ์๋๋ ๊ฐ์ฒด ๋ด key,value๋ฅผ ๋ฌถ์ด์ ๋ฐฐ์ด ํํ๋ก ๋ฐํ
const dimigoin = {
name: "๊น์ ์ธ",
age: 18,
class: 4,
};
Object.values(dimigoin); // ["๊น์ ์ธ", 18, 4]
Object.entries(dimigoin);// [["name", "๊น์ ์ธ"],["age", 18],["class", 4]]
2.String Padding
๋ฌธ์์ด์ ์ฌ๋ฐฑ or ๋ฌธ์๋ฅผ ์ถ๊ฐํ ์ ์๋ ๋ฉ์๋ padStart , padEnd
str.padStart(targetLength, padString) // ์
str.padEnd(targetLength, padString) // ๋ค
//targetLength : ๋ชฉํ ๋ฌธ์์ด ๊ธธ์ด, ํ์ ๋ฌธ์์ด์ ๊ธธ์ด๋ณด๋ค ์๋ค๋ฉด ๊ฐ ๊ทธ๋๋ก ๋ฐํ
//padString: ํ์ฌ ๋ฌธ์์ด์ ์ฑ์๋ฃ์ ๋ค๋ฅธ ๋ฌธ์์ด. ๊ธฐ๋ณธ๊ฐ์ ""
//return ๊ฐ : ๋ฐ๋ ๋ฌธ์์ด
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
'abc'.padEnd(10); // "abc "
'abc'.padEnd(10, "foo"); // "abcfoofoof"
'abc'.padEnd(6, "123456"); // "abc123"
'abc'.padEnd(1); // "abc"
3.Object.getOwnPropertyDescriptors
๊ธฐ์กด์ ์กด์ฌํ๋ Object.getOwnPropertyDescriptor์ s๊ฐ ๋ถ์
๊ธฐ์กด Object.getOwnPropertyDescriptor๋ ๊ฐ์ฒด์ ์์ฑ๋ช ์ ์ธ์๋ก ๋ฐ์์ ํด๋น ์์ฑ์ ์์ฑ ์ค๋ช ์๋ฅผ ๋ฐํ
Object.getOwnPropertyDescriptors๋ ๊ฐ์ฒด๋ง ์ธ์๋ก ๋ฐ์ ํด๋น ๊ฐ์ฒด ๋ด ์์ ์ ๋ชจ๋ ์์ฑ ์ค๋ช ์๋ฅผ ๋ฐํ
const dimigoin = {
name: "๊น์ ์ธ",
age: 18,
class: 4,
};
console.log(Object.getOwnPropertyDescriptor(dimigoin,"name"));
//{value: "๊น์ ์ธ", writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptors(dimigoin));
//{name: {…}, age: {…}, class: {…}}
//age: {value: 18, writable: true, enumerable: true, configurable: true}
//class: {value: 4, writable: true, enumerable: true, configurable: true}
//name: {value: "๊น์ ์ธ", writable: true, enumerable: true, configurable: true}
//__proto__: Object
4.Trailing commas(final commas)
javascript๋ ์ด๊ธฐ๋ถํฐ ๋ฐฐ์ด์ final commas๊ฐ ํ์ฉ๋์๋ค ! ES8๋ถํฐ๋ ํจ์์ ๋งค๊ฐ๋ณ์์๋ ํ์ฉํ๊ธฐ ์์ํจ ! ๋จ JSON์์๋ ํ์ฉ๋์ง ์์
final commas๋ฅผ ์ฐ๋ฉด ์๋ก์ด ์๋ฆฌ๋จผํธ,๋งค๊ฐ๋ณ์,์์ฑ์ ์ถ๊ฐํ ๋ ์ ์ฉํ๊ณ ์์ ์์ด ๋ณต์ฌํด์ ์ธ ์ ์์ ! ์ด ์ธ์๋ ๋ฒ์ ๊ด๋ฆฌ ์ด๋ ฅ์ด ๊ฐ๋จํ๊ณ ์ฝ๋ ํธ์ง์ด ๋ ํธํด์ง๋ค๋ ์ฅ์ ์ด ์๋จ๋ค ~
//Array
var arr = [
1,
2,
3,
];
//Object
var object = {
foo: "bar",
baz: "qwerty",
age: 42,
};
//function parameter, argument
//์๋ ๋ฌถ์ธ ์ฝ๋๋ ๋ชจ๋ ์ ํจํ๋ฉฐ ์๋ก ๊ฐ์
function f(p) {}
function f(p,) {}
f(p);
f(p,);
Math.max(10, 20);
Math.max(10, 20,);
5.Async Functions
๋น๋๊ธฐ ํจ์ ! , Promise๋ฅผ ๋์ฑ ์ฝ๊ฒ ๋ค๋ฃจ๊ณ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ง๊ธฐ ์ํด async,await ๋์ ! but ์ด ๋ด์ฉ์ ๋ฐ๋ก ๋น๋๊ธฐ ์ชฝ์์ ๋ค๋ฃจ๊ฒ ์ !
ES9(2018)
1.Rest/Spread Properties(๊ฐ์ฒด ๋ฆฌํฐ๋ด์์์ ์ ๊ฐ)
๊ฐ์ฒด ๋ฆฌํฐ๋ด์์๋ ์ ๊ฐ ๊ตฌ๋ฌธ์ด ๊ฐ๋ฅํด์ง !
์ ๊ฐ ๊ตฌ๋ฌธ์ด๋?
๋ฐฐ์ด์ด๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ iterable(๋ฐ๋ณต ๊ฐ๋ฅ)ํ Object๋ฅผ ๋ง ๊ทธ๋๋ก ์ ๊ฐํจ ! ์ฝ๋๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๊ฒ ๋ ๋น ๋ฅผ ๋ฏ
const num =[1,2,3]
console.log(...num) //1 2 3
//ํจ์ ํธ์ถ์์์ ์ ๊ฐ
function myFunction(x, y, z) {}
var args = [0, 1, 2];
myFunction(...args);
//๊ฐ์ฒด ๋ฆฌํฐ๋ด์์์ ์ ๊ฐ(ES9 ์ถ๊ฐ)
var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };
var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }
var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }
2.Promise.prototype.finally
promise์ finally๊ณผ ์ถ๊ฐ ๋จ ! ๊ธฐ์กด์ then ๊ณผ catch๋ง ์์์ผ๋ finally๋ ์ฑ๊ณต ์ฌ๋ถ์ ๊ด๊ณ์์ด promise ๊ฐ์ฒด๋ฅผ ๋ฐํํจ.
let isLoading = true;
fetch(myRequest).then(function(response) {
var contentType = response.headers.get("content-type");
if(contentType && contentType.includes("application/json")) {
return response.json();
}
throw new TypeError("Oops, we haven't got JSON!");
})
.then(function(json) { /* process your JSON further */ })
.catch(function(error) { console.log(error); })
.finally(function() { isLoading = false; });
3.Asynchronous Iteration
๋์ค์ ๋ค์ ์ดํดํด์ ์ธ ์์ .. ๋๋ฌด ์ด๋ ต์๋,,
ES10(2019)
1.Optional catch binding
try,catch ๊ตฌ๋ฌธ์ ์ธ ๋ ์๋ catch์ ๋งค๊ฐ๋ณ์๊ฐ ๊ผญ ์์ด์ผ ํ์ง๋ง ES10 ๋ถํฐ ์ ํ์ ์ผ๋ก ๋ฐ๋ !
try {
doSomethingThatMightThrow();
} catch (exception) {
// ^^^^^^^^^
// We must name the binding, even if we don’t use it!
handleException();
}
//ES10
try {
doSomethingThatMightThrow();
} catch { // → No binding!
handleException();
}
2.Symbol.prototype.description
์ด์ ์ Symbol์ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด ์ด๋ฌํ ์ฝ๋๋ฅผ ์ง์ผ ๋ฌ์
const symbol = Symbol('foo');
// ^^^^^
symbol.toString();
// → 'Symbol(foo)'
// ^^^
symbol.toString().slice(7, -1); // ๐ค
// → 'foo'
๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ ๋์ ๋ด๋ ๋ณ๋ก์. ๊ทธ๋์ Symbol.prototype.description์ ๋์ !
const symbol = Symbol('foo');
// ^^^^^
symbol.description;
// → 'foo'
3.Object.fromEntries()
ES8์์ ๋์ ๋ Object.entries์ ํธํ๋๋ ๋ฉ์๋์ ! entries๋ฅผ ํตํด ๋ง๋ค์ด์ง ๋ฐฐ์ด์ ์ธ์๋ก ๋ฐ์ ๋ค์ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ค
const dimigoin = {
name: "๊น์ ์ธ",
age: 18,
class: 4,
};
const entries = Object.entries(dimigoin)
const fromEntries = Object.fromEntries(entries)
console.log(fromEntries) //{name: "๊น์ ์ธ", age: 18, class: 4}
4.String.prototype.trimStart()/trimEnd()
๋ฌธ์์ด์ ์ , ๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํด์ค. trimStart๋ trimLeft๋ก, trimEnd๋ trimRight๋ผ๋ ๋ณ์นญ์ผ๋ก ์ธ ์ ์์.
const greeting = ' Hello world! ';
console.log(greeting.trimStart());
// expected output: "Hello world! ";
console.log(greeting.trimEnd());
// expected output: ' Hello world!';
5.Array.prototype.flat()
flat() ๋ฉ์๋๋ ๋ชจ๋ ํ์ ๋ฐฐ์ด ์์๋ฅผ ์ง์ ํ ๊น์ด๊น์ง ์ฌ๊ท์ ์ผ๋ก ์ด์ด๋ถ์ธ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
๋ํ ๋ฐฐ์ด์ ๊ตฌ๋ฉ๋ ์ ๊ฑฐํจ
const arr1 = [1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
const arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const arr5 = [1, 2, , 4, 5];
arr5.flat();
// [1, 2, 4, 5]
6.Array.prototype.flatMap()
flat์ Map ํจ์๋ฅผ ํฉ์น๊ฑฐ๋ผ ๋ณด๋ฉด ๋จ ! ๋จผ์ ๋ฐฐ์ด์ ๊ฐ ์๋ฆฌ๋จผํธ์ map ์ํ ํ ์์ flat์ ์ํ ! (1 depth๋ง)
let arr1 = [1, 2, 3, 4];
arr1.map(x => [x * 2]);
// [[2], [4], [6], [8]]
arr1.flatMap(x => [x * 2]);
// [2, 4, 6, 8]
// ํ ๋ ๋ฒจ๋ง ํํํ๋จ
arr1.flatMap(x => [[x * 2]]);
// [[2], [4], [6], [8]]
ES11(2020)
1.Optional chaining(?.)
์ฐธ์กฐ๋ฅผ ํ ๋ ๊ฐ์ด ์๋ ์ง ์๋ ์ง ๊ฒ์ฆํ ๋ Optional chaining์ ์ฐ๋ฉด ์ฐธ์กฐ๊ฐ null or undefined์ผ ๋ ์๋ฌ ๋์ undefined๋ฅผ ๋ฐํํด์ค ! (๊ฐ์ธ์ ์ผ๋ก react ํ๋ก์ ํธ ํ ๋ ์ค๋ฅ ์ ๋์ ์ ๋ง ์๊ธดํ๊ฒ ์ฌ์ฉ ์ค !)
//default
const dimigoin = {
name: "๊น์ ์ธ",
age: 18,
class:4,
personality:{
habit:"sports"
}
};
const dimigoin2= {
name:"์ฅ์ ์ธ",
age:18,
class:4
}
function printClass(person){
console.log(person.personality.habit)
}
printClass(dimigoin) //sports
printClass(dimigoin2) //error
//Optional Chaining
const dimigoin = {
name: "๊น์ ์ธ",
age: 18,
class:4,
personality:{
habit:"sports"
}
};
const dimigoin2= {
name:"์ฅ์ ์ธ",
age:18,
class:4
}
function printClass(person){
console.log(person?.personality?.habit)
}
printClass(dimigoin) //sports
printClass(dimigoin2) //undefined
2.Nullish coalescing Operator
์ฃผ๋ก ๊ธฐ๋ณธ๊ฐ์ ํ ๋นํ ๋ || ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ ! BUT, 0,' ' ๊ฐ์ ๊ฐ๋ค์ด ๋ค์ด๊ฐ ๋ ์๋๋๋ก ์๋ํ์ง ์์ ์ ์์ !
//์ฌ์ฉ์๋ ์ต๋ช
์ ์ํจ
const name =' '
const userName = name || 'Guest'
console.log(userName) //Guest
//์ฌ์ฉ์๋ 0์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ์ํจ
const num = 0;
const message = num || 'undefined'
console.log(message) //undefined
Nullish coalescing Operator๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ด Null ์ด๋ undefined์ธ ๊ฒฝ์ฐ์๋ง ๊ธฐ๋ณธ ๊ฐ์ ํ ๋นํด์ค ์ ์์ ! ์์ผ๋ก or ์ฐ์ฐ์ ๋ณด๋ค๋ Nullish coalescing Operator๋ฅผ ์ ์ฉํ์ !
//์ฌ์ฉ์๋ ์ต๋ช
์ ์ํจ
const name =' '
const userName = name ?? 'Guest'
console.log(userName) //
//์ฌ์ฉ์๋ 0์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ์ํจ
const num = 0;
const message = num ?? 'undefined'
console.log(message) // 0
3.globalThis
๊ธฐ์กด์๋ js ์คํํ๊ฒฝ์ ๋ฐ๋ผ์ global ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ด ๋ฌ๋์
๋ธ๋ผ์ฐ์ ์์๋ window,self,frame ์ฌ์ฉ, ๋ ธ๋์์๋ global, Web Worker*(Web Worker๋ script ์คํ์ ๋ฉ์ธ ์ฐ๋ ๋๊ฐ ์๋๋ผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฐ๋ ๋์์ ์คํํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ์ ์ ๋๋ค.)์์๋ self๋ฅผ ํตํด์ ์ ๊ทผํ์์.*
But ์ด์ ๋ globalThis๋ฅผ ์ด์ฉํ๋ฉด ๋ชจ๋ ํ๊ฒฝ์์ ์ ๊ทผ ๊ฐ๋ฅ
// ๋ธ๋ผ์ฐ์ ์คํ ํ๊ฒฝ ๊ธฐ์ค
globalThis === window // true
4.Dynamic import
Dynamic Import ๋ ์ผ๋ฐ์ ์ธ ์ ์ ์ธ Module Import ๋ฅผ ํ์ํ ์์ ์ ๋ก๋ ํ ์ ์๋๋ก ๋์์ค ! ์น ํ์ด์ง์ ์ฑ๋ฅ ์ฌ๋ฆฌ๊ธฐ ๊ฐ๋ฅ ! react ๊ฐ์ SPA์์ ์ฐ๋ฉด ์ข์ ๋ฏ??(์ฃผ๊ด์ ์๊ฐ)
5.BigInt
BigInt๋ Number ์์ ๊ฐ์ด ์์ ์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ ์ต๋์น์ธ 2^53 - 1๋ณด๋ค ํฐ ์ ์๋ฅผ ํํํ ์ ์๋ ๋ด์ฅ ๊ฐ์ฒด์ ๋๋ค.
BigInt๋ ์ ์ ๋ฆฌํฐ๋ด์ ๋ค์ n์ ๋ถ์ด๊ฑฐ๋(10n) ํจ์ BigInt()๋ฅผ ํธ์ถํด ์์ฑํ ์ ์์ต๋๋ค.
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// โช 9007199254740991n
const hugeString = BigInt("9007199254740991");
// โช 9007199254740991n
const hugeHex = BigInt("0x1fffffffffffff");
// โช 9007199254740991n
const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111");
// โช 9007199254740991n
5.String.prototype.matchAll
์ ๊ทํํ์ ๊ด๋ จ์ธ๋ฐ ์์ง ์ ๊ทํํ์ ๊ณต๋ถ๋ฅผ ์ํด์ ๋ชจ๋ฅด๋ ์ถํ์ ์ฐ๊ฒ ์ผ,,
6.Promise.allSettled()
Promise.allSettled() ๋ฉ์๋๋ ๋ฐฐ์ด์ด๋ ๋ณ๋์ ๋์ด ๊ฐ๋ฅํ ๊ฐ์ฒด๋ฅผ ํตํด ๋์ด๋ Promise๋ชจ์์ด ๋ชจ๋ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถํ์ ๋์ ๋ํ ๋์์ ํ ์ ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];
Promise.allSettled(promises).
then((results) => results.forEach((result) => console.log(result.status)));
// expected output:
// "fulfilled"
// "rejected"
ES11(2020)
1.String.prototype.replaceAll()
๊ธฐ์กด์ ์๋ replace์์ ์ถ๊ฐ๋ ๊ฒ์ผ๋ก ๋ฌธ์์ด์์ ๋ฐ๊ฟ ๋ฌธ์๋ฅผ ๋ชจ๋ ์ฐพ์ ์๋ก์ด ๋ฌธ์๋ก ๋ฐ๊ฟ์ค
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
console.log(p.replaceAll('dog', 'monkey'));
// expected output: "The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy?"
2.Promise.any()
์ด๋ค promise ํ๋๋ผ๋ resolve ๋๋ฉด resovle ๋จ
const promise1 = Promise.reject(0);
const promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'quick'));
const promise3 = new Promise((resolve) => setTimeout(resolve, 500, 'slow'));
const promises = [promise1, promise2, promise3];
Promise.any(promises).then((value) => console.log(value));
// expected output: "quick"
3.WeakRef
๋์ค์ ์ธ๊ฒ์
4.Logical assignment operators
์ด์ (??, &&,||) ๋ a += 2 ์ฒ๋ผ ํ ๋น ์ฐ์ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํจ
expr1 ||= expr2 // expr1 || expr2
expr1 &&= expr2 // expr1 && expr2
expr1 ??= expr2 // expr1 ?? expr2
5.Separators for numeric literals
์ด์ ํฐ ์ซ์ ๊ตฌ๋ถ์ _๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฅ !
const number = 1_000_000
const money = 1_000_000.123_456;
const octal = 0o123_123;
P.S : ๋ ธ์ ์์๋ ์ต์ ๋ฌธ๋ฒ์ ๋ค ์ง์ํด์คฌ๋๋ฐ ํฐ์คํ ๋ฆฌ ์ฝ๋ ๋ธ๋ญ์ ์ง์์ ์ ํด์ค๋ค ใ ใ ,,
'Develop ๐ป > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JS ์๋ฃ ๊ณต์ / JS ๊ธฐ์ด / ์ฝ๋๋ฒ ์ด์ปค๋ฆฌ (0) | 2021.09.01 |
---|---|
[JavaScript] Three.js๋ก ์ฝ๊ฒ ๋ง๋๋ ์ฐ์ฃผ ! (1) | 2021.07.25 |
๋๊ธ