관리 메뉴

Daehyunii's Dev-blog

26μž₯ ES6 ν•¨μˆ˜μ˜ μΆ”κ°€ κΈ°λŠ₯ λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

26μž₯ ES6 ν•¨μˆ˜μ˜ μΆ”κ°€ κΈ°λŠ₯

Daehyunii 2022. 7. 26. 19:53

26.1 ν•¨μˆ˜μ˜ ꡬ뢄

  ES6 μ΄μ „κΉŒμ§€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 별닀λ₯Έ ꡬ뢄 없이 λ‹€μ–‘ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λ˜μ—ˆλ‹€. 즉, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 일반적인 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  μˆ˜λ„ 있고, new μ—°μ‚°μžμ™€ ν•¨κ»˜ ν˜ΈμΆœν•˜μ—¬ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  μˆ˜λ„ 있으며, 객체에 λ°”μΈλ”©λ˜μ–΄ λ©”μ„œλ“œλ‘œμ„œ ν˜ΈμΆœν• μˆ˜λ„ μžˆλ‹€. 

var foo = function (){
    return 1;
}

// 일반 ν•¨μˆ˜λ‘œμ„œ 호좜
foo(); // 1 λ°˜ν™˜

// μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜
new foo(); // foo {} 생성

// λ©”μ„œλ“œλ‘œμ„œ 호좜
var obj = { foo : foo };
obj.foo(); // 1 λ°˜ν™˜

이처럼 ES6 μ΄μ „μ˜ ν•¨μˆ˜λŠ” μ‚¬μš© λͺ©μ μ— 따라 λͺ…ν™•νžˆ κ΅¬λΆ„λ˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μ‹œ 말해, ES6 μ΄μ „μ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” callable μ΄λ©΄μ„œ constructorλ‹€. μ£Όμ˜ν•  것은 ES6 이전에 일반적으둜 λ©”μ„œλ“œλΌκ³  λΆ€λ₯΄λ˜ 객체에 λ°”μΈλ”©λœ ν•¨μˆ˜λ„ callable이며 constructor λΌλŠ” 것이닀. λ”°λΌμ„œ 객체에 λ°”μΈλ”©λœ ν•¨μˆ˜λ„ 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  수 μžˆλŠ” 것은 λ¬Όλ‘  μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€.

var obj = {
    x : 10,
    f : function (){
        return this.x;
    }
};


// ν”„λ‘œνΌν‹° f에 λ°”μΈλ”©λœ ν•¨μˆ˜λ₯Ό λ©”μ„œλ“œλ‘œμ„œ 호좜
console.log(obj.f()); // 10

// ν”„λ‘œνΌν‹° f에 λ°”μΈλ”©λœ ν•¨μˆ˜λ₯Ό 일반 ν•¨μˆ˜λ‘œμ„œ 호좜
var bar = obj.f;
console.log(bar()); // undefined

// ν”„λ‘œνΌν‹° f에 λ°”μΈλ”©λœ ν•¨μˆ˜λ₯Ό μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜
console.log(new obj.f()); // f{}

  이처럼 ES6 μ΄μ „μ˜ λͺ¨λ“  ν•¨μˆ˜λŠ” μ‚¬μš© λͺ©μ μ— 따라 λͺ…ν™•ν•œ ꡬ뢄이 μ—†μœΌλ―€λ‘œ 호좜 방식에 νŠΉλ³„ν•œ μ œμ•½μ΄ μ—†κ³  μƒμ„±μž ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜μ§€ μ•Šμ•„λ„ ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μƒμ„±ν•œλ‹€. μ΄λŠ” μ‹€μˆ˜λ₯Ό μœ λ°œν•  κ°€λŠ₯성이 있고 μ„±λŠ₯λ©΄μ—μ„œλ„ 쒋지 μ•Šλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ES6μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš© λͺ©μ μ— 따라 μ„Έ 가지 μ’…λ₯˜λ‘œ λͺ…ν™•νžˆ κ΅¬λΆ„ν–ˆλ‹€. 

ES6 ν•¨μˆ˜μ˜ ꡬ뢄 constructor prototype super arguments
일반 ν•¨μˆ˜ o o x o
λ©”μ„œλ“œ(μΆ•μ•½ ν‘œν˜„) x x o o
ν™”μ‚΄ν‘œ ν•¨μˆ˜ x x x x

  일반 ν•¨μˆ˜λŠ” constructro μ΄μ§€λ§Œ ES6의 λ©”μ„œλ“œμ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” non-constructor이닀. 

 

26.2 λ©”μ„œλ“œ

  ES6 이전 μ‚¬μ–‘μ—λŠ” λ©”μ„œλ“œμ— λŒ€ν•œ λͺ…ν™•ν•œ μ •μ˜κ°€ μ—†μ—ˆλ‹€. 일반적으둜 λ©”μ„œλ“œλŠ” 객체에 λ°”μΈλ”©λœ ν•¨μˆ˜λ₯Ό μΌμ»«λŠ” 의미둜 μ‚¬μš©λ˜μ—ˆλ‹€. ES6 μ‚¬μ–‘μ—μ„œλŠ” λ©”μ„œλ“œμ— λŒ€ν•œ μ •μ˜κ°€ λͺ…ν™•ν•˜κ²Œ κ·œμ •λ˜μ—ˆλ‹€. ES6 μ‚¬μ–‘μ—μ„œ λ©”μ„œλ“œλŠ” λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μœΌλ‘œ μ •μ˜λœ ν•¨μˆ˜λ§Œμ„ μ˜λ―Έν•œλ‹€.

var obj = {
    x : 10,

    // f에 λ°”μΈλ”©λœ ν•¨μˆ˜λŠ” λ©”μ„œλ“œκ°€ μ•„λ‹Œ 일반 ν•¨μˆ˜λ‹€.
    f : function (){
    },

    // fooλŠ” λ©”μ„œλ“œλ‹€.
    foo(){
    }
};

  ES6 λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μœΌλ―€λ‘œ prototype ν”„λ‘œνΌν‹°κ°€ μ—†κ³  ν”„λ‘œν† νƒ€μž…λ„ μƒμ„±ν•˜μ§€ μ•ŠλŠ”λ‹€. μ°Έκ³ λ‘œ ν‘œμ€€ 빌트인 객체가 μ œκ³΅ν•˜λŠ” ν”„λ‘œν† νƒ€μž… λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œλŠ” λͺ¨λ‘ non-constructorλ‹€. ES6 λ©”μ„œλ“œλŠ” μžμ‹ μ„ λ°”μΈλ”©ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ‚΄λΆ€ 슬둯 [[HomeObject]]λ₯Ό κ°–λŠ”λ‹€. super μ°Έμ‘°λŠ” λ‚΄λΆ€ 슬둯 [[HomeObject]]λ₯Ό μ‚¬μš©ν•˜μ—¬ 수퍼클래슀의 λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜λ―€λ‘œ λ‚΄λΆ€ 슬둯 [[HomeObject]]λ₯Ό κ°–λŠ” ES6 λ©”μ„œλ“œλŠ” super ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 이처럼 ES6 λ©”μ„œλ“œλŠ” λ³Έμ—°μ˜ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ³  의미적으둜 λ§žμ§€ μ•ŠλŠ” κΈ°λŠ₯은 μ œκ±°ν–ˆλ‹€. λ”°λΌμ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ 읡λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹μ„ ν• λ‹Ήν•˜λŠ” ES6 μ΄μ „μ˜ 방식은 지양해야 ν•œλ‹€.

 

26.3  ν™”μ‚΄ν‘œ ν•¨μˆ˜

  ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” function ν‚€μ›Œλ“œ λŒ€μ‹  ν™”μ‚΄ν‘œ( => )λ₯Ό μ‚¬μš©ν•˜μ—¬ 기쑴의 ν•¨μˆ˜ μ •μ˜ 방식보닀 κ°„λž΅ν•˜κ²Œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν‘œν˜„λ§Œ κ°„λž΅ν•œ 것이 μ•„λ‹ˆλΌ λ‚΄λΆ€ λ™μž‘λ„ 기쑴의 ν•¨μˆ˜λ³΄λ‹€ κ°„λž΅ν•˜λ‹€. νŠΉνžˆ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ thisκ°€ μ „μ—­ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λŒ€μ•ˆμœΌλ‘œ μœ μš©ν•˜λ‹€.

 

