κΈ°μ‘΄μ μ‘΄μ¬νλ 6κ°μ νμ (
String
,Number
,Boolean
,undefined
,null
,Object
) λ€μμΌλ‘ ES6μμ λμ λ λ³κ²½ λΆκ°λ₯ν μμ νμ μ κ°
Boolean
νμ
μΌλ‘λ κ°λ₯Well-known Symbol
: μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡 νλ λΉνΈμΈ Symbol κ°// Symbol ν¨μ νΈμΆνμ¬ μμ±
// μ νμ μΌλ‘ λ¬Έμμ΄μ μΈμλ‘ μ λ¬ κ°λ₯ (μ¬λ² κ°μ λν μ€λͺ
, λλ²κΉ
μ©λ)
const mySymbol1 = Symbol("mine");
const mySymbol2 = Symbol("mine");
// κ°μ μΈλΆλ‘ λ
ΈμΆλμ§ μμ μ μ μμ
console.log(typeof mySymbol1, mySymbol1); //symbol, Symbol()
console.log(mySymbol1 === mySymbol2); //false
console.log(mySymbol1.description); //'mine'
console.log(mySymbol1 + 1); //TypeError: Cannot convert a Symbol value to a number
console.log(mySymbol1 + ""); //TypeError: Cannot convert a Symbol value to a string
console.log(!mySymbol1); //true
Symbol.for
: μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄
μ key
λ‘ μ¬μ©νμ¬ keyμ Symbol κ°μ μλ€μ΄ μ μ₯λμ΄ μλ μ μ μ¬λ² λ μ§μ€νΈλ¦¬(global symbol registry)
μμ ν΄λΉ key
μ μΌμΉνλ Symbol
κ° κ²μ
Symbol.keyFor
: μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ Symbol κ°μ ν€ μΆμΆ
const s1 = Symbol.for("mine"); // μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μλ‘ μμ±
const s2 = Symbol.for("mine"); // μ μ₯λ Symbol κ° λ°ν
console.log(s1 === s2); //true
Symbol.keyFor(s1); //'mine'
for ... in
, Object.keys
, Object.getOwnPropertyNames
λ©μλλ‘ μ°Ύμ μ μμObject.getOwnPropertySymbols
μ΄μ©νμ¬ νλ‘νΌν° μ°ΎκΈ° κ°λ₯μ½λ λΈλ‘ μ€νμ μΌμ μ€μ§ νλ€κ° νμν μμ μ μ¬κ°ν μ μλ νΉμν ν¨μ
μΌλ° ν¨μμ²λΌ μ½λ λΈλ‘μ μ€ννλ κ²μ΄ μλλΌ, μ λλ μ΄ν° κ°μ²΄(μ΄ν°λ¬λΈμ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°)λ₯Ό μμ±ν΄ λ°ν
yield
) κ°λ₯function*
ν€μλλ‘ μ μΈ, νλ μ΄μμ yield
ννμ ν¬ν¨async
/await
κ° λ κ°λ¨νκ³ κ°λ
μ±μ΄ μ’μ!next
: μ λλ μ΄ν° ν¨μμ yield ννμκΉμ§ μ½λ λΈλ‘μ μ€ννκ³ , yield λ κ°μ value νλ‘νΌν° κ°μΌλ‘, falseλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄ λ°νreturn
: μΈμλ‘ μ λ¬λ°μ κ°μ value νλ‘νΌν° κ°μΌλ‘, trueλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄ λ°νthrow
: μΈμλ‘ μ λ¬λ°μ μλ¬λ₯Ό λ°μμν€κ³ , undefinedλ₯Ό value νλ‘νΌν° κ°μΌλ‘, trueλ₯Ό done νλ‘νΌν° κ°μΌλ‘ κ°λ μ΄ν°λ μ΄ν° 리μ νΈ κ°μ²΄ λ°νfunction* genFunc() {
try {
yield 1; // μ¬κΈ°κΉμ§
yield 2;
yield 3;
} catch (e) {
console.error(e);
}
}
const generator = genFunc();
console.log(generator.next()); //{value: 1, done: false}
console.log(generator.next()); //{value: 2, done: false}
console.log(generator.throw("Error!")); //{value: undefined, done: true}, λλκΈ° μ μ μ€νν΄μΌ
console.log(generator.return("End!")); //{value: 'End!', done: true}
/******** nextμ μΈμ μ λ¬ *********/
function* genFunc() {
const x = yield 1;
const y = yield x + 10;
return x + y;
}
const generator = genFunc(0);
//μ²μ νΈμΆνλ next λ©μλ μΈμ μ λ¬μ 무μ
let res = generator.next(100);
console.log(res); //{value: 1, done: false}
res = generator.next(10);
console.log(res); //{value: 20, done: false}
res = generator.next(20);
console.log(res); //{value: 30, done: true}
//무ν μ΄ν°λ¬λΈ infiniteFiboλ₯Ό μμ±νλ μ λλ μ΄ν° ν¨μ
const infiniteFibo = (function* () {
let [pre, cur] = [0, 1];
while (true) {
[pre, cur] = [cur, pre + cur];
yield cur;
}
})();
for (const num of infiniteFibo) {
if (num > 10000) break;
console.log(num); // 1 2 3 5 8 ... 2584 4181 6765
}
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
ES6 (ES2015) μ νΉμ§λ€