ES(ECMA Script)
ECMAScript(ES5λ ES2015μ ESλ ECMAScriptμ μ€μλ§μ΄λ€.)λ Ecma μΈν°λ΄μ
λμμ μ μν ECMA-262 κΈ°μ κ·κ²©μ μ μλ νμ€ μ€ν¬λ¦½νΈ νλ‘κ·Έλλ° μΈμ΄μ
λλ€. κ°λ¨ν λ§νμλ©΄ νμ€νλ μ€ν¬λ¦½νΈ μΈμ΄μ
λλ€.
λμ€μ μΌλ‘ μ λͺ
ν ES6μ κ²½μ° ES5 μ΄ν λͺ
μΈμμ λ¬Έμ κ° λμλ λΆλΆλ€μ΄ ν΄κ²°λμκ³ , κΈ°μ‘΄ μ½λλ₯Ό λ κ°κ²°νκ² μμ±ν μ μλ μλ‘μ΄ λ¬Έλ²μ΄ μΆκ°λλ©΄μ λ κ°λ
μ± λ° μ μ§ λ³΄μμ±μ΄ ν₯μλμμ΅λλ€. κ·Έ λμ μΉμμ μ¬μ©νλ μλ°μ€ν¬λ¦½νΈ μ λͺ
λΌμ΄λΈλ¬λ¦¬λ€(lodash, React, Vue λ±)μ κ°λ° νκ²½λ ES6λ‘ λ°λμμ΅λλ€. λ°λΌμ μ΅μ μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬λ€λ ES6λ₯Ό μ¬μ©ν λ ν¨μ¬ νΈλ¦¬νκ² μ¬μ©ν μ μμ΅λλ€.
ES6μμ μλ‘ μΆκ°λ λ¬Έλ², κΈ°λ₯λ€
νΈλμ€νμΌλ¬λ₯Ό μ¬μ©ν ν¬λ‘μ€ λΈλΌμ°μ§ μ§μ
μ§κΈμ IE(Internet Explorer)κ° κ³΅μμ μΌλ‘ μ§μ μ’
λ£λλ©°, IT μ
κ³μμλ μ¬μ₯λμμ§λ§ μ μΈκ³ μΌλΆ μ¬λλ€μ μμ§ IEλ₯Ό μ¬μ©μ€μΌ κ²μ
λλ€.
μ΄μ Babel μ΄λΌλ νΈλμ€νμΌλ¬κ° λ±μ₯νλ©΄μ, κ° λΈλΌμ°μ κ°μ κ°κ·Ήμ ν΄μμμΌμ£Όμμ΅λλ€.
μλ₯Ό λ€μ΄ ES6 λ¬Έλ²μ κ²½μ° IEμμλ μ¬μ©ν μκ° μλλ°, μ΄λ Babelμ μ¬μ©ν΄ ES6 λ¬Έλ²μΌλ‘ μμ±λ JavaScript μ½λλ₯Ό IEκ° μ½μ μ μλ JavaScript μ½λλ‘ λ³νν΄μ£Όλ κ²μ
λλ€.
let, constμ λ±μ₯
ES6 μ΄μ λ¬Έλ²μμ λ³μλ₯Ό μ μΈνκΈ° μν΄μλ var ν€μλλ₯Ό μ ννλ μ νμ§λ°μ μμμ΅λλ€.
ν μΈμ΄λ€κ³Όλ λ¬λ¦¬ JavaScriptμμ varλ‘ μ μΈν λ³μλ ν¨μ λ¨μμ μ€μ½νλ₯Ό κ°κΈ° λλ¬Έμ ifλ¬Έμ΄λ forλ¬Έ λΈλ‘ λ΄μμ varλ₯Ό μ μΈν λ³μλ€λ λΈλ‘ μΈλΆμμ μ κ·Όν μ μμμ΅λλ€. κ²λ€κ° varλ₯Ό μ΄μ©νλ©΄ μ μΈ μ μ λ³μμ μ¬μ©μ΄ κ°λ₯ν νΈμ΄μ€ν
(hoisting)λ λ°μν©λλ€.
μ΄μ JavaScript κ°λ°μλ€μ λ³μλͺ
μΆ©λ, μλμΉ μμ κ° λ³κ²½μ νΌνκΈ° μν΄ μ¬λ¬ λ
Έλ ₯λ€μ ν΄μμ΅λλ€.
λΈλ‘ μ€μ½ν μ§μ
let, constλ‘ μ μΈν λ³μλ λΈλ‘ μ€μ½νλ₯Ό κ°μ§λλ€. λ°λ©΄μ varλ‘ μ μΈν λ³μλ ν¨μ μ€μ½νλ₯Ό κ°μ§λ―λ‘ μλνμ§ μμ κ³³μμλ λ³μ λ³κ²½μ΄ κ°λ₯νκ² λμ΄ μλ¬κ° λ°μν μ μμ΅λλ€. λ³μ μ μΈμ let, constλ₯Ό μ¬μ©νλ©΄ μ΄λ¬ν μ€μμ λ²κ·Έλ₯Ό μ€μΌ μ μμ΅λλ€.
ES5
function sayHello(name) {
if (!name) {
var errorMessage = '"name" parameter should be non empty String.';
alert(errorMessage);
}
console.log('Hello, ' + name + '!');
console.log(errorMessage); // '"name" parameter should be non empty String.'
}
ES6
function sayHello(name) {
if (!name) {
let errorMessage = '"name" parameter should be non empty String.';
alert(errorMessage);
}
console.log('Hello, ' + name + '!');
console.log(errorMessage); // ReferenceError
}
ES5μμλ if λΈλ‘μ μ€νμ΄ λλ μ΄νμλ errorMessageλ³μμ μ κ·Όμ΄ κ°λ₯ν©λλ€. κ·Έ μ΄μ λ varλ‘ μ μΈν λ³μλ νμ¬ μ€ν μ€μΈ ν¨μμ μ€μ½νμ μΆκ°λκΈ° λλ¬Έμ λλ€. μ¦, μ μ½λμ errorMessage λ³μλ sayHello()ν¨μ μ€μ½νμ μ‘΄μ¬νκΈ° λλ¬Έμ if λΈλ‘μ λΉ μ Έλμ¨ μ΄νμλ μ κ·Όμ΄ κ°λ₯ν κ²μ λλ€. νμ§λ§ let, const λ λ³μ μ μΈ ν€μλλ₯Ό μ¬μ©νμ¬ μ μΈν λ³μλ λΈλ‘ μ€μ½νμ μΆκ°λλ―λ‘ if λΈλ‘ μΈλΆμμ errorMessageμ μ κ·Όνλ κ²½μ° ReferenceErrorκ° λ°μν©λλ€.
ES5 λ³μ νΈμ΄μ€ν (Hoisting)μ λ¬Έμ μ κ°μ
var ν€μλλ₯Ό μ΄μ©ν΄μ λ³μλ₯Ό μ μΈνλ©΄ μ μΈ μ΄μ μ λ³μλ₯Ό μ¬μ©ν μ μλ νΈμ΄μ€ν νμμ΄ λ°μν©λλ€. νμ§λ§ νΈμ΄μ€ν μ΄ μλ let, constλ₯Ό μ¬μ©ν΄μ λ³μλ₯Ό μ μΈνλ©΄ μλ¬κ° λ°μν΄μ μλμΉ μμ μ€μλ₯Ό μ€μΌ μ μμ΅λλ€.
ES5
here = 'μ¬κΈ°μΌ~'; // λ³μ μ΄κΈ°νκ° λ¨Όμ λμμ§λ§ μλ¬κ° λ°μνμ§ μμ΅λλ€.
console.log(here); // 'μ¬κΈ°μΌ~'
var here; // λ³μ μ μΈμ μ΄λΆλΆμ μμ΅λλ€.
ES6
here = 'μ¬κΈ°μΌ~'; // ReferenceError - λ³μ hereκ° μ μΈλμ§ μμμ΅λλ€.
console.log(here);
let here;
λ¨Όμ ES5μ μ½λλ₯Ό 보κ²λλ©΄, here λ³μ μ μΈλ³΄λ€ λ¨Όμ κ°μ μ΄κΈ°ννκ³ μλλ°λ μλ¬κ° λ°μνμ§ μμ΅λλ€. μ μ΄λ° κ²°κ³Όκ° λμ€λ κ²μΌκΉμ?
μλ°μ€ν¬λ¦½νΈλ μ½λλ₯Ό μ€ννκΈ° μ μ κ°μ₯ λ¨Όμ var, functionμ μ°Ύμμ μ€μ½νμ μ΅μλ¨μ λ³μμ ν¨μλ₯Ό 미리 λ±λ‘νκΈ° λλ¬Έμ
λλ€. μ΄λ¬ν νΈμ΄μ€ν
μΌλ‘ μΈν΄ μ€μμ μν μ€λ₯λ₯Ό λͺ
ννκ² κ°μ§νκΈ°κ° μ΄λ ΅κ³ , μλμΉ μμ λμμ΄ λ°μνκΈ°λ ν©λλ€. λ°λ©΄μ ES6μ letμ μ¬μ©ν΄μ κ°μ μ½λλ₯Ό μμ±ν΄μ μ€νν΄λ³΄λ©΄ μλ¬κ° λ°μν©λλ€. here λ³μ μ΄κΈ°ν μ΄μ μ λ³μκ° μ μΈλμ§ μμκΈ° λλ¬Έμ μ°Έμ‘° μλ¬κ° λ°μν©λλ€.
letκ³Ό constμ μ¬μ©λ²κ³Ό μ°¨μ΄μ
λ³μ μ μΈ μμ λ³νμ§ μλ κ°μ constλ₯Ό, λ³ν μ μλ κ°μ letμ μ¬μ©ν©λλ€.
// κ° μμ
let foo = 'foo';
foo = 'foo2'; // OK - κ° μμ μ΄ κ°λ₯ν©λλ€.
const bar = 'bar';
bar = 'bar2'; // Type error - bar λ³μλ μμμ΄λ―λ‘ κ° μμ μ΄ λΆκ°λ₯ν©λλ€.
// μ μΈ, μ΄κΈ°ν
const baz2; // Type error - constλ‘ μ μΈν λ³μλ μ μΈκ³Ό λμμ μ΄κΈ°ν ν΄μΌν©λλ€.
let baz; // OK - letμΌλ‘ μ μΈν λ³μλ μ μΈκ³Ό λμμ μ΄κΈ°νν νμκ° μμ΅λλ€.
baz = 'baz';
μ μμ λ₯Ό 보면 letμ varμ μ μ¬νκ² λμνλ©°, κ° λ³κ²½μ΄ κ°λ₯ν κ²μ νμΈν μ μμ΅λλ€. νμ§λ§ constλ³μμ κ°μ ν λ² μ μνλ©΄ λ³κ²½ν μ μμ΅λλ€. λ°λΌμ λ³μ μ μΈκ³Ό λμμ μ΄κΈ°νν΄μΌ νκ³ , constλ‘ μ μΈλ λ³μμ κ°μ λ³κ²½νλ €κ³ νλ©΄ λ¬Έλ² μλ¬κ° λ°μν©λλ€.
νμ§λ§ constλ₯Ό μ¬μ©νλ€ ν΄λ νλ‘νΌν°κΉμ§ μμ ν μ μλ κ²μ μλλλ€.
// const λ³μμ νλ‘νΌν° κ° μμ
const foo2 = {
bar2: 'bar'
};
foo2.bar2 = 'bar2'; // OK - foo2μ νλ‘νΌν°λ μμ μ΄ κ°λ₯ν©λλ€.
κ°μ²΄λ λ°°μ΄ μ μΈμ constλ₯Ό μ¬μ©νμΌλ―λ‘ νλ‘νΌν°λ λ°°μ΄ μμκΉμ§ λ³κ²½ λΆκ°λ₯νλ€κ³ μκ°ν μ μκΈ° λλ¬Έμ μ°Έμ‘° κ°μ μ¬μ©ν λλ μ£Όμν΄μΌ ν©λλ€.
νμ΄ν ν¨μ(Arrow function)
ES6κ° λμ€λ©΄μ ν¨μμ λ체μ λ‘ νμ΄ν ν¨μκ° λμμ΅λλ€.
κΈ°λ³Έμ μΈ ννμμ μ΄λ μ΅λλ€.
// μΌλ° ν¨μ(function)
function func() {
// ...
}
// νμ΄ν ν¨μ(arrow function)
let func = () => {
// ...
}
ν¨μμ λ체μ λ‘μ¨ νμ΄ν ν¨μλ₯Ό μ¬μ©ν μ μλ건 λ§μ§λ§ μμ°ν λ€λ₯Έ λΆλΆμ΄ μ‘΄μ¬ν©λλ€. μ¦, μλ²½ν λ체μ κ° μλλλ€.
κ·ΈλΌ νμ΄ν ν¨μλ μ μ¬μ©νλκ±ΈκΉμ?
첫째, ννμ΄ λ³΄λ€ κ°κ²°ν©λλ€.
// μΌλ° ν¨μ
let add = function(a, b) {
return a + b;
};
// νμ΄ν ν¨μ
let add = (a, b) => a + b; // νμ΄ν ν¨μμ νΉμ§μΌλ‘ ννμμ΄ μ¬λ¬ μ€μ΄ μλκ²½μ° μ€κ΄νΈλ₯Ό μλ΅ν μ μμ΅λλ€.
let add2 = a => a * 2; // μΈμκ° νλμΌ κ²½μ° μκ΄νΈλ₯Ό μλ΅ν μλ μμ΅λλ€. μΈμκ° μλ κ²½μ°μλ μλ΅ν μ μμ΅λλ€.
// λ 짧μ νμ΄ν ν¨μ ννμ μ¬μ©
const sum = (a, b) => a + b;
console.log(sum(10, 100)); // 110
μ΄λ° 짧μ νμ΄ν ν¨μ ννμμ νΉν Array.prototype.map()μ΄λ, Array.prototype.filter()λ±μ λ겨주λ μ½λ°± ν¨μλ‘ μ¬μ©ν λ λμ± κ°κ²°νκ² ννν μ μμ΅λλ€.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// ν¨μ ννμ μ¬μ©
const numbersOverFive = numbers.filter(function(number) {
return number > 5;
});
console.log(numbersOverFive); // [6, 7, 8, 9, 10] ;
// νμ΄ν ν¨μλ‘ μ½λ°±ν¨μ 1μ€ νν
const numbersOverFive = numbers.filter(number => number > 5)
console.log(numbersOverFive); // [6, 7, 8, 9, 10] ;
μΈμλ‘ λ겨주λ ν¨μκ° ν¨μ ννμμ μ½λ°± ν¨μλ‘ λκ²¨μ€ λ λ³΄λ€ ν¨μ¬ μ§§κ³ κ°κ²°ν΄μ‘μ΅λλ€.
νμ§λ§ λ΄λΆμ μΌλ‘ functionμΌλ‘ μ μΈν ν¨μμ λͺ κ°μ§ μ°¨μ΄μ μ΄ μμ΅λλ€. νμ΄ν ν¨μλ μμ μ μ€ν 컨ν
μ€νΈμ this, arguments, superλ new.targetμ κ°μ§κ³ μμ§ μμ ν¨μ ννμμ
λλ€. μμ μ μ€ν 컨ν
μ€νΈμ λ³λμ thisκ° μ‘΄μ¬νμ§ μλ λμ , ν΄λΉ νμ΄ν ν¨μκ° μ μλ μ€ν 컨ν
μ€νΈμ thisλ₯Ό κ·Έλλ‘ λ°λ₯Έλ€λ νΉμ§μ΄ μμ΅λλ€. λ°λΌμ μμ±μ ν¨μλ‘λ μ¬μ©ν μ μμ΅λλ€.
λ©μλλ μμ±μλ‘ μ¬μ©λμ§ μλ κ°λ¨ν ν¨μλ₯Ό νννλ μ©λλ‘ μ¬μ©νλ©΄ λ©λλ€.
λμ§Έ, this λ°μΈλ©μ΄ functionκ³Ό λ€λ¦
λλ€.
ES5μμλ DOMμ μ΄λ²€νΈ νΈλ€λ¬μ ν¨μλ₯Ό μ€νν λ νΈλ€λ¬κ° μλν λλ‘ λμνμ§ μλ λ¬Έμ κ° μμ΅λλ€.
ES5
var buzzer = {
name: 'Buzzer1',
addClickEvent: function() {
this.element = document.getElementById(this.name);
var logNameAndRemoveButton = function() {
console.log(this.name + ' buzzing!');
}
this.element.addEventListener('click', logNameAndRemoveButton.bind(this)); // logNameAndRemoveButton νΈλ€λ¬ ν¨μ μ€νμ this κ°μ²΄κ° μλ¦¬λ¨ΌνΈ κ°μ²΄ μ΄λ―λ‘ "bind(this)"λ₯Ό μ΄μ©ν΄μ thisκ°μ²΄λ₯Ό μ§μ ν΄μ€λ€.
}
};
buzzer.addClickEvent();
ES6
const buzzer = {
name: 'Buzzer1',
addClickEvent() {
this.element = document.getElementById(this.name);
this.element.addEventListener('click', () => { // buzzerElementμ λ€μ this λ°μΈλλ₯Ό νμ§ μμλ μλν λλ‘ μ€νλλ€.
console.log(this.name + ' buzzing!');
document.body.removeChild(this.element);
});
}
};
buzzer.addClickEvent();
μ리먼νΈμ λ±λ‘λ μ΄λ²€νΈ νΈλ€λ¬ ν¨μκ° μ€νλ λλ non-strict λͺ¨λλ‘ λμν΄μ νΈλ€λ¬μμ this κ°μ²΄μ μ κ·Όνλ©΄ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ μλ¦¬λ¨ΌνΈ κ°μ²΄κ° νμ λ©λλ€. κ·Έλμ λ©μλλ₯Ό μ΄λ²€νΈ νΈλ€λ¬λ‘ μ¬μ©ν λλ λ΄λΆμμ thisλ₯Ό μ¬μ©νλμ§ μ΄ν΄λ³Έ ν handler.bind(this)μ²λΌ νμν 컨ν μ€νΈμ this κ°μ²΄λ₯Ό ν¨μμ λ°μΈλ ν΄μ λκ²¨μΌ νμ΅λλ€. νμ§λ§ νμ΄ν ν¨μλ₯Ό μ΄μ©νλ©΄ μλν λλ‘ λμν©λλ€. νμ΄ν ν¨μλ ν΄λΉ 컨ν μ€νΈμ this κ°μ²΄λ₯Ό λ°μΈλ ν ν¨μ ννμμ²λΌ λμν©λλ€.
ν΄λμ€(Class)
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄μ λλ€. ν΄λμ€ κΈ°λ°μ μΈμ΄μλ λ¬λ¦¬ μλ°μ€ν¬λ¦½νΈμμλ νλ‘ν νμ κ°μ²΄λ₯Ό μ¬μ¬μ©νλ©΄μ ν΄λμ€μ μ μ¬ν ννμ APIλ₯Ό λ§λ€μ΄μ μ¬μ©ν΄μμ΅λλ€. ES5 νκ²½μμ ν΄λμ€λ₯Ό ꡬννλ λ°©λ²μ λΌμ΄λΈλ¬λ¦¬λ§λ€ λ¬λμ΅λλ€. νμ§λ§ ES6λΆν° μλ°μ€ν¬λ¦½νΈμ ν΄λμ€ λ¬Έλ²μ΄ μΆκ°λμκ³ , λΌμ΄λΈλ¬λ¦¬λ€λ ν΄λμ€ λ¬Έλ²μ μ¬μ©νλ©΄μ ꡬνκ³Ό μ¬μ©λ²λ νκ°μ§λ‘ ν΅μΌλμμ΅λλ€.
λ¬Έλ²
class SomeClass {
static staticClassMethod() {
// μ μ λ©μλ
}
constructor() {
// μμ±μ ν¨μ
}
someMethod() {
// ν΄λμ€ λ§€μλ
}
}
const instance = new SomeClass();
instance.someMethod();
SomeClass.staticClassMethod();
ν΄λμ€ λ¬Έλ²μ class ν€μλ, ν΄λμ€ μ΄λ¦, μμ±μ ν¨μμΈ constructor(), λ©μλλ€, ν΄λμ€ μμμ μν extends ν€μλ, κ·Έλ¦¬κ³ μ μ λ©€λ²μΈ static ν€μλλ‘ κ΅¬μ±λμ΄ μμ΅λλ€. ν΄λμ€λ₯Ό μ μΈν λλ class ν€μλ λ€μ ν΄λμ€μ μ΄λ¦μ μ μ΄μ£Όκ³ , λ€λ₯Έ ν΄λμ€μ λ©€λ²λ₯Ό μμνκΈ° μν΄μλ extends ν€μλ λ€μ μμλ°μ ν΄λμ€λ₯Ό μμ±νλ©΄ λ©λλ€. ν΄λμ€λ ν¨μ μ¬μ©κ³Ό κ°μ΄ μ μΈμκ³Ό ννμ λ κ°μ§λ‘ μ¬μ©ν μ μμ΅λλ€.
ν΄λμ€ μ μΈμ
class SomeClass {
//class body
}
νλ‘ν νμ κΈ°λ° ν΄λμ€
ν΄λμ€ λ¬Έλ²μ΄ μλ ES5μμλ μμ±μ ν¨μμ κ·Έ ν¨μμ νλ‘ν νμ κ°μ²΄λ₯Ό νμ₯ν΄μ ν΄λμ€λ₯Ό νλ΄ λΌ μ μμ΅λλ€. μμ±μ ν¨μλ‘ μΈμ€ν΄μ€ κ°μ²΄μ μμ±μ μ€μ ν μ μκ³ , νλ‘ν νμ 체μΈμ μ΄μ©ν΄μ μΈμ€ν΄μ€ λ΄μ λ©μλλ₯Ό μμ±νμ§ μκ³ κ°μ λ©μλλ₯Ό λͺ¨λ κ°μ²΄μμ 곡μ ν μ μμ΅λλ€. νμ§λ§ μ΄λ° ꡬν λ°©λ²μ μ€μλ₯Ό μ λ°ν μλ μμΌλ©°, λ¬Έλ²μ΄ κ°κΈ° λλ¬Έμ μΌλ° ν¨μμΈμ§ ν΄λμ€ μμ±μ ν¨μμΈμ§ νΌλλμ΄ μ½λ κ°λ μ±μ΄ μ’μ§ μμ λ¬Έμ μ μ΄ μμ΅λλ€.
ES5
function Person(name) {
this.name = name;
}
Person.prototype.sayMyName = function() {
console.log('My name is "' + this.name + '"');
}
var fred = new Person('fred');
ES6
class Person {
constructor(name) {
this.name = name
}
sayMyName() {
console.log(`My name is "${this.name}"`);
}
}
const fred = new Person('fred');
ES6 μμ μ½λλ₯Ό 보면 μ΄λ μ½λκ° ν΄λμ€μ΄κ³ μμ±μ ν¨μμΈμ§ μ½κ² νμΈν μ μκ³ , λ©μλλ ν΄λμ€ λ΄λΆμ μΊ‘μνλμ΄ κ°λ μ±μ΄ μ’μμ§ κ²μ νμΈν μ μμ΅λλ€.
ν νλ¦Ώ 리ν°λ΄(Template literal)
ν νλ¦Ώ 리ν°λ΄ λ¬Έλ²μ λ°±ν±(`)μΌλ‘ κ°μΈμ§ λ¬Έμμ΄λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€. κΈ°μ‘΄μ λ¬Έμμ΄ μ‘°μ μμλ κ°κΈ° λΆλ¦¬λ λ¬Έμμ΄ λ¦¬ν°λ΄μ + μ°μ°μλ‘ μ°κ²°ν΄μ£Όμ΄μΌ νλ€λ©΄, ν νλ¦Ώ 리ν°λ΄μ λ΄λΆμ ννμμ λ°λ‘ μμ±νμ¬ λμ±λ κ°κ²°ν λ¬Έλ²μΌλ‘ ꡬνν μ μμ΅λλ€. λ¬Έμμ΄ μ¬μ΄μ ννμμ λ¦¬ν΄ κ°μ μΆκ°νλ €λ©΄ ννμμ΄ μ¬ μ리μ ${expression}λ₯Ό μμ±νλ©΄ λ©λλ€.
ES5
var brandName = 'TOAST';
var productName = 'UI';
console.log('Hello ' + brandName + ' ' + productName + '!'); // 'Hello TOAST UI!';
ES6
const brandName = 'TOAST';
const productName = 'UI';
console.log(`Hello ${brandName} ${productName}!`); // 'Hello TOAST UI!';
ES6 μ½λλ₯Ό 보κ²λλ©΄, brandNameκ³Ό productNameμ κ°κΈ° ννμμΌλ‘ μ¬μ©ν μλ, λμ ν©μΉ ν νλ¦Ώ λ¬Έμμ΄μ ννμμΌλ‘ μ€μ²©ν΄μ μ¬μ©ν μλ μμ΅λλ€. λν κ°ν λ¬Έμλ₯Ό μ§μ μ¬μ©νμ§ μμΌλ©΄ ν μ€ μ΄μμ λ¬Έμμ΄μ ννν μ μλ κΈ°μ‘΄ λ¬Έμμ΄ λ¦¬ν°λ΄κ³Όλ λ¬λ¦¬, ν νλ¦Ώ 리ν°λ΄μ λ μ€ μ΄μμ λ¬Έμμ΄μ ννν μ μμΌλ©°, μ΄ κ²½μ° κ°ν λ¬Έμκ° λ¬Έμμ΄ λ΄μ μλμΌλ‘ ν¬ν¨λ©λλ€.
ES5
var howToDripCoffee = '1. λ¬Όμ λμΈλ€.\n2. μ»€νΌ μλλ₯Ό κ°λ€.\n3. κ°λ¦° μλλ₯Ό μ»€νΌ νν° μμ λκ³ , νν°λ₯Ό μ»΅μ μ¬λ €λλλ€.\n4. λμΈλ¬Όμ μ²μ²ν νν° μλ‘ νλ €λ΄λ¦°λ€.';
ES6
const howToDripCoffee = `1. λ¬Όμ λμΈλ€.
2. μ»€νΌ μλλ₯Ό κ°λ€.
3. κ°λ¦° μλλ₯Ό μ»€νΌ νν° μμ λκ³ , νν°λ₯Ό μ»΅μ μ¬λ €λλλ€.
4. λμΈλ¬Όμ μ²μ²ν νν° μλ‘ νλ €λ΄λ¦°λ€.`;
ES5 λ²μ μ μμ λ³΄λ€ ν¨μ¬ λ μμ°μ€λ½κ² ννμ΄ λ κ²μ λ³Ό μ μμ΅λλ€.
λμ€νΈλμ²λ§(Destructuring)
JavaScript κ°λ°μ νλ€ λ³΄λ©΄ κ°μ²΄λ₯Ό ν¨μλΌλ¦¬ μ£Όκ³ λ°λ μν©μ΄ μμ£Ό λ§μ΅λλ€. μ λ¬λ°μ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ³μλ‘ μ μΈνλ €λ©΄ κ° νλ‘νΌν°λ₯Ό λ³λμ λ³μλ‘ ν λΉνκΈ° μν΄μ κ° νλ‘νΌν°λ§λ€ λ 립λ ν λΉλ¬Έμ μμ±ν΄μΌ νμμ΅λλ€. νμ§λ§ λμ€νΈλμ²λ§μ΄λΌκ³ λΆλ¦¬λ λ¬Έλ²μ΄ μΆκ°λμ΄ λ³μ μ μΈμ΄ ν¨μ¬ λ νΈν΄μ‘κ³ , μ½λκ° κ°κ²°ν΄μ‘μ΅λλ€.
λ³μ μ μΈ
λ¨Όμ λ³μμ νλ‘νΌν°λ₯Ό μ½κ² μ μΈνλ μμ μ λλ€. κ°μ²΄ λμ€νΈλμ²λ§μ λ³μλ‘ μ μΈνκ³ μ νλ κ°μ²΄μ νλ‘νΌν°λͺ μ {, }μμ λμ΄νλ©΄ κ° νλ‘νΌν°μ μ΄λ¦μΌλ‘ λ³μκ° μμ±λκ³ νλ‘νΌν°μ κ°μ΄ μλμΌλ‘ ν λΉλ©λλ€. λ°°μ΄ λμ€νΈλμ²λ§λ λΉμ·νλ° [, ] μμ λμ΄νλ λ³μμ μ΄λ¦μ λ§λ μΈλ±μ€μ λ°°μ΄ μμκ° λ³μμ κ°μΌλ‘ ν λΉλ©λλ€.
ES5
function printUserInformation(data) {
var name = data.name;
var age = data.age;
var hobby = data.hobbies;
var firstHobby = hobbies[0];
console.log('μ΄λ¦: ' + name);
console.log('λμ΄: ' + age);
console.log('κ°μ₯ μ’μνλ μ·¨λ―Έ: ' + firstHobby);
}
ES6
function printUserInformation(data) {
const {name, age, gender, hobbies} = data;
const [firstHobby] = hobbies;
console.log(`μ΄λ¦: ${name}`);
console.log(`λμ΄: ${age}`);
console.log(`κ°μ₯ μ’μνλ μ·¨λ―Έ: ${firstHobby}`);
}
λ°°μ΄ λμ€νΈλμ²λ§μΌλ‘ []μ κ·Όμ μ¬μ©μ νμ§ μκ³ λ λ³μλ₯Ό μ μΈνμ΅λλ€. κ·Έλ¦¬κ³ κ°μ²΄ λμ€νΈλμ²λ§μΌλ‘ λ°λ³΅λλ var * = data.*κ° μ¬λΌμ§κ³ ν μ€μ§λ¦¬ κ°κ²°ν μ½λλ‘ λ°λμμ΅λλ€.
νλΌλ―Έν° λ΄λΆ λ³μ μ μΈ
νλΌλ―Έν°λ‘ λ°μ κ°μ²΄μ νλ‘νΌν°λ₯Ό λ³μλ‘ μ μΈνμ¬ μ¬μ©ν μ μμ΅λλ€. μ΄λλ λ³λμ λ³μ μ μΈλ¬Έ μμ΄ νλΌλ―Έν°μ μμΉμ λμ€νΈλμ²λ§ μ½λλ₯Ό μμ±νλ©΄ λ©λλ€. μ μΈν λ³μμ μ΄λ¦μ κΈ°μ‘΄ κ°μ²΄μ μ μΈλ μ΄λ¦ λ§κ³ λ€λ₯Έ μ΄λ¦μΌλ‘λ μ μΈ κ°λ₯ν©λλ€.
ES5
function printError(error) {
var errorCode = error.errorCode;
var msg = error.errorMessage;
console.log('μλ¬μ½λ: ' + errorCode);
console.log('λ©μμ§:' + msg);
}
ES6
function printError({
errorCode,
errorMessage: msg
}) {
console.log(`μλ¬μ½λ: ${errorCode}`);
console.log(`λ©μμ§: ${msg}`);
}
λ¨Όμ ES5 μμ μ var * = data.*κ°μ λ°λ³΅μ μΈ μ½λ μμ± λΆλΆμ΄ κ°μ²΄ 리ν°λ΄μ²λΌ κ°κ²°νκ² λ°λμμ΅λλ€. κ·Έλ¦¬κ³ printError()ν¨μμ 맀κ°λ³μλ₯Ό λμ€νΈλμ²λ§ν΄μ λ³λμ λ³μ μ μΈ ν€μλλ₯Ό μ¬μ©νμ§ μμμ΅λλ€. λν 맀κ°λ³μμ νλ‘νΌν° μ΄λ¦ errorMessageλ₯Ό :λ‘ μ°κ²°ν΄μ λ³μλͺ μ μ½κ² λ°κΏ μ μμ΅λλ€.
ν¨μ 맀κ°λ³μμ λν΄νΈ κ° μ€μ
λν΄νΈκ° ν λΉ
ν¨μ 맀κ°λ³μμ λν΄νΈ κ° μ€μ μ μλ°μ€ν¬λ¦½νΈ λ¬Έλ²μμ μ§μνκ² λμμ΅λλ€. λν΄νΈ κ° μ€μ μ΄λ ν¨μμ μ€λμμ λ§κΈ° μν΄ νΉμ νμ νΉμ κ°μ κ°μ ΈμΌ ν 맀κ°λ³μκ° undefinedλ‘ μ λ¬λ κ²½μ°, undefinedλμ μ¬μ©ν μ μλ κ°μ ν λΉνλ κ²μ λλ€. ES5μμλ λν΄νΈ κ°μ μ€μ νκΈ° μν΄ ifλ¬ΈμΌλ‘ 맀κ°λ³μκ° undefinedμΈμ§ νμΈν λ€, ν΄λΉ 맀κ°λ³μμ κ°μ΄ undefinedλΌλ©΄ λ체ν κ°μ ν΄λΉ 맀κ°λ³μμ ν λΉνλ λ°©μμΌλ‘ μ²λ¦¬ν΄μμ΅λλ€. νμ§λ§ ES6μμλ λμ±λ κ°κ²°ν λ¬Έλ²μΌλ‘ ν΄κ²°ν μ μμ΅λλ€.
ES5
function sayName(name) {
if (!name) {
name = 'World';
}
console.log('Hello, ' + name + '!');
}
sayName(); // "Hello, World!"
ES6
const sayName = (name = 'World') => {
console.log(`Hello, ${name}!`);
}
sayName(); // "Hello, World!"
Rest νλΌλ―Έν°, Spread ννμ
ES6λ κ°μ²΄ 리ν°λ΄μ΄λ λ°°μ΄ λ¦¬ν°λ΄μ μ¬μ©μ±μ΄ λν μ’μμ‘μ΅λλ€. Rest νλΌλ―Έν°λ Spread νν μλ κ·Έ μ€μ νλμ λλ€.
Spread ννμ
λ°°μ΄μ΄λ κ°μ²΄ 리ν°λ΄ λ΄λΆμ ...ids μ κ°μ΄ μμ±νλ©΄ ν΄λΉ μμΉμ idsμ κ° λ°°μ΄ μμλ νλ‘νΌν°λ₯Ό νμ΄λ λλ€. Spread ννμμ ν¨μ νΈμΆμ΄λ λ°°μ΄ λ° κ°μ²΄ 리ν°λ΄ λ΄λΆμμ μ¬μ©ν μ μμ΅λλ€. λ°λΌμ λ°°μ΄ λ³΅μ¬λ λΆλ³(immutable)κ°μ²΄ μμ±λ μμ½κ² ν μ μμ΅λλ€. ... μ°μ°μμ ν¨κ» νμ΄λΌ κ°μ²΄λ₯Ό, κ·Έλ¦¬κ³ κ·Έ λ€μ μΆκ°/λ³κ²½λ λ΄μ©μ μμ±νλ©΄ λ©λλ€.
λ°°μ΄μ ν¨μ νλΌλ―Έν°λ€λ‘ λ³κ²½νκΈ°
λ°°μ΄μ ν¨μμ νλΌλ―Έν°λ€λ‘ λ³κ²½ν λ Spread ννμμΌλ‘ νΈλ¦¬νκ² μμ±ν μ μμ΅λλ€.
ES5
var friends = ['Jack', 'Jill', 'Tom'];
textToFriends(friends[0], friends[1], friends[2]);
ES6
const friends = ['Jack', 'Jill', 'Tom'];
textToFriends(...friends);
λ°°μ΄ λ° κ°μ²΄ νμ₯
μλ‘μ΄ λ°°μ΄μ λ€λ₯Έ λ°°μ΄μ μμλ₯Ό ν λ²μ μΆκ°νκ±°λ μλ‘μ΄ κ°μ²΄μ λ€λ₯Έ κ°μ²΄μ νλ‘νΌν°λ€μ μΆκ°ν λλ μ½λκ° ν¨μ¬ κΉλνκ² μ μ§λ©λλ€. μλ‘μ΄ κ°μ²΄λ₯Ό λ§λλ κ²½μ°, Spread ννμμ κ³μ° κ²°κ³Όλ‘ μΈν΄ μ€λ³΅λλ ν€κ° μκΈ΄λ€λ©΄ κ°μ₯ λμ€μ μμ±λ ννμμ΄ ν λΉλ©λλ€.
ES5
var friends = ['Jack', 'Jill', 'Tom'];
var anotherFriedns = [friends[0], friends[1], friends[2], 'Kim'];
var drinks = {
coffee: 'coffee',
juice: 'orange juice'
};
var newDrinks = {
coffee: drinks.coffee,
juice: 'tomato juice',
water: 'water'
};
ES6
const friends = ['Jack', 'Jill', 'Tom'];
const anotherFriedns = [...friends, 'Kim'];
const drinks = {
coffee: 'coffee',
juice: 'orange juice'
};
const newDrinks = {
...drinks,
juice: 'tomato juice',
water: 'water'
};
Rest νλΌλ―Έν°
νλΌλ―Έν°μ κ°μκ° κ°λ³μ μΈ ν¨μμμ νλΌλ―Έν°λ€μ μ¬μ©νλ €λ©΄ arguments κ°μ²΄λ₯Ό λ°°μ΄μ²λΌ μ κ·Όν΄μ μ¬μ©ν΄μΌ νμ΅λλ€. νμ§λ§ someFunction(target, ...params)ννλ‘ Rest νλΌλ―Έν° μ°μ°μλ₯Ό μμ±νλ©΄ target λ€μ μ€λ νλΌλ―Έν°λ€μ λͺ¨λ params λ°°μ΄λ‘ μ½κ² λ°κΏ μ μμ΅λλ€. λͺ¨λ μΈμλ₯Ό λ°κΏ μλ μκ³ λ€μκ³Ό κ°μ΄ μμ μ μΈν λ³μλ₯Ό μ μΈν 맀κ°λ³μλ€λ§ λ°°μ΄λ‘ λ³νν μλ μμ΅λλ€.
ES5
function textToFriends() {
var message = arguments[0];
var friends = [].slice.call(arguments, 1); // argunemts 2λ²μ§Έ μμλΆν° μΉκ΅¬λ€ λ°°μ΄λ‘ λ§λ€κΈ°.
console.log(message, friends);
}
ES6
function textToFriends(message, ...friends) {
console.log(message, friends);
}
ES5 μ½λμ²λΌ arguments κ°μ²΄λ₯Ό λ°°μ΄μ²λΌ μ¬μ©νμ§ μλλΌλ 맀κ°λ³μλ€μ λ³μμ λ°°μ΄λ‘ λΆλ¦¬ν΄μ μ¬μ©ν μ μμ΅λλ€.
μ λλ μ΄ν°(Generator)
ES6μ μ λλ μ΄ν°λ Generator μμ±μλ function* ν€μλλ‘ μ μΈν©λλ€. μ λλ μ΄ν°λ μ½λμ μ§ν νλ¦μμ μ μ λΉ μ Έλκ°λ€κ° λ€μ λμμ¬ μ μλ ν¨μμ λλ€.
λ¬Έλ²
function* gen() {
yield 1;
yield 2;
yield 3;
yield 4;
}
const g = gen();
μ λλ μ΄ν°λ₯Ό μ€ννλ©΄ yieldλ₯Ό λ§λ λκΉμ§ μ½λλ₯Ό μννκ³ λκΈ°νλ©° μ μ΄κ° λ€μ μ λλ μ΄ν°λ₯Ό μ€νν λ€μ λΌμΈμΌλ‘ λμ΄κ°λλ€. λ©μΆ°μλ μ λλ μ΄ν°λ₯Ό μ¬κ°νλ €λ©΄ μ λλ μ΄ν° κ°μ²΄μ g.next() λ©μλλ₯Ό μ€ννλ©΄ λ©λλ€. μ λλ μ΄ν°μ g.next()λ©μλλ₯Ό μννλ©΄ λ©μΆ°μλ μμΉμ yield μμλΆν° λ€μ yieldλ¬Έμ λ§λ λκΉμ§ μ½λλ₯Ό μνν©λλ€. κ·Έλ¦¬κ³ λ€μ μ μ΄κ° μ λλ μ΄ν°μμ λΉ μ Έλμ g.next()λ©μλλ₯Ό μ€νν λ€μ λΌμΈμΌλ‘ λμ΄κ°λλ€. g.next()μ λ¦¬ν΄ κ°μ κ°μ²΄μ΄λ©° μ λλ μ΄ν°κ° λͺ¨λ μνλμλμ§λ₯Ό μλ €μ£Όλ λΆλ¦¬μΈ κ° doneκ³Ό yieldλ¬Έμ μν κ²°κ΄κ°μΈ value νλ‘νΌν°λ‘ ꡬμ±λμ΄μμ΅λλ€.
function* gen() {
yield 1;
yield 2;
yield 3;
yield 4;
}
const g = gen();
console.log(g.next().value); // 1
console.log(g.next().value); // 2
console.log(g.next().value); // 3
console.log(g.next().value); // 4
console.log(g.next().value); // undefined
μ μμ μμ λ§μ§λ§ g.next().valueκ° undefinedμΈ μ΄μ λ λͺ¨λ yield κ΅¬λ¬Έμ΄ μνλμ΄ μ λλ μ΄ν°κ° μ’
λ£λμκΈ° λλ¬Έμ
λλ€.
Reference: MDN - Generator, function*
νλ‘λ―Έμ€(Promise)
νλ‘λ―Έμ€λ λΉλκΈ° μ²λ¦¬κ° μΆμνλ κ°μ²΄μ λλ€. μ¬μ©μκ° μμ±ν λΉλκΈ° μ²λ¦¬κ° μλ£λκ±°λ μ€ν¨λμλμ§ μλ €μ£Όκ³ λΉλκΈ° μ²λ¦¬ κ²°κ΄κ°μ λ°νν΄μ€λλ€. μ΄λ₯Ό ν΅ν΄ μ±κ³΅ μ μ€νν ν¨μ, μ€ν¨ μ μ€νν ν¨μλ₯Ό λ±λ‘ν΄μ νΈλ¦¬νκ² λΉλκΈ° μ²λ¦¬ μ½λ μμ±μ΄ κ°λ₯ν©λλ€. νλ‘λ―Έμ€λ₯Ό μ΄μ©νλ©΄ λΉλκΈ° μ²λ¦¬λ₯Ό μν μ½λ°± ν¨μλ€λ‘ μ¬λ¬ κ²Ή κ°μΈμ§ μ½λ°± μ§μ₯ μ½λλ₯Ό κ°κ²°νκ² μμ±ν μ μμ΅λλ€.
λ¬Έλ²
const p = new Promise((resolve, reject) => {
// λΉλκΈ°κ° μ²λ¦¬ νμν μ½λ
});
p.then(onFulfilled, onRejected).catch(errorCallback);
νλ‘λ―Έμ€ μμ±μμ μ λ¬λλ ν¨μ 맀κ°λ³μλ μ€νμ(executor)λΌκ³ νλ©°, μ€νμλ νλ‘λ―Έμ€ μμ±μκ° μμ±ν κ°μ²΄λ₯Ό 리ν΄νκΈ° μ μ μ€νλ©λλ€. μ€νμμ μΈμμΈ resolveμ rejectλ νλ‘λ―Έμ€μ ꡬνμ μν΄ μ€νμμ 맀κ°λ³μλ‘ μ λ¬λλ ν¨μμ΄λ©° νλ‘λ―Έμ€λ₯Ό ν΄κ²°νκ±°λ κ±°λΆνλ ν¨μμ΄μ λ. μ΄ λ κ°μ μΈμλ₯Ό μ΄μ©ν΄μ μ€νμ λ΄λΆμ λΉλκΈ° μ²λ¦¬μ κ²°κ³Όλ₯Ό νλ¨νκ³ , resolveλ rejectν¨μμ νμ μ²λ¦¬λ₯Ό μν΄ μ λ¬ν κ°μ μΈμλ‘ λ겨주면μ μ€ννμ¬ νλ‘λ―Έμ€κ° μλ£λλλ‘ νλ©΄ λ©λλ€. λ§μ½ μ€νμ λ΄λΆμμ resolveκ° μ€νλλ©΄ then μ 첫 λ²μ§Έ μΈμμΈ onFulfilledκ° λ°κ² λκ³ , λ°λλ‘ rejectκ° μ€νλλ©΄ λ λ²μ§Έ μΈμ onRejected λ°κ² λ©λλ€.
const checkNumIsExceedTen = new Promise((resolve, reject) => {
setTimeout(() => {
const num = getRandomNumberFromServer();
if(Number.isNaN(num)) {
throw new Error('Value that from server must be a "number" type.');
}
if (num > 10) {
resolve(num);
} else {
reject(num);
}
});
});
checkNumIsExceedTen
.then((num) => {
console.log(`'num' is ${num}. It is exceed 10.`);
}, (num) => {
console.log(`'num' is ${num}. It is not exceed 10.`);
})
.catch((error) => {
console.log(error.message);
});
μμ μ μ½λλ μλ²μμ κ°μ Έμ¨ numλ³μμ κ°μ΄ 10μ μ΄κ³Όνλμ§ νμΈνλ νλ‘λ―Έμ€ κ°μ²΄λ₯Ό μμ±νμ΅λλ€. κ·Έλ¦¬κ³ νλ‘λ―Έμ€κ° μ’ λ£λ ν μ€νν μ½λ°±λ€μ thenμΌλ‘ λ±λ‘νκ³ , μλ¬κ° λ°μνμ λ μλ¬λ₯Ό μΆλ ₯ν μ½λ°±λ catchλ₯Ό μ΄μ©ν΄μ λ±λ‘νμ΅λλ€.
μ½λ°± νΌλΌλ―Έλ κ°μ νκΈ°
κΈ°μ‘΄ ES5μμλ λΉλκΈ° μ²λ¦¬λ₯Ό νκΈ° μν΄μ λ³΄ν΅ μ½λ°± μ§μ₯, μ½λ°± νΌλΌλ―ΈλλΌκ³ νλ ννμ μ½λλ₯Ό μμ±νμ΅λλ€. μ΄λ€ λΉλκΈ° μ²λ¦¬μ κ²°κ³Όλ₯Ό μ λ¬λ°λ ν¨μλ₯Ό μ½λ°± ν¨μμ ννλ‘ κ³μ μμ±νκ³ μ΅μ’ κ²°κ³Όλ₯Ό κ°μ₯ μμͺ½μ μ½λ°± ν¨μμμ μ λ¬λ°μ μ€νμ΄ μ’ λ£λ©λλ€.
ES5
doSomething(function(result) {
doSomethingElse(result, function(newResult) {
doThirdThing(newResult, function(finalResult) {
console.log('Got the final result: ' + finalResult);
}, failureCallback);
}, failureCallback);
}, failureCallback);
ES6
doSomethingPromise
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => console.log('Got the final result: ' + finalResult))
.catch(failureCallback);
κ²Ήκ²Ήμ΄ μμ¬μλ μ½λ°±ν¨μ μ½λκ° ν¨μ¬ κ°λ¨ν΄μ‘μ΅λλ€. λ μ½λμ μ°¨μ΄λ₯Ό 보μ. μ½λ°± νΌλΌλ―Έλ μ½λμμλ ν¨μλ§λ€ μλ¬ μ²λ¦¬ μ½λ°±μ μ λ¬νμλ€λ©΄, νλ‘λ―Έμ€ μ½λμμλ ν λ²μ catchλ‘ ν΄κ²°ν©λλ€. λν κ²Ήκ²Ήμ΄ μμ¬κ°λ μ½λ°± ν¨μμ λΉκ΅νλ©΄ νλ‘λ―Έμ€λ λΉλκΈ° μ²λ¦¬λ€μ μμλλ‘ μ°κ²°ν΄μ μ½κΈ° μ½κ² μμ±ν μ μμ΅λλ€.
μ¬λ¬ κ°μ νλ‘λ―Έμ€ μ²λ¦¬νκΈ°
νλ‘λ―Έμ€λ λ¨μΌ λΉλκΈ° μμ²μ λ€λ£¨κΈ° μν κ°μ²΄μ λλ€. μ¬λ¬ κ°μ λΉλκΈ° μμ²μ μ²λ¦¬νκΈ° μν΄μλ νλ‘λ―Έμ€ κ°μ²΄λ₯Ό μ¬λ¬ κ° μ¬μ©ν΄μΌ ν©λλ€. μ΄λ Promise.all, Promise.race μ¬μ©νλ©΄ κ°μ²΄λ€μ΄ μλ£λλ μνμ λ°λΌ μ²λ¦¬ν μ μμ΅λλ€. ν¨μμ νλΌλ―Έν°λ‘λ λ°°μ΄κ°μ΄ μν κ°λ₯ν(iterable) κ°μ²΄λ₯Ό λ°μ΅λλ€. Promise.allμ λͺ¨λ νλ‘λ―Έμ€κ° resolveλ λκΉμ§ κΈ°λ€λ¦¬κ³ , Promise.raceλ κ°μ₯ λ¨Όμ resolveλλ νλ‘λ―Έμ€μ μ΄ν κ°μ μ¬μ©ν©λλ€. κ° νλ‘λ―Έμ€λ μμ°¨ μ²λ¦¬λλ κ²μ΄ μλλΌ λ³λ ¬μ μΌλ‘ μνλ©λλ€.
var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 100);
});
Promise.all([p1, p2, p3]).then(values => {
console.log(values); // [3, 1337, "foo"]
});
Promise.race([p1, p2, p3]).then(value => {
console.log(value); // 3
});
μν κ°λ₯ν κ°μ²΄μ μΈμκ° λͺ¨λ resolveλλ©΄ resolveλ νλ‘λ―Έμ€λ₯Ό λ°ννκ³ , νλλΌλ rejectλλ©΄ 첫λ²μ§Έλ‘ rejectλ μ΄μ λ₯Ό μ¬μ©ν΄μ rejectνλ‘λ―Έμ€λ₯Ό λ°νν©λλ€.
async/await
async ν¨μλ₯Ό μ΄μ©ν΄μ λΉλκΈ° μ²λ¦¬λ₯Ό λμ±λ κ°κ²°νκ² μμ±ν μ μμ΅λλ€. async ν¨μλ μ¬λ¬ κ°μ νλ‘λ―Έμ€λ₯Ό μ¬μ©νλ μ½λλ₯Ό λκΈ° ν¨μ μ€νκ³Ό λΉμ·ν λͺ¨μ΅μΌλ‘ μ¬μ©ν μ μκ² ν΄μ€λλ€. async ν€μλκ° μμ λΆμ ν¨μμ μΈλ¬Έμ ν¨μ λ³Έλ¬Έμλ await μμ΄ ν¬ν¨λ μ μλ€. μ΄ await μμ async ν¨μ μ€νμ μΌμ μ€μ§νκ³ ννμμ μ λ¬λ νλ‘λ―Έμ€μ ν΄κ²°μ κΈ°λ€λ¦° λ€μ async ν¨μμ μ€νμ μ¬κ°νκ³ , ν¨μμ μ€νμ΄ λͺ¨λ μλ£λ λ€μ κ°μ λ°νν©λλ€. λ¬Όλ‘ await μμ async ν¨μ λ΄μμλ§ μ ν¨ν©λλ€. μΈλΆμμ μ¬μ©νλ€λ©΄ λ¬Έλ² μλ¬κ° λ°μν©λλ€. async ν¨μμ λ°ν κ°μ νλ‘λ―Έμ€μ΄λ©°, returnValueλ₯Ό λ°ννλ©΄ μ묡μ μΌλ‘ Promise.resolve(returnValue) ννλ‘ κ°μΈμ Έμ λ°νλ©λλ€. νλ‘λ―Έμ€μ catchλ‘ μ²λ¦¬νλ μλ¬λ μΌλ° ν¨μμμμ try/catchλ¬ΈμΌλ‘ μμ±νλ©΄ λ©λλ€. μλ¬κ° λ°μνλ©΄ νλ‘λ―Έμ€μ rejectμ μ λ¬λλ κ°μ΄ μλ¬ κ°μ²΄λ‘ λμ΄μ΅λλ€.
νλ‘λ―Έμ€
function fetchMemberNames(groupId) {
return getMemberGroup(groupId)
.then(memberGroup => getMembers(memberGroup))
.then(members => members.map(({name}) => name))
.catch(err => {
showNotify(err.message);
});
}
fetchMemberNames('gid-11')
.then(names => {
if (names) {
addMembers(names);
}
});
async ν¨μ
async function fetchMemberNames(groupId) {
try {
const memberGroup = await getMemberGroup(groupId);
const members = await getMembers(memberGroup);
return members.map(({name}) => name);
} catch (err) {
showNotify(err.message);
}
}
fetchMemberNames('gid-11')
.then(members => {
if (members) {
addMembers(members);
}
});
λͺ¨λ(ES Module)
μλ°μ€ν¬λ¦½νΈλ λͺ¨λ κ°λ°μ΄ κ°λ₯ν©λλ€. ES5μμλ Webpack, Rollup, Parcel κ°μ λ²λ€λ¬λ Babel κ°μ νΈλμ€νμΌλ¬λ₯Ό μ¬μ©ν΄μ λΈλΌμ°μ μμ μ€νν μ μλλ‘ λ°κΏμ£Όμ΄μΌ νμ΅λλ€. ES6μμλ λͺ¨λμ μ΄μ©ν΄μ κ°λ°ν μ μλ κ°κ²°ν λ¬Έλ²μ μ§μν©λλ€. λͺ¨λ λͺ μΈλ₯Ό ꡬνν λͺ¨λ λΈλΌμ°μ λ€λΆν°λ import, exportλ¬Έμ μ¬μ©ν΄μ λͺ¨λμ κ°μ Έμ¬ μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈμ λͺ¨λμ .js νμ₯μλ‘ λ§λ€μ΄μ§ νμΌμ λ»νν©λλ€. νμΌ λ΄λΆμμ λ³λμ module λ±μ ν€μλλ‘ μ μΈν νμκ° μμΌλ©°, μλ°μ€ν¬λ¦½νΈ λͺ¨λμ μ½λλ κΈ°λ³Έμ μΌλ‘ strict λͺ¨λλ‘ λμν©λλ€. λͺ¨λ μμμλ import, export ν€μλλ₯Ό ν΅ν΄ λ€λ₯Έ λͺ¨λκ³Ό κ°μ²΄λ₯Ό μ£Όκ³ λ°μ μ μμ΅λλ€. ν κ°μ λͺ¨λ μμμ μ μΈλ λ³μλ ν¨μ λ±μ κ·Έ λͺ¨λ λ΄λΆ μ€μ½νλ₯Ό κ°μ§λλ€. κ·Έλ λ€λ©΄ λ΄κ° μμ±ν λͺ¨λμ λ³μλ₯Ό λ€λ₯Έ λͺ¨λμμ μ¬μ©νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉ? λ°λ‘ exportλ₯Ό ν΅ν΄ λͺ¨λ μΈλΆμμ μ κ·Όν μ μλλ‘ λ§λ€μ΄μ£Όλ©΄ λ©λλ€. exportλ¬Έμ ν΅ν΄ ν¨μ, ν΄λμ€, λ³μ λ€μ λͺ¨λ μΈλΆλ‘ λ΄λ³΄λΌ μ μμ΅λλ€. κ·Έλ λ€λ©΄ μ΄μ exportλ¬Έμ μ¬μ©νλ λ²μ μ΄ν΄λ³Ό κ²μ λλ€. λͺ¨λ μΈλΆλ‘ λ΄λ³΄λ΄λ λ°©λ²μ Named export, Default export λ κ°μ§κ° μμ΅λλ€.
Named export
students.js
export const student = 'Park';
export const student2 = 'Ted';
const student3 = 'Abby';
export {student3};
Named exportλ ν νμΌμμ μ¬λ¬ λ² ν μ μμ΅λλ€. Named exportλ₯Ό ν΅ν΄ λ΄λ³΄λΈ κ² λ€μ μΆν λ€λ₯Έ λͺ¨λμμ λ΄λ³΄λΌ λμ κ°μ μ΄λ¦μΌλ‘ import ν΄μΌν©λλ€.
Default export
studentJack.js
export default 'Jack'
λ°λ©΄μ Default exportλ ν μ€ν¬λ¦½νΈ νμΌλΉ ν κ°λ§ μ¬μ©ν μ μμ΅λλ€. κ·Έλ¦¬κ³ export defaultμ λ€μλ ννμλ§ νμ©λλ―λ‘ var, let, constλ±μ ν€μλλ μ¬μ©νμ§ λͺ»ν©λλ€.
μ΄λ κ² λ΄λ³΄λΈ κ°μ²΄λ€μ λͺ¨λλ€μμ μ κ·Όν μ μμ΅λλ€. κ·Έλ λ€λ©΄ μ§κΈλΆν°λ λͺ¨λμμ export ν κ°μ²΄λ€μ κ°μ Έμ€λ importλ¬Έμ μ΄ν΄λ΄ μλ€.
Named export λ κ°μ²΄ μ¬μ©νκΈ°
import {student, student2, student3} from 'students.js';
console.log(student); // "Park";
console.log(student2); // "Ted";
console.log(student3); // "Abby";
μμ²λΌ Named export λ κ°μ²΄λ₯Ό κ°μ Έμ¬ λλ κ° κ°μ²΄μ μ΄λ¦λ€μ {, }λ‘ κ°μΈλ©΄ λ©λλ€. λ§μ½ κ°μ Έμ¬ κ°μ²΄μ μ΄λ¦μ λ°κΏμ κ°μ Έμ€κ³ μΆμ λλ μ΄λ»κ² ν κΉμ? λ³λμ λ³μλ₯Ό μ μΈνμ§ μλλΌλ λ°κΎΈκ³ μΆμ κ°μ²΄ μ΄λ¦ λ€μ as [[λ°κΏ λ³μλͺ ]] ννλ‘ μμ±ν΄μ μ½κ² λ°κΏ μ μμ΅λλ€.
import {student as park, student2 as ted, student3 as abby} from 'students.js';
const student = 'Kim';
console.log(student); // "Kim"
console.log(park); // "Park"
console.log(ted); // "Ted"
console.log(abby); // "Abby"
μ΄ λ°©λ²μ μ΄λ―Έ μμ±ν μ½λμ μ§μ λ³μλͺ κ³Ό κ°μ μ΄λ¦μ κ°μ²΄λ₯Ό κ°μ Έμ¬λ μ μ©νκ² μ¬μ©ν μ μμ΅λλ€.
κ·ΈλΌ, μ΄λ κ² Named export λ κ°μ²΄κ° λ§μ λ λͺ¨λ κ°μ Έμ€λ €λ©΄ λ°λμ μ μμ μ²λΌ κ° κ°μ²΄λ₯Ό νλμ© μ΄κ±°ν΄μΌ ν κΉμ? μλλλ€. *μ μ΄μ©ν΄μ νκΊΌλ²μ κ°μ Έμ€λ λ°©λ²μ΄ μμ΅λλ€.
import * as students from 'students.js';
console.log(students.student); // "Park"
console.log(students.student2); // "Ted"
console.log(students.student3); // "Abby"
μ΄λ²μλ * λ¬Έλ²μΌλ‘ students.js νμΌ λ΄λΆμ λͺ¨λ Named export κ°μ²΄λ₯Ό λνλ΄μ£Όκ³ , λ°λ‘ λ€μ as [[λ³μλͺ ]] ννλ‘ ν΄λΉ κ°μ²΄λ€μ κ°μ§κ³ μμ λ³μλͺ μ μ ν©λλ€.
Default export λ κ°μ²΄ μ¬μ©νκΈ°
import jack from 'studentJack';
console.log(jack); // "Jack"
μ¬μ©λ²μ Named exportμ λΉμ·νμ§λ§ {, }λ‘ κ°μΈμ§ μκ³ λ³μλͺ μ importλ¬Έ λ€μ μμ±ν©λλ€. λ³μ μ΄λ¦μ λ°κΏμ κ°μ Έμ¬ μ μλλ°, Default export λ κ°μ²΄λ νμΌλ§λ€ μ μΌνλ―λ‘ as ν€μλλ₯Ό μ¬μ©νμ§ μλλΌλ μ΄λ¦μ λ°κΏμ λΆλ¬μ¬ μ μμ΅λλ€. import ν€μλ λ€μ μ¬μ©ν μ΄λ¦μ΄ κ°μ²΄μ λ³μλͺ μ΄ λ©λλ€.
λ λ°©λ² λ€ μ¬μ©νκΈ°
μμ μκ°ν κ°μ²΄λ₯Ό κ°μ Έμ€λ λ°©λ² Named exportμ Default exportλ exportμ λ§μ°¬κ°μ§λ‘ κ°μ Έμ¬ λλ ν λ²μ λ κ°μ§λ₯Ό λͺ¨λ μ¬μ©ν μ μμ΅λλ€. ν students.js νμΌμμλ κ°μ²΄λ₯Ό λ΄λ³΄λ΄κ³ school.js νμΌμμλ κ·Έ κ°μ²΄λ€μ κ°μ Έμ λ΄ μλ€.
students.js
const jack = 'Jack';
export default jack
const student = 'Park';
const student2 = 'Ted';
const student3 = 'Abby';
export {student, student2, student3};
school.js
import jack, {student, student2, student3} from 'students';
console.log(jack); // "Jack"
console.log(student); // "Park"
console.log(student2);// "Ted"
console.log(student3);// "Abby"
Reference
'π₯ Front-End > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] TDZ (0) | 2022.07.21 |
---|---|
[JS] μ€ν 컨ν μ€νΈ, νΈμ΄μ€ν , ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμ (0) | 2022.07.21 |
[JS] ν΄λ‘μ (Closure) (0) | 2022.07.21 |
[JS] μ€μ½ν(Scope) (0) | 2022.07.21 |
[JS] JavaScript κ°μ²΄μ λΆλ³μ± (0) | 2022.07.20 |