26.3.1 ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ •μ˜

1. ν•¨μˆ˜ μ •μ˜

  ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•  수 μ—†κ³  ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•΄μ•Ό ν•œλ‹€.

const multifly = (x,y) => x * y;
console.log(multifly(2, 3)); // 6

2. λ§€κ°œλ³€μˆ˜ μ„ μ–Έ

  λ§€λ°°κ²¬μˆ˜κ°€ μ—¬λŸ¬ 개인 경우 μ†Œκ΄„ν˜Έ( ) μ•ˆμ— λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€. λ§€κ°œλ³€μˆ˜κ°€ ν•œ 개인 경우 μ†Œκ΄„ν˜Έ ( )λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

const multifly = x => x ** 2;
console.log(multifly(2)); // 4

3. ν•¨μˆ˜ λͺΈμ²΄ μ •μ˜

  ν•¨μˆ˜ λͺΈμ²΄κ°€ ν•˜λ‚˜μ˜ 문으둜 κ΅¬μ„±λœλ‹€λ©΄ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ€‘κ΄„ν˜Έ { }λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. μ΄λ•Œ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ˜ 문이 κ°’μœΌλ‘œ 평가될 수 μžˆλŠ” ν‘œν˜„μ‹μΈ 문이라면 μ•”λ¬΅μ μœΌλ‘œ λ°˜ν™˜ν•œλ‹€. λ§Œμ•½ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ€‘κ΄„ν˜Έ { }λ₯Ό μƒλž΅ν•œ 경우 ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ˜ 문이 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이라면 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문은 λ°˜ν™˜ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ ν•¨μˆ˜ λͺΈμ²΄κ°€ ν•˜λ‚˜μ˜ 문으둜 κ΅¬μ„±λœλ‹€ 해도 ν•¨μˆ˜ λͺΈμ²΄μ˜ 문이 ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문이라면 μ€‘κ΄„ν˜Έλ₯Ό μƒλž΅ν•  수 μ—†λ‹€.

const sum = (a, b) => {
    const result = a + b;
    return result;
};

  λ§Œμ•½ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ 객체 λ¦¬ν„°λŸ΄μ„ λ°˜ν™˜ν•˜λŠ” 경우 객체 λ¦¬ν„°λŸ΄μ„ μ†Œκ΄„ν˜Έ ( )둜 감싸 μ£Όμ–΄μ•Ό ν•œλ‹€.(감싸지 μ•ŠμœΌλ©΄ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ½”λ“œλΈ”λ‘μœΌλ‘œ 잘λͺ»ν•΄μ„ν•˜κΈ° λ•Œλ¬Έ) ν•¨μˆ˜ λͺΈμ²΄κ°€ μ—¬λŸ¬ 개의 문으둜 κ΅¬μ„±λœλ‹€λ©΄ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ€‘κ΄„ν˜Έ { }λ₯Ό μƒλž΅ν•  수 μ—†κ³  λ°˜ν™˜κ°’μ΄ μžˆλ‹€λ©΄ λͺ…μ‹œμ μœΌλ‘œ λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€. λ˜ν•œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ„ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ μ‚¬μš©ν•  수 있으며, 콜백 ν•¨μˆ˜λ‘œμ„œ μ •μ˜ν•  λ•Œ μœ μš©ν•˜λ‹€.(콜백 ν•¨μˆ˜ λ‚΄μ˜ this 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λŒ€μ•ˆμœΌλ‘œ 많이 μ‚¬μš©λ¨)

 

26.3.2 ν™”μ‚΄ν‘œ ν•¨μˆ˜μ™€ 일반 ν•¨μˆ˜μ˜ 차이

1. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λŠ” non-constructorλ‹€.

2. μ€‘λ³΅λœ λ§€κ°œλ³€μˆ˜ 이름을 μ„ μ–Έν•  수 μ—†λ‹€.(일반 ν•¨μˆ˜λŠ” μ€‘λ³΅λœ λ§€κ°œλ³€μˆ˜ 이름을 선언해도 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.)

3. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 this, arguments, super, new.target 바인딩을 갖지 μ•ŠλŠ”λ‹€.

 

