์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ผํ ์์๋ถํฐ ํ์ฌ์ ๊ฐ๋ ฅํ ๋ชจ์ต๊น์ง ๊ทธ ๋ฐ์ ๊ณผ์ ์ ์ดํด๋ณด์ธ์. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ ์ข ํฉ ํ์๋ผ์ธ์ ๋๋ค.
์น ํ๋ซํผ ๋ฐ์ ํ์๋ผ์ธ: ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด ๊ธฐ๋ฅ ์ญ์ฌ
์น์ ๊ตฌ๋ํ๋ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ทธ ํ์ ์ด๋๋ก ๋๋ผ์ด ๋ณํ๋ฅผ ๊ฒช์์ต๋๋ค. ์น ํ์ด์ง์ ์ํธ์์ฉ์ ์ถ๊ฐํ๊ธฐ ์ํ ์คํฌ๋ฆฝํ ์ธ์ด๋ก ์์ํ๋ ๊ฒ์ด ์ด์ ๋ ํ๋ก ํธ์๋, ๋ฐฑ์๋, ๋ชจ๋ฐ์ผ, ์ฌ์ง์ด ๋ฐ์คํฌํฑ ๊ฐ๋ฐ์๋ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ์ธ์ด๋ก ๋ฐ์ ํ์ต๋๋ค. ์ด ์ข ํฉ์ ์ธ ํ์๋ผ์ธ์ ๊ฐ ECMAScript(ES) ์ฌ์์์ ๋์ ๋ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์กฐ๋ช ํ๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐ์ ์ ๋ํ ๊ธ๋ก๋ฒํ ๊ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋น์ ์ด ๋ ธ๋ จํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ ํ ๋์ด๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์ ์ฒ์ ์ ๋ฌธํ๋ ์ฌ๋์ด๋ , ์๋ฐ์คํฌ๋ฆฝํธ์ ์ญ์ฌ๋ฅผ ํตํ ์ด ์ฌ์ ์ ์ธ์ด์ ๊ทธ ๊ธฐ๋ฅ์ ๋ํ ๋น์ ์ ์ดํด๋ฅผ ๋์ฑ ๊น๊ฒ ํด์ค ๊ฒ์ ๋๋ค.
์ด์ฐฝ๊ธฐ: JavaScript 1.0 - 1.5 (1995-1999)
์๋ฐ์คํฌ๋ฆฝํธ๋ 1995๋ ๋ท์ค์ผ์ดํ์ ๋ธ๋ ๋ ์์ดํฌ์ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ์ด๊ธฐ ๋ชฉํ๋ ์น ํ์ด์ง๋ฅผ ๋ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค. ์ด ์ด๊ธฐ ๋ฒ์ ๋ค์ ์ค๋๋ ์๋ ์ฌ์ ํ ๊ธฐ๋ณธ์ ์ธ ํต์ฌ ๊ฐ๋ ๋ค์ ๋์ ํ๋ฉฐ ์ธ์ด์ ๊ธฐ์ด๋ฅผ ๋ค์ก์ต๋๋ค.
- JavaScript 1.0 (1995): ์ด๊ธฐ ๋ฆด๋ฆฌ์ค, ๊ธฐ๋ณธ์ ์ธ ์คํฌ๋ฆฝํ ๊ธฐ๋ฅ์ ์ค์ ์ ๋ .
- JavaScript 1.1 (1996): ์ด๋ฒคํธ ํธ๋ค๋ฌ(์: `onclick`, `onmouseover`), ๊ธฐ๋ณธ ํผ ์ ํจ์ฑ ๊ฒ์ฌ, ์ฟ ํค ์กฐ์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ๋์ ๋จ. ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ๋ ์ํธ์์ฉ์ ์ธ ์น ํ์ด์ง๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ์ต๋๋ค.
- JavaScript 1.2 (1997): ํจํด ๋งค์นญ์ ์ํ ์ ๊ท ํํ์์ด ์ถ๊ฐ๋์ด ํ ์คํธ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ํฌ๊ฒ ํฅ์๋จ.
- JavaScript 1.3 (1998): ๋ ๋ฐ์ ๋ ๋ฌธ์์ด ์กฐ์ ๋ฐ ๋ ์ง ์ฒ๋ฆฌ ์ง์์ด ํฌํจ๋จ.
- JavaScript 1.5 (1999): ์ฌ์ํ ๊ฐ์ ๋ฐ ๋ฒ๊ทธ ์์ ์ด ์ ๊ณต๋จ.
์์ : ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๊ฐ๋จํ JavaScript 1.1 ์คํฌ๋ฆฝํธ:
<button onclick="alert('Hello, world!')">Click Me</button>
ํ์คํ ์๋: ECMAScript 1-3 (1997-1999)
์๋ก ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ๋ ECMA ์ธํฐ๋ด์ ๋์ ์ํด ECMAScript(ES)๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์คํ๋์์ต๋๋ค. ์ด ํ์คํ ๊ณผ์ ์ ์ธ์ด๋ฅผ ํตํฉํ๊ณ ํํธํ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋์์ต๋๋ค.
- ECMAScript 1 (1997): ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฒซ ๋ฒ์งธ ํ์คํ ๋ฒ์ ์ผ๋ก, ์ธ์ด์ ํต์ฌ ๊ตฌ๋ฌธ๊ณผ ์๋ฏธ๋ฅผ ์ ์ํจ.
- ECMAScript 2 (1998): ISO/IEC 16262 ํ์ค์ ๋ง์ถ๊ธฐ ์ํ ์ฌ์ํ ํธ์ง์์ ๋ณ๊ฒฝ์ด ์์์.
- ECMAScript 3 (1999): ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ `try...catch`, ๊ฐ์ ๋ ์ ๊ท ํํ์, ๋ ๋ง์ ๋ฐ์ดํฐ ํ์ ์ง์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ๋์ ๋จ.
์์ : ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ECMAScript 3์์ `try...catch` ์ฌ์ฉํ๊ธฐ:
try {
// ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ ์ฝ๋
let result = 10 / undefined; // ์ด ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค
console.log(result);
} catch (error) {
// ์ค๋ฅ ์ฒ๋ฆฌ
console.error("์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: " + error);
}
์์ด๋ฒ๋ฆฐ ์๋: ECMAScript 4 (ํ๊ธฐ)
ECMAScript 4๋ ํด๋์ค, ์ธํฐํ์ด์ค, ์ ์ ํ์ดํ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๋์ ํ์ฌ ์ธ์ด๋ฅผ ๋๋์ ์ผ๋ก ๊ฐํธํ๋ ค๋ ์ผ์ฌ ์ฐฌ ์๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ฒฌ ๋ถ์ผ์น์ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์ด ๋ ธ๋ ฅ์ ๊ฒฐ๊ตญ ํ๊ธฐ๋์์ต๋๋ค. ES4๋ ์คํ๋์ง ์์์ง๋ง, ๊ทธ ์์ด๋์ด๋ค์ ์ดํ ๋ฒ์ ์ ECMAScript์ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค.
๋ฅด๋ค์์ค: ECMAScript 5 (2009)
ES4์ ์คํจ ์ดํ, ์ด์ ์ ๋ ์ ์ง์ ์ธ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ ํ๋์์ต๋๋ค. ECMAScript 5๋ ์ธ์ด์ ๋ช ๊ฐ์ง ์ค์ํ ๊ฐ์ ์ฌํญ์ ๊ฐ์ ธ์ ๊ธฐ๋ฅ๊ณผ ์ ๋ขฐ์ฑ์ ํฅ์์์ผฐ์ต๋๋ค.
- Strict Mode (์๊ฒฉ ๋ชจ๋): `'use strict'` ์ง์์ด๋ฅผ ํตํด ๋์ ๋ ์๊ฒฉ ๋ชจ๋๋ ๋ ์๊ฒฉํ ํ์ฑ๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ์ฌ ์ผ๋ฐ์ ์ธ ์ค์๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋ ๋ณด์์ ํฅ์์ํต๋๋ค.
- JSON ์ง์: `JSON.parse()` ๋ฐ `JSON.stringify()`๋ฅผ ํตํ JSON ํ์ฑ ๋ฐ ์ง๋ ฌํ์ ๋ํ ๋ค์ดํฐ๋ธ ์ง์.
- ๋ฐฐ์ด ๋ฉ์๋: ๋ ํจ์จ์ ์ธ ๋ฐฐ์ด ์กฐ์์ ์ํด `forEach()`, `map()`, `filter()`, `reduce()`, `some()`, `every()`์ ๊ฐ์ ์๋ก์ด ๋ฐฐ์ด ๋ฉ์๋๊ฐ ์ถ๊ฐ๋จ.
- ๊ฐ์ฒด ์์ฑ: `Object.defineProperty()` ๋ฐ `Object.defineProperties()`์ ๊ฐ์ด ๊ฐ์ฒด ์์ฑ์ ์ ์ํ๊ณ ์ ์ดํ๋ ๋ฉ์๋๊ฐ ๋์ ๋จ.
- Getter์ Setter: ๊ฐ์ฒด ์์ฑ์ ๋ํ getter ๋ฐ setter ํจ์๋ฅผ ์ ์ํ ์ ์๊ฒ ๋์ด ๊ฐ์ฒด ๋ฐ์ดํฐ์ ๋ํ ๋ ์ ์ด๋ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง.
์์ : ECMAScript 5์์ `Array.map()`์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด ๋ณํํ๊ธฐ:
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map(function(number) {
return number * number;
});
console.log(squaredNumbers); // ์ถ๋ ฅ: [1, 4, 9, 16, 25]
ํ๋ ์๋: ECMAScript 6 (ES2015) ์ดํ
ECMAScript 6 (ES2015)๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ฅ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํจ ์๋ง์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํ ํ๊ธฐ์ ์ธ ๋ฆด๋ฆฌ์ค์์ต๋๋ค. ์ด ๋ฆด๋ฆฌ์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ก์ด ์๋๋ฅผ ์ด์์ผ๋ฉฐ, ๋งค๋ ๋ ์๊ณ ์ง์ค๋ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ๋์ ํ๋ ์ฐ๊ฐ ์ ๋ฐ์ดํธ๊ฐ ์์๋์์ต๋๋ค.
ECMAScript 6 (ES2015)
- ํด๋์ค(Classes): ํ๋กํ ํ์ ๊ธฐ๋ฐ ์์์ ๋ํ ๋ฌธ๋ฒ์ ์คํ(syntactic sugar)์ผ๋ก, ๋ค๋ฅธ ์ธ์ด์์ ์จ ๊ฐ๋ฐ์๋ค์๊ฒ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ ์น์ํ๊ฒ ๋ง๋ฆ.
- ํ์ดํ ํจ์(Arrow Functions): ํจ์๋ฅผ ์์ฑํ๋ ๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ผ๋ก, ๋ ์์ปฌ `this` ๋ฐ์ธ๋ฉ์ ๊ฐ์ง.
- ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด(Template Literals): ๋ฌธ์์ด ๋ด์ ํํ์์ ํฌํจํ ์ ์๊ฒ ํ์ฌ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ๋ ์ฝ๊ณ ๊ฐ๋ ์ฑ ์๊ฒ ๋ง๋ฆ.
- Let๊ณผ Const: ๋ธ๋ก ๋ฒ์์ ๋ณ์ ์ ์ธ์ผ๋ก, ๋ณ์ ๋ฒ์์ ๋ํ ๋ ๋ง์ ์ ์ด๋ฅผ ์ ๊ณตํจ.
- ๊ตฌ์กฐ ๋ถํด ํ ๋น(Destructuring): ๊ฐ์ฒด์ ๋ฐฐ์ด์์ ๊ฐ์ ์ถ์ถํ์ฌ ๋ณ์์ ํ ๋นํ ์ ์๊ฒ ํจ.
- ๋ชจ๋(Modules): ๋ชจ๋์ ๋ํ ๋ค์ดํฐ๋ธ ์ง์์ผ๋ก, ๋ ๋์ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํจ.
- ํ๋ก๋ฏธ์ค(Promises): ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ ์ฐ์ํ ๋ฐฉ๋ฒ์ผ๋ก, ์ฝ๋ฐฑ์ ๋ ๊ตฌ์กฐํ๋ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋์ฒดํจ.
- ๊ธฐ๋ณธ ๋งค๊ฐ๋ณ์(Default Parameters): ํจ์ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ ์ ์๊ฒ ํจ.
- ๋๋จธ์ง ๋ฐ ์ ๊ฐ ์ฐ์ฐ์(Rest and Spread Operators): ํจ์ ์ธ์์ ๋ฐฐ์ด ์์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ.
์์ : ES2015์์ ํด๋์ค์ ํ์ดํ ํจ์ ์ฌ์ฉํ๊ธฐ:
class Person {
constructor(name) {
this.name = name;
}
greet = () => {
console.log(`์๋
ํ์ธ์, ์ ์ด๋ฆ์ ${this.name}์
๋๋ค`);
}
}
const person = new Person("Alice");
person.greet(); // ์ถ๋ ฅ: ์๋
ํ์ธ์, ์ ์ด๋ฆ์ Alice์
๋๋ค
ECMAScript 2016 (ES7)
- Array.prototype.includes(): ๋ฐฐ์ด์ด ํน์ ์์๋ฅผ ํฌํจํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํจ.
- ๊ฑฐ๋ญ์ ๊ณฑ ์ฐ์ฐ์(**): ์ซ์๋ฅผ ๊ฑฐ๋ญ์ ๊ณฑํ๋ ๊ฒ์ ๋ํ ์ถ์ฝํ.
์์ : ES2016์์ ๊ฑฐ๋ญ์ ๊ณฑ ์ฐ์ฐ์ ์ฌ์ฉํ๊ธฐ:
const result = 2 ** 3; // 2์ 3์ ๊ณฑ
console.log(result); // ์ถ๋ ฅ: 8
ECMAScript 2017 (ES8)
- Async/Await: ํ๋ก๋ฏธ์ค๋ก ์์ ํ๊ธฐ ์ํ ๋ฌธ๋ฒ์ ์คํ์ผ๋ก, ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ๊ณ ์ธ ์ ์๊ฒ ๋ง๋ฆ.
- Object.entries(): ์ฃผ์ด์ง ๊ฐ์ฒด ์์ ์ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ [ํค, ๊ฐ] ์์ ๋ฐฐ์ด์ ๋ฐํํจ.
- Object.values(): ์ฃผ์ด์ง ๊ฐ์ฒด ์์ ์ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ ๊ฐ์ ๋ฐฐ์ด์ ๋ฐํํจ.
- ๋ฌธ์์ด ํจ๋ฉ(String Padding): ๋ฌธ์์ด์ ๋ฌธ์๋ก ์ฑ์ฐ๋ ๋ฉ์๋.
์์ : ES2017์์ async/await ์ฌ์ฉํ๊ธฐ:
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.error("๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ค๋ฅ: " + error);
}
}
fetchData();
ECMAScript 2018 (ES9)
- ๋๋จธ์ง/์ ๊ฐ ์์ฑ(Rest/Spread Properties): ๊ฐ์ฒด ์์ฑ์ ๋๋จธ์ง/์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํจ.
- ๋น๋๊ธฐ ๋ฐ๋ณต(Asynchronous Iteration): ๋น๋๊ธฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ฐ๋ณตํ ์ ์๊ฒ ํจ.
- Promise.prototype.finally(): ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ๋ ๋(์ดํ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋ ๋) ํญ์ ์คํ๋๋ ์ฝ๋ฐฑ.
- RegExp ๊ฐ์ : ๊ณ ๊ธ ์ ๊ท ํํ์ ๊ธฐ๋ฅ.
์์ : ES2018์์ ๋๋จธ์ง ์์ฑ ์ฌ์ฉํ๊ธฐ:
const { a, b, ...rest } = { a: 1, b: 2, c: 3, d: 4 };
console.log(a); // ์ถ๋ ฅ: 1
console.log(b); // ์ถ๋ ฅ: 2
console.log(rest); // ์ถ๋ ฅ: { c: 3, d: 4 }
ECMAScript 2019 (ES10)
- Array.prototype.flat(): ๋ชจ๋ ํ์ ๋ฐฐ์ด ์์๋ฅผ ์ง์ ๋ ๊น์ด๊น์ง ์ฌ๊ท์ ์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์ ๋ฐฐ์ด์ ์์ฑํจ.
- Array.prototype.flatMap(): ๋งคํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์์๋ฅผ ๋งคํํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฐฐ์ด๋ก ํํํํจ.
- String.prototype.trimStart() / trimEnd(): ๋ฌธ์์ด์ ์์/๋์์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํจ.
- Object.fromEntries(): ํค-๊ฐ ์ ๋ชฉ๋ก์ ๊ฐ์ฒด๋ก ๋ณํํจ.
- ์ ํ์ catch ๋ฐ์ธ๋ฉ(Optional Catch Binding): ํ์ํ์ง ์์ ๊ฒฝ์ฐ catch ๋ฐ์ธ๋ฉ ๋ณ์๋ฅผ ์๋ตํ ์ ์๊ฒ ํจ.
- Symbol.prototype.description: Symbol ๊ฐ์ฒด์ ์ ํ์ ์ค๋ช ์ ๋ฐํํ๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ.
์์ : ES2019์์ `Array.flat()` ์ฌ์ฉํ๊ธฐ:
const nestedArray = [1, [2, [3, [4]]]];
const flattenedArray = nestedArray.flat(Infinity); // ๋ฌดํ ๊น์ด๋ก ํํํ
console.log(flattenedArray); // ์ถ๋ ฅ: [1, 2, 3, 4]
ECMAScript 2020 (ES11)
- BigInt: ์์์ ํฌ๊ธฐ ์ ์๋ฅผ ๋ํ๋ด๋ ์๋ก์ด ์์ ํ์ .
- ๋์ import(): ๋ฐํ์์ ๋ชจ๋์ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํจ.
- ๋ ๋ณํฉ ์ฐ์ฐ์(Nullish Coalescing Operator) (??): ์ผ์ชฝ ํผ์ฐ์ฐ์๊ฐ null ๋๋ undefined์ผ ๋ ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์๋ฅผ ๋ฐํํจ.
- ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์(Optional Chaining Operator) (?.): null ๋๋ undefined ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ์ธํ์ง ์๊ณ ๋ ์ค์ฒฉ๋ ๊ฐ์ฒด ์์ฑ์ ์ ๊ทผํ ์ ์๊ฒ ํจ.
- Promise.allSettled(): ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋ ํ์ ํด๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ฉฐ, ๊ฐ ํ๋ก๋ฏธ์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ํ๋ ๊ฐ์ฒด ๋ฐฐ์ด์ ํฌํจํจ.
- globalThis: ๋ค๋ฅธ ํ๊ฒฝ(๋ธ๋ผ์ฐ์ , Node.js ๋ฑ)์์ ์ ์ญ ๊ฐ์ฒด์ ์ ๊ทผํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ.
์์ : ES2020์์ ๋ ๋ณํฉ ์ฐ์ฐ์ ์ฌ์ฉํ๊ธฐ:
const name = null;
const displayName = name ?? "Guest";
console.log(displayName); // ์ถ๋ ฅ: Guest
ECMAScript 2021 (ES12)
- String.prototype.replaceAll(): ๋ฌธ์์ด์์ ํ์ ๋ฌธ์์ด์ ๋ชจ๋ ๋ฐ์์ ๋์ฒดํจ.
- Promise.any(): ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ์ดํฐ๋ฌ๋ธ์ ๋ฐ์, ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํ๋๋ ์ฆ์ ํด๋น ํ๋ก๋ฏธ์ค์ ๊ฐ์ผ๋ก ํด๊ฒฐ๋๋ ๋จ์ผ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํจ.
- AggregateError: ์ฌ๋ฌ ์ค๋ฅ๋ฅผ ๋จ์ผ ์ค๋ฅ๋ก ๋ํํ์ฌ ๋ํ๋.
- ๋ ผ๋ฆฌ ํ ๋น ์ฐ์ฐ์(Logical Assignment Operators) (??=, &&=, ||=): ๋ ผ๋ฆฌ ์ฐ์ฐ๊ณผ ํ ๋น์ ๊ฒฐํฉํจ.
- ์ซ์ ๊ตฌ๋ถ ๊ธฐํธ(Numeric Separators): ๊ฐ๋ ์ฑ ํฅ์์ ์ํด ์ซ์ ๋ฆฌํฐ๋ด์ ๋ฐ์ค์ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํจ.
์์ : ES2021์์ ์ซ์ ๊ตฌ๋ถ ๊ธฐํธ ์ฌ์ฉํ๊ธฐ:
const largeNumber = 1_000_000_000; // 10์ต
console.log(largeNumber); // ์ถ๋ ฅ: 1000000000
ECMAScript 2022 (ES13)
- ์ต์์ Await(Top-Level Await): ๋ชจ๋์์ async ํจ์ ์ธ๋ถ์์ `await`๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํจ.
- ํด๋์ค ํ๋(Class Fields): ํด๋์ค ๋ณธ๋ฌธ์ ์ง์ ํด๋์ค ํ๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํจ.
- ์ ์ ํด๋์ค ํ๋ ๋ฐ ๋ฉ์๋(Static Class Fields and Methods): ํด๋์ค์ ์ ์ ํ๋์ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํจ.
- ๋น๊ณต๊ฐ ํด๋์ค ํ๋ ๋ฐ ๋ฉ์๋(Private Class Fields and Methods): ํด๋์ค ๋ด์์๋ง ์ ๊ทผํ ์ ์๋ ๋น๊ณต๊ฐ ํ๋์ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํจ.
- Error Cause: ์ ์ค๋ฅ๋ฅผ ์์ฑํ ๋ ์ค๋ฅ์ ๊ทผ๋ณธ ์์ธ์ ์ง์ ํ ์ ์๊ฒ ํจ.
- String, Array, TypedArray์ `.at()` ๋ฉ์๋: ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด/๋ฐฐ์ด์ ๋์์๋ถํฐ ์์์ ์ ๊ทผํ ์ ์๊ฒ ํจ.
์์ : ES2022์์ ๋น๊ณต๊ฐ ํด๋์ค ํ๋ ์ฌ์ฉํ๊ธฐ:
class Counter {
#count = 0;
increment() {
this.#count++;
}
getCount() {
return this.#count;
}
}
const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // ์ถ๋ ฅ: 1
// console.log(counter.#count); // ์ค๋ฅ: ๋น๊ณต๊ฐ ํ๋ '#count'๋ ๋๋ฌ์ธ๋ ํด๋์ค ๋ด์ ์ ์ธ๋์ด์ผ ํฉ๋๋ค
ECMAScript 2023 (ES14)
- ๋ฐฐ์ด ๋์์๋ถํฐ ์ฐพ๊ธฐ(Array find from Last): ๋ฐฐ์ด์ ๋์์๋ถํฐ ์์๋ฅผ ์ฐพ๋ `Array.prototype.findLast()` ๋ฐ `Array.prototype.findLastIndex()` ๋ฉ์๋.
- ํด์๋ฑ ๋ฌธ๋ฒ(Hashbang Grammar): ์ ๋์ค ๊ณ์ด ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๋ํ ์ ๋ฑ (`#!`) ๊ตฌ๋ฌธ์ ํ์คํํจ.
- WeakMap ํค๋ก์์ ์ฌ๋ณผ(Symbols as WeakMap Keys): WeakMap ๊ฐ์ฒด์์ ์ฌ๋ณผ์ ํค๋ก ์ฌ์ฉํ ์ ์๊ฒ ํจ.
- ๋ณต์ฌ๋ฅผ ํตํ ๋ฐฐ์ด ๋ณ๊ฒฝ(Change Array by copy): ๋ฐฐ์ด์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ ์๋ก์ด ๋นํ๊ดด์ ๋ฐฐ์ด ๋ฉ์๋: `toReversed()`, `toSorted()`, `toSpliced()`, `with()`.
์์ : ES2023์์ toReversed ์ฌ์ฉํ๊ธฐ:
const array = [1, 2, 3, 4, 5];
const reversedArray = array.toReversed();
console.log(array); // ์ถ๋ ฅ: [1, 2, 3, 4, 5] (์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝ๋์ง ์์)
console.log(reversedArray); // ์ถ๋ ฅ: [5, 4, 3, 2, 1]
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฏธ๋
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋งค๋ ์๋ก์ด ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ฌํญ์ด ์ถ๊ฐ๋๋ฉด์ ๋น ๋ฅธ ์๋๋ก ๊ณ์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ECMAScript ํ์คํ ํ๋ก์ธ์ค๋ ์ธ์ด๊ฐ ๋์์์ด ๋ณํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์ ์๊ตฌ์ ๋ถ์ํ๊ณ ์ ์ํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ต์ ECMAScript ์ฌ์์ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ํ๋์ ์ด๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ํ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ ๊ฐ๋ฅํ ์ธ์ฌ์ดํธ
- ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฉํ๊ธฐ: ํ๋ก์ ํธ์์ ES6+ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์์ํ์ธ์. Babel๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ์ด์ ํ๊ฒฝ์ผ๋ก ํธ๋์คํ์ผํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ต์ ์ ๋ณด ์ ์งํ๊ธฐ: ์ต์ ECMAScript ์ ์ ๋ฐ ์ฌ์์ ์ฃผ์ํ์ธ์. TC39 GitHub ์ ์ฅ์๋ ECMAScript ์ฌ์๊ณผ ๊ฐ์ ์๋ฃ๋ ๋งค์ฐ ๊ท์คํฉ๋๋ค.
- ๋ฆฐํฐ ๋ฐ ์ฝ๋ ํฌ๋งคํฐ ์ฌ์ฉํ๊ธฐ: ESLint ๋ฐ Prettier์ ๊ฐ์ ๋๊ตฌ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ๋ ๊นจ๋ํ๊ณ ์ผ๊ด๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํ ์คํธ ์์ฑํ๊ธฐ: ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ธฐ: ์จ๋ผ์ธ ํฌ๋ผ์ ์ฐธ์ฌํ๊ณ , ์ปจํผ๋ฐ์ค์ ์ฐธ์ํ๊ณ , ์คํ ์์ค ํ๋ก์ ํธ์ ๊ธฐ์ฌํ์ฌ ์ ์ธ๊ณ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๋ก๋ถํฐ ๋ฐฐ์ฐ๊ณ ์ง์์ ๊ณต์ ํ์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ญ์ฌ์ ๋ฐ์ ์ ์ดํดํจ์ผ๋ก์จ ์ธ์ด์ ๊ทธ ๊ธฐ๋ฅ์ ๋ํ ๋ ๊น์ ๊ฐ์ฌ๋ฅผ ์ป์ ์ ์์ผ๋ฉฐ, ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ์ํ ํ์ ์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ ์ ๋๋นํ ์ ์์ต๋๋ค.