π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬ 26μ₯. ES6 ν¨μμ μΆκ° κΈ°λ₯
01. ν¨μμ ꡬλΆ
πΉ ES6 μ΄μ μ λͺ¨λ ν¨μλ μΌλ° ν¨μ λ° μμ±μ ν¨μλ‘μ νΈμΆμ΄ κ°λ₯νλ€.
// foo ν¨μλ₯Ό μΌλ°μ μΈ ν¨μ, μμ±μ ν¨μ, λ©μλλ‘ νΈμΆ κ°λ₯
var foo = function () {
return 1;
};
// μΌλ°μ μΈ ν¨μλ‘μ νΈμΆ
foo(); // -> 1
// μμ±μ ν¨μλ‘μ νΈμΆ
new foo(); // -> foo {}
// λ©μλλ‘μ νΈμΆ
var obj = { foo: foo };
obj.foo(); // -> 1
β‘οΈ μ¦, callable (νΈμΆν μ μλ ν¨μ κ°μ²΄)μ΄λ©΄μ λμμ constructor (μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ ν¨μ κ°μ²΄) μ΄λ€.
β‘οΈ λ©μλ(κ°μ²΄μ λ°μΈλ©λ ν¨μ)λ callable μ΄λ©° λμμ constructor μ΄λ€.
β οΈ κ°μ²΄μ λ°μΈλ©λ ν¨μλ₯Ό μμ±μ ν¨μλ‘ νΈμΆν κ²½μ°,
μμ±μ ν¨μλ‘ νΈμΆνμ§ μμλ νλ‘ν νμ κ°μ²΄λ₯Ό μμ±νκΈ° λλ¬Έμ μ€μλ₯Ό μ λ°ν μλ μκ³ μ±λ₯λ©΄μμλ μ’μ§ μλ€.
μ΄λ¬ν λ¬Έμ λ€μ ν΄κ²°νκΈ° μν΄ ES6μμλ ν¨μλ₯Ό μ¬μ© λͺ©μ μ λ°λΌ μΈ κ°μ§ μ’ λ₯λ‘ κ΅¬λΆνλ€.
ES6 ν¨μμ κ΅¬λΆ | constructor | prototype | super | arguments |
μΌλ° ν¨μ(Normal) | O | O | X | O |
λ©μλ(Method) | X | X | O | O |
νμ΄ν ν¨μ(Arrow) | X | X | X | X |
02. λ©μλ
π‘ ES6 λ©μλλ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ§μ μλ―Ένλ€.
const obj = {
x: 1,
// fooλ λ©μλμ΄λ€.
foo() { return this.x; },
// barμ λ°μΈλ©λ ν¨μλ λ©μλκ° μλ μΌλ° ν¨μμ΄λ€.
bar: function() { return this.x; }
};
console.log(obj.foo()); // 1
console.log(obj.bar()); // 1
π‘ ES6 λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ non-constructorμ΄λ€.
// fooλ λ©μλμ΄λ―λ‘, μμ±μ ν¨μλ‘μ νΈμΆ ν μ μλ€.
new obj.foo(); // -> TypeError: obj.foo is not a constructor
new obj.bar(); // -> bar {}
π‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ―λ‘, prototype νλ‘νΌν°κ° μκ³ , νλ‘ν νμ λ μμ±νμ§ μλλ€.
// obj.fooλ constructorκ° μλ ES6 λ©μλμ΄λ―λ‘ prototype νλ‘νΌν°κ° μλ€.
obj.foo.hasOwnProperty('prototype'); // -> false
// obj.barλ constructorμΈ μΌλ° ν¨μμ΄λ―λ‘ prototype νλ‘νΌν°κ° μλ€.
obj.bar.hasOwnProperty('prototype'); // -> true
πΉ ES6 λ©μλλ μμ μ λ°μΈλ©ν κ°μ²΄λ₯Ό κ°λ¦¬ν€λ [[HomeObject]] λ΄λΆ μ¬λ‘―μ κ°λλ€.
πΉ super μ°Έμ‘°λ μ΄ λ΄λΆ μ¬λ‘―μ μ¬μ©νμ¬ μνΌ ν΄λμ€μ λ©μλλ₯Ό μ°Έμ‘°νλ€.
β‘οΈ λ°λΌμ μ΄ λ΄λΆ μ¬λ‘―μ κ°λ ES6 λ©μλλ super ν€μλλ₯Ό μ¬μ©ν μ μλ€.
03. νμ΄ν ν¨μ
π‘ function ν€μλ λμ νμ΄νλ₯Ό μ¬μ©νκ³ κΈ°μ‘΄ ν¨μλ³΄λ€ κ°λ¨νκ² λμνλ ν¨μ
πΉ μ½λ°± ν¨μ λ΄λΆμμ thisκ° μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ¬Έμ μ λμμΌλ‘ μ μ©νλ€.
1) νμ΄ν ν¨μμ μ μ
1. ν¨μ μ μ
ν¨μ ννμμΌλ‘λ§ μ μν΄μΌ νλ€.
const multiply = (x, y) => x * y;
multiply(2, 3); // -> 6
2. λ§€κ°λ³μ μ μΈ
// λ§€κ°λ³μ μ¬λ¬ κ°μΈ κ²½μ°, μκ΄νΈ () μμ λ§€κ°λ³μ μ μΈ
const arrow = (x, y) => { ... };
// λ§€κ°λ³μ ν κ°μΈ κ²½μ°, μκ΄νΈ () μλ΅ κ°λ₯
const arrow = x => { ... };
// λ§€κ°λ³μ μλ κ²½μ°, μκ΄νΈ () μλ΅ λΆκ°
const arrow = () => { ... };
3. ν¨μ λͺΈμ²΄ μ μ
πΉ ν¨μ λͺΈμ²΄κ° νλμ λ¬ΈμΌλ‘ ꡬμ±λλ€λ©΄ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ { } λ₯Ό μλ΅ν μ μλ€.
// concise body
const power = x => x ** 2;
power(2); // -> 4
// μ ννμ λ€μκ³Ό λμΌνλ€.
// block body
const power = x => { return x ** 2; };
β‘οΈ ννμμ΄ μλλ° μ€κ΄νΈλ₯Ό μλ΅νλ©΄ μλ¬ λ°μ
πΉ κ°μ²΄ 리ν°λ΄ λ°ν μ μκ΄νΈ( ) λ‘ κ°μΈμ€μΌ νλ€.
const create = (id, content) => ({ id, content });
create(1, 'JavaScript'); // -> {id: 1, content: "JavaScript"}
// μ ννμ λ€μκ³Ό λμΌνλ€.
const create = (id, content) => { return { id, content }; };
// κ°μ²΄ 리ν°λ΄μ μκ΄νΈ()λ‘ κ°μΈμ§ μμΌλ©΄, κ°μ²΄ 리ν°λ΄μ μ€κ΄νΈ{}λ₯Ό ν¨μ λͺΈμ²΄λ₯Ό κ°μΈλ μ€κ΄νΈ{}λ‘ μλͺ» ν΄μνλ€.
// { id, content }λ₯Ό ν¨μ λͺΈμ²΄ λ΄μ μΌν μ°μ°μλ¬ΈμΌλ‘ ν΄μνλ€.
const create = (id, content) => { id, content };
create(1, 'JavaScript'); // -> undefined
πΉ μ¦μ μ€ν ν¨μλ‘ μ¬μ© κ°λ₯
const person = (name => ({
sayHi() { return `Hi? My name is ${name}.`; }
}))('Lee');
console.log(person.sayHi()); // Hi? My name is Lee.
πΉ κ³ μ°¨ ν¨μ (Array.prototype.map λ±)μ μΈμλ‘ μ λ¬ κ°λ₯
β‘οΈ μλνλ©΄, νμ΄ν ν¨μλ μΌκΈ κ°μ²΄μ΄κΈ° λλ¬Έ.
2) νμ΄ν ν¨μμ μΌλ° ν¨μμ μ°¨μ΄
1. νμ΄ν ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ non-constructorλ€.
const Foo = () => {};
// νμ΄ν ν¨μλ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ€.
new Foo(); // TypeError: Foo is not a constructor
// νμ΄ν ν¨μλ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μμΌλ―λ‘, prototype νλ‘νΌν°κ° μκ³ , νλ‘ν¬νμ
λ μμ±νμ§ μλλ€.
const Foo = () => {};
// νμ΄ν ν¨μλ prototype νλ‘νΌν°κ° μλ€.
Foo.hasOwnProperty('prototype'); // -> false
2. μ€λ³΅λ λ§€κ°λ³μ μ΄λ¦μ μ μΈν μ μλ€.
const arrow = (a, a) => a + a;
// SyntaxError: Duplicate parameter name not allowed in this context
3. νμ΄ν ν¨μλ ν¨μ μ체μ this, arguments, super, new.target λ°μΈλ©μ κ°μ§ μλλ€.
β‘οΈ νμ΄ν ν¨μ λ΄λΆμμ this, arguments, super, new.targetμ μ°Έμ‘°νλ©΄, μ€μ½ν 체μΈμ ν΅ν΄ μμ μ€μ½νμ κ·Έκ²λ€μ μ°Έμ‘°νλ€.
3) this
πΉ μΌλ° ν¨μλ‘μ νΈμΆλλ λͺ¨λ ν¨μ λ΄λΆμ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
πΉ λμΌν 쑰건μμ strict modeμΌ κ²½μ° λ΄λΆμ thisμλ μ μ κ°μ²΄κ° μλλΌ undefinedκ° λ°μΈλ©λλ€.
β‘οΈ μΌλ° ν¨μλ‘μ νΈμΆλλ Array.prototype.map λ©μλμ μ½λ°± ν¨μμλ strict modeκ° μ μ©λλ―λ‘, μ΄ ν¨μ λ΄λΆμ thisμλ undefinedκ° λ°μΈλ©λλ€.
β οΈ μμ κ°μ μν©μμ "μ½λ°± ν¨μ λ΄λΆμ this λ¬Έμ " λ°μ
πΉ μ½λ°± ν¨μμ thisμ, μΈλΆ ν¨μμ thisκ° μλ‘ λ€λ₯Έ κ°μ κ°λ¦¬ν΄.
β‘οΈ μ΄ λ¬Έμ λ₯Ό ES6 νμ΄ν ν¨μλ₯Ό μ¬μ©ν΄μ ν΄κ²° κ°λ₯
β νμ΄ν ν¨μλ ν¨μ μ체μ this λ°μΈλ©μ κ°μ§ μμμ, μμ μ€μ½νμ thisλ₯Ό κ·Έλλ‘ μ°Έμ‘°νλ€. ( => lexical this)
πΉλ§μ½, νμ΄ν ν¨μκ° μ μ ν¨μλΌλ©΄ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
// μ μ ν¨μ fooμ μμ μ€μ½νλ μ μμ΄λ―λ‘ νμ΄ν ν¨μ fooμ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
const foo = () => console.log(this);
foo(); // window
πΉ νμ΄ν ν¨μμ thisλ call, apply, bind λ©μλλ₯Ό μ¬μ©ν΄λ νμ΄ν ν¨μ λ΄λΆμ thisλ₯Ό κ΅μ²΄ν μ μκ³ ,
νμ μμ μ€μ½νμ thisλ₯Ό κ°λ¦¬ν¨λ€.
π‘ λ©μλλ‘ μ¬μ©ν λλ, νμ΄ν ν¨μμ thisλ μμ μ€μ½νλ₯Ό κ°λ¦¬ν€λ―λ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
// Bad
// sayHi νλ‘νΌν°μ ν λΉν νμ΄ν λ΄λΆμ thisλ λ©μλλ₯Ό νΈμΆν κ°μ²΄μΈ personμ κ°λ¦¬ν€μ§ μκ³
// μμ μ€μ½νλ₯Ό κ°λ¦¬ν€λλ°, μ΄λ μμ μ€μ½νλ thisκ° κ°λ¦¬ν€λ μ μ κ°μ²΄μ΄λ€.
const Person(name) {
name: 'Lee',
sayHi: () => console.log(`Hi ${this.name}`)
};
person.sayHi(); // Hi
β‘οΈ λμ ES6 λ©μλ μΆμ½ ννμ μ¬μ©νμ.
// Good
const person = {
name: 'Lee',
sayHi() {
console.log(`Hi ${this.name}`);
}
};
person.sayHi(); // Hi Lee
πΉ νλ‘νΌν°λ₯Ό λμ μΌλ‘ μΆκ°ν λμλ, νμ΄ν ν¨μ λμ
κ°μ²΄ 리ν°λ΄μ λ°μΈλ©νκ³ νλ‘ν νμ μ constructor νλ‘νΌν°μ μμ±μ ν¨μ κ°μ μ°κ²°μ μ¬μ€μ νλ€.
4) super
π‘ νμ΄ν ν¨μμ superλ μμ μ€μ½νμ superλ₯Ό μ°Έμ‘°νλ€.
β‘οΈ νμ΄ν ν¨μλ ν¨μ μ체μ super λ°μΈλ©μ κ°μ§ μκΈ° λλ¬Έ.
class Base {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi! ${this.name}`;
}
}
class Derived extends Base {
// νμ΄ν ν¨μμ superλ μμ μ€μ½νμΈ constructorμ superλ₯Ό κ°λ¦¬ν¨λ€.
sayHi = () => `${super.sayHi()} how are you doing?`;
}
const derived = new Derived('Lee');
console.log(derived.sayHi()); // Hi! Lee how are you doing?
5) arguments
π‘ νμ΄ν ν¨μμ arguments μμ μμ μ€μ½νμ argumentsλ₯Ό μ°Έμ‘°νλ€.
β‘οΈ νμ΄ν ν¨μλ ν¨μ μ체μ arguments λ°μΈλ©μ κ°μ§ μκΈ° λλ¬Έ.
(function () {
// νμ΄ν ν¨μ fooμ argumentsλ μμ μ€μ½νμΈ μ¦μ μ€ν ν¨μμ argumentsλ₯Ό κ°λ¦¬ν¨λ€.
const foo = () => console.log(arguments); // [Arguments] { '0': 1, '1': 2 }
foo(3, 4);
}(1, 2));
// νμ΄ν ν¨μ fooμ argumentsλ μμ μ€μ½νμΈ μ μμ argumentsλ₯Ό κ°λ¦¬ν¨λ€.
// νμ§λ§ μ μμλ arguments κ°μ²΄κ° μ‘΄μ¬νμ§ μλλ€. arguments κ°μ²΄λ ν¨μ λ΄λΆμμλ§ μ ν¨νλ€.
const foo = () => console.log(arguments);
foo(1, 2); // ReferenceError: arguments is not defined
πΉ arguments κ°μ²΄λ κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν λ μ μ©νμ§λ§, νμ΄ν ν¨μμμ κ°λ³ μΈμ ν¨μλ₯Ό ꡬνν λλ arguments κ°μ²΄λ₯Ό μ¬μ©ν μ μμΌλ―λ‘ μ μ©νμ§ μλ€.
β‘οΈ arguments κ°μ²΄ λμ μ Rest νλΌλ―Έν°λ₯Ό μ¬μ©νλ€.
04. Rest νλΌλ―Έν°
1) κΈ°λ³Έ λ¬Έλ²
πΉ ν¨μμ μ λ¬λ μΈμλ€μ λͺ©λ‘μ λ°°μ΄λ‘ μ λ¬λ°λλ€.
function foo(...rest) {
// λ§€κ°λ³μ restλ μΈμλ€μ λͺ©λ‘μ λ°°μ΄λ‘ μ λ¬λ°λ Rest νλΌλ―Έν°λ€.
console.log(rest); // [ 1, 2, 3, 4, 5 ]
}
foo(1, 2, 3, 4, 5);
πΉ μΌλ° λ§€κ°λ³μμ κ°μ΄ μ¬μ©ν μ μλ€.
function foo(param, ...rest) {
console.log(param); // 1
console.log(rest); // [ 2, 3, 4, 5 ]
}
foo(1, 2, 3, 4, 5);
function bar(param1, param2, ...rest) {
console.log(param1); // 1
console.log(param2); // 2
console.log(rest); // [ 3, 4, 5 ]
}
bar(1, 2, 3, 4, 5);
πΉ λ¨Όμ μ μΈλ λ§€κ°λ³μμ ν λΉλ μΈμλ₯Ό μ μΈν λλ¨Έμ§ μΈμλ€μ΄ λ€μ΄μ¨λ€.
β‘οΈ λ°λΌμ μ μΌ λ§μ§λ§μ μ μΈλμ΄μΌνλ€.
function foo(...rest) {}
console.log(foo.length); // 0
function bar(x, ...rest) {}
console.log(bar.length); // 1
function baz(x, y, ...rest) {}
console.log(baz.length); // 2
2) Rest νλΌλ―Έν°μ arguments κ°μ²΄
π‘ arguments κ°μ²΄λ ν¨μ νΈμΆ μ μ λ¬λ μΈμλ€μ μ λ³΄κ° λ΄κ²¨μλ μ μ¬ λ°°μ΄ κ°μ²΄
πΉ ν¨μ λ΄λΆμμ μ§μ λ³μμ²λΌ μ¬μ© κ°λ₯
β‘οΈ λ°°μ΄ λ©μλλ₯Ό μ¬μ©νλ €λ©΄ λ³λμ λ©μλλ₯Ό μ¬μ©ν΄μ arguments κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ³νν΄μΌ νλ€.
β‘οΈ νμ§λ§ ES6μμλ rest νλΌλ―Έν°λ₯Ό μ¬μ©ν΄μ κ°λ³ μΈμ ν¨μμ μΈμ λͺ©λ‘μ λ°°μ΄λ‘ μ§μ μ λ¬λ°μ μ μλ€.
β οΈ νμ΄ν ν¨μ μ체μ argumentsκ° μμΌλ―λ‘ λ°λμ Rest νλΌλ―Έν° μ¬μ©ν΄μΌ ν¨.
05. λ§€κ°λ³μ κΈ°λ³Έκ°
πΉ μλ, λ§€κ°λ³μμ κ°μμ μΈμμ κ°μκ° λ€λ₯Ό κ²½μ°, μλμΉ μμ κ²°κ³Όκ° λ°μν μ μκΈ° λλ¬Έμ
λ³λμ λ°©μ΄ μ½λκ° νμνλ€.
πΉ ES6μμ λμ
π‘ λ§€κ° λ³μμ κΈ°λ³Έκ°μ μ€μ ν΄μ λ³λλ‘ ν λΉλμ§ μμλ μλ¬ μμ΄ μ¬μ© κ°λ₯
(μ΄λ, 1. λ§€κ°λ³μμ μΈμλ₯Ό μ λ¬νμ§ μμ κ²½μ° 2. undefinedλ₯Ό μ λ¬ν κ²½μ° μλ§ μ ν¨)
π μ°Έκ³ μλ£