26.3.3 this

  ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ 일반 ν•¨μˆ˜μ™€ κ΅¬λ³„λ˜λŠ” κ°€μž₯ 큰 νŠΉμ§•μ΄ λ°”λ‘œ thisλ‹€. 그리고 ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인수둜 μ „λ‹¬λ˜μ–΄ 콜백 ν•¨μˆ˜λ‘œ μ‚¬μš©λ˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. this 바인딩은 ν•¨μˆ˜κ°€ μ–΄λ–»κ²Œ ν˜ΈμΆœλ˜λŠ”μ§€μ— 따라 λ™μ μœΌλ‘œ κ²°μ •λœλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœλ˜λŠ” 콜백 ν•¨μˆ˜μ˜ 경우 λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆλ‹€. ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 this 바인딩을 갖지 μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ thisλ₯Ό μ°Έμ‘°ν•˜λ©΄ μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ·ΈλŒ€λ‘œ μ°Έμ‘°ν•œλ‹€. μ΄λ₯Ό lexical this라 ν•œλ‹€. μ΄λŠ” 마치 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ™€ 같이 ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ thisκ°€ ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ— μ˜ν•΄ κ²°μ •λ˜λŠ” 것과 κ°™κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

  ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•¨μˆ˜μ—λŠ” this 바인딩이 λ°˜λ“œμ‹œ μ‘΄μž¬ν•œλ‹€. λ”°λΌμ„œ ES6μ—μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ λ„μž…λ˜κΈ° μ΄μ „μ—λŠ” 일반적인 μ‹λ³„μžμ²˜λŸΌ μŠ€μ½”ν”„ 체인을 톡해 thisλ₯Ό 탐색할 ν•„μš”κ°€ μ—†μ—ˆλ‹€. ν•˜μ§€λ§Œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 this바인딩이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ thisλ₯Ό μ°Έμ‘°ν•˜λ©΄ 일반적인 μ‹λ³„μžμ²˜λŸΌ μŠ€μ½”ν”„ 체인을 톡해 μƒμœ„ μŠ€μ½”ν”„μ—μ„œ thisλ₯Ό νƒμƒ‰ν•œλ‹€. λ§Œμ•½ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ™€ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μ€‘μ²©λ˜μ–΄ μžˆλ‹€λ©΄ μƒμœ„ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—λ„ this 바인딩이 μ—†μœΌλ―€λ‘œ μŠ€μ½”ν”„μ²΄μΈ μƒμ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ μƒμœ„ ν•¨μˆ˜ μ€‘μ—μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μ•„λ‹Œ ν•¨μˆ˜μ˜ thisλ₯Ό μ°Έμ‘°ν•œλ‹€. ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ„ μŠ€μ½”ν”„ 체인 μƒμ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ μƒμœ„ ν•¨μˆ˜ μ€‘μ—μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ μ•„λ‹Œ ν•¨μˆ˜μ˜ thisλ₯Ό μ°Έμ‘°ν•œλ‹€.

const counter = {
    num : 1,
    increase : () => ++this.num
};

console.log(counter.increase()); // NaN
// increase ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•œ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” 전역이닀.
// λ”°λΌμ„œ increase ν”„λ‘œνΌν‹°μ— ν• λ‹Ήν•œ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ thisλŠ” μ „μ—­ 객체λ₯Ό 가리킨닀.

26.3.5 arguments

  ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 arguments 바인딩을 갖지 μ•ŠλŠ”λ‹€. λ”°λΌμ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ argumentsλ₯Ό μ°Έμ‘°ν•˜λ©΄ this와 λ§ˆμ°¬κ°€μ§€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ˜ argumentsλ₯Ό μ°Έμ‘°ν•œλ‹€. arguments κ°μ²΄λŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό ν™•μ •ν•  수 μ—†λŠ” κ°€λ³€ 인자 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν• λ•Œ μœ μš©ν•˜λ‹€. ν•˜μ§€λ§Œ ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—λŠ” arguments 객체λ₯Ό μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ κ°€λ³€ 인자 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•  λ•ŒλŠ” λ°˜λ“œμ‹œ Rest νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

26.4 Rest νŒŒλΌλ―Έν„°

26.4.1 κΈ°λ³Έ 문법

  Rest νŒŒλΌλ―Έν„°(λ‚˜λ¨Έμ§€ λ§€κ°œλ³€μˆ˜)λŠ” λ§€κ°œλ³€μˆ˜ 이름 μ•žμ— ...을 λΆ™μ—¬μ„œ μ •μ˜ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€. RestνŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ μ „λ‹¬λ°›λŠ”λ‹€.

function foo(...rest){
    console.log(rest);
}

foo(1,2,3,4,5); // [1, 2, 3, 4, 5]

  일반 λ§€κ°œλ³€μˆ˜μ™€ Rest νŒŒλΌλ―Έν„°λŠ” ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λ•Œ ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμˆ˜λ“€μ€ λ§€κ°œλ³€μˆ˜μ™€ Rest νŒŒλΌλ―Έν„°μ— 순차적으둜 ν• λ‹Ήλœλ‹€.

function foo(x, ...rest){
    console.log(x, rest);
}

foo(1,2,3,4,5); // 1  [2, 3, 4, 5]

  Rest νŒŒλΌλ―Έν„°λŠ” λ¨Όμ € μ„ μ–Έλœ λ§€κ°œλ³€μˆ˜μ— ν• λ‹Ήλœ 인수λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μΈμˆ˜λ“€λ‘œ κ΅¬μ„±λœ 배열이 ν• λ‹Ήλ˜λ―€λ‘œ, λ°˜λ“œμ‹œ λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°μ΄μ–΄μ•Ό ν•œλ‹€. λ˜ν•œ Rest νŒŒλΌλ―Έν„°λŠ” 단 ν•˜λ‚˜λ§Œ μ„ μ–Έν•  수 μžˆλ‹€. Rest νŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜ μ •μ˜ μ‹œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜ 객체의 length ν”„λ‘œνΌν‹°μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€.(즉 λ§€κ°œλ³€μˆ˜ κ°œμˆ˜μ— μΉ΄μš΄νŠΈλ˜μ§€ μ•ŠμŒ)

function foo(x, ...rest){
    console.log(x, rest);
}

foo(1,2,3,4,5); // 1  [2, 3, 4, 5]
console.log(foo.length); // 1

 

26.5 λ§€κ°œλ³€μˆ˜ κΈ°λ³Έκ°’

  ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ λ§€κ°œλ³€μˆ˜μ˜ 개수만큼 인수λ₯Ό 전달해야 ν•˜μ§€λ§Œ 그렇지 μ•Šμ€ κ²½μš°μ—λ„ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ 인수의 개수λ₯Ό μ²΄ν¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. μΈμˆ˜κ°€ μ „λ‹¬λ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜μ˜ 값은 undefinedλ‹€. μ΄λŸ¬ν•œ 경우 λ¬Έμ œκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— λ°©μ–΄ μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€. ES6μ—μ„œλŠ” λ§€κ°œλ³€μˆ˜ 기본값을 μ‚¬μš©ν•˜μ—¬ 문제 λ°œμƒμ„ λ°©μ–΄ν•  수 μžˆλ‹€.

function name(name = 'lee'){
    console.log(name);
}

name(); // lee
name(undefined) // lee
name(null) // null
name('park') // park

  λ§€κ°œλ³€μˆ˜ 기본값은 λ§€κ°œλ³€μˆ˜μ— 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ€ κ²½μš°μ™€ undefinedλ₯Ό μ „λ‹¬ν•œ κ²½μš°μ—λ§Œ μœ νš¨ν•˜λ‹€. μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ Rest νŒŒλΌλ―Έν„°μ—λŠ” 기본값을 지정할 수 μ—†λ‹€.(SyntaxError λ°œμƒ) 그리고 λ§€κ°œλ³€μˆ˜ 기본값은 ν•¨μˆ˜ μ •μ˜ μ‹œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜ 객체의 length ν”„λ‘œνΌν‹°μ™€ arguments 객체에 μ•„λ¬΄λŸ° 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

function add(x, y = 0){
    console.log(arguments);
}

console.log(add.length); // 1

add(1); // Arguments { '0' : 1 }
add(1,2); // Arguments { '0' : 1,  '1' : 2 }