ν‹°μŠ€ν† λ¦¬ λ·°

ν•¨μˆ˜μ˜ ꡬ뢄

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

 

λ”°λΌμ„œ ES6μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό μ‚¬μš© λͺ©μ μ— 따라 μ„Έ 가지 μ’…λ₯˜λ‘œ λͺ…ν™•νžˆ κ΅¬λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.

 

ES ν•¨μˆ˜μ˜ ꡬ뢄 constructor prototype super arguments
일반 ν•¨μˆ˜(Normal) O O X O
λ©”μ„œλ“œ(Method) X X O O
ν™”μ‚΄ν‘œ ν•¨μˆ˜(Arrow) X X X X

λ©”μ„œλ“œ

ES6 μ‚¬μ–‘μ—μ„œ λ©”μ„œλ“œλŠ” λ©”μ„œλ“œ μΆ•μ•½ ν‘œν˜„μœΌλ‘œ μ •μ˜λœ ν•¨μˆ˜λ§Œμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

 

const obj = {
    x: 1,
    // fooλŠ” λ©”μ„œλ“œ
    foo() { return this.x; },

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

console.log(obj.foo()); // 1
console.log(bar.foo()); // 1

new obj.foo(); // TypeError
new obj.bar(); // bar {}

obj.foo.hasOwnProperty('prototype'); // false
obj.bar.hasOwnProperty('prototype'); // true

// λ©”μ„œλ“œμ˜ super ν‚€μ›Œλ“œ μ‚¬μš©
const base = {
    name: 'Lee',
    sayHi() {
        return `Hi! ${this.name}`;
    }
};

const derived = {
    __proto__ : base,
    // sayHi의 [[HomeObejct]]λŠ” sayHiκ°€ λ°”μΈλ”©λœ 객체인 derivedλ₯Ό 가리킴
    // superλŠ” sayHi의 [[HomeObejct]]의 ν”„λ‘œν† νƒ€μž…μΈ baseλ₯Ό 가리킴
    sayHi() {
        return `${super.sayHi()}. how are you doing?`;
    }
};

console.log(derived.sayHi()); // Hi! Lee. how are you doing?
  • λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λŠ” non-contructorλΌμ„œ μƒμ„±μž ν•¨μˆ˜λ‘œμ„œ 호좜 λΆˆκ°€λŠ₯
  • μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μ–΄μ„œ prototype ν”„λ‘œνΌν‹°κ°€ μ—†κ³  ν”„λ‘œν† νƒ€μž…λ„ μƒμ„±ν•˜μ§€ μ•ŠμŒ
  • λ©”μ„œλ“œλŠ” μžμ‹ μ„ λ°”μΈλ”©ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” λ‚΄λΆ€ 슬둯 [[HomeObject]]λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— super ν‚€μ›Œλ“œ μ‚¬μš© κ°€λŠ₯

이처럼 ES6 λ©”μ„œλ“œλŠ” λ³Έμ—°μ˜ κΈ°λŠ₯(super)을 μΆ”κ°€ν•˜κ³  의미적으둜 λ§žμ§€ μ•ŠλŠ” κΈ°λŠ₯(constructor)은 μ œκ±°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  λ•Œ ν”„λ‘œνΌν‹° κ°’μœΌλ‘œ 읡λͺ… ν•¨μˆ˜ ν‘œν˜„μ‹μ„ ν• λ‹Ήν•˜λŠ” μ΄μ „μ˜ 방식은 ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


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

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

 

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

ν™”μ‚΄ν‘œ ν•¨μˆ˜ μ •μ˜ 문법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

ν•¨μˆ˜ μ •μ˜

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ μ„ μ–Έλ¬ΈμœΌλ‘œ μ •μ˜ν•  수 μ—†κ³  ν•¨μˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜ν•΄μ•Ό 함
const multiply = (x, y) => x * y;
multiply(2, 3); // 6

 

 

λ§€κ°œλ³€μˆ˜ μ •μ˜

  • λ§€κ°œλ³€μˆ˜κ°€ μ—¬λŸ¬κ°œμΈ 경우 μ†Œκ΄„ν˜Έ () μ•ˆμ— λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έ
  • λ§€κ°œλ³€μˆ˜κ°€ 1개라면 μ†Œκ΄„ν˜Έ () μƒλž΅ κ°€λŠ₯
  • λ§€κ°œλ³€μˆ˜κ°€ μ—†λ‹€λ©΄ μ†Œκ΄„ν˜Έ () μƒλž΅ λΆˆκ°€λŠ₯
const arrow = (x, y) => { ... };

const arrow = x => { ... };

const arrow = () => { ... );

 

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

  • ν•¨μˆ˜ λͺΈμ²΄κ°€ ν•˜λ‚˜μ˜ 문으둜 κ΅¬μ„±λ˜λ©° ν¬ν˜„μ‹μ΄λΌλ©΄ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ€‘κ΄„ν˜Έ {}λ₯Ό μƒλž΅ κ°€λŠ₯
  • ν•¨μˆ˜ λͺΈμ²΄κ°€ ν•˜λ‚˜μ˜ 문으둜 κ΅¬μ„±λ˜μ–΄λ„ ν‘œν˜„μ‹μ΄ μ•„λ‹Œ 문은 κ°’μœΌλ‘œ ν‘œν˜„λ  수 μ—†κΈ° λ•Œλ¬Έμ— μ€‘κ΄„ν˜Έ {} μƒλž΅ λΆˆκ°€λŠ₯
  • 객체 λ¦¬ν„°λŸ΄μ„ λ°˜ν™˜ν•˜λŠ” 경우 객체 λ¦¬ν„°λŸ΄μ„ μ†Œκ΄„ν˜Έ ()둜 감싸 주어야함
  • ν•¨μˆ˜ λͺΈμ²΄κ°€ μ—¬λŸ¬ 개의 문으둜 κ΅¬μ„±λœλ‹€λ©΄ ν•¨μˆ˜ λͺΈμ²΄λ₯Ό κ°μ‹ΈλŠ” μ€‘κ΄„ν˜Έ {} μƒλž΅ λΆˆκ°€λŠ₯
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λ„ μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜λ‘œ μ‚¬μš© κ°€λŠ₯
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λ„ 일급 κ°μ²΄μ΄λ―€λ‘œ map, filter, reduce 같은 κ³ μ°¨ ν•¨μˆ˜μ— 인수둜 전달 κ°€λŠ₯
// ν‘œν˜„μ‹μΈ ν•˜λ‚˜μ˜ λ¬Έ
const power = x => x ** 2;
power(2); // -> 4
// μœ„ ν‘œν˜„μ€ λ‹€μŒκ³Ό λ™μΌν•˜λ‹€.
const power = x => { return x ** 2; };

// ν‘œν˜„μ‹μ΄ μ•„λ‹Œ λ¬Έ
const arrow = () => { const x = 1; };

// 객체 λ¦¬ν„°λŸ΄ λ°˜ν™˜
const create = (id, content) => ({ id, content });
create(1, 'JavaScript'); // -> {id: 1, content: "JavaScript"}
// μœ„ ν‘œν˜„μ€ λ‹€μŒκ³Ό λ™μΌν•˜λ‹€.
const create = (id, content) => { return { id, content }; };


// μ—¬λŸ¬ 개의 λ¬Έ
const sum = (a, b) => {
  const result = a + b;
  return result;
};

// μ¦‰μ‹œ μ‹€ν–‰ ν•¨μˆ˜
const person = (name => ({
  sayHi() { return `Hi? My name is ${name}.`; }
}))('Lee');

console.log(person.sayHi()); // Hi? My name is Lee.


// κ³ μ°¨ ν•¨μˆ˜
[1, 2, 3].map(v => v * 2); // -> [ 2, 4, 6 ]

 

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

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

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μœΌλ―€λ‘œ prototype ν”„λ‘œνΌν‹°κ°€ μ—†κ³  ν”„λ‘œν† νƒ€μž…λ„ μƒμ„±ν•˜μ§€ μ•ŠμŒ

 

2. μ€‘λ³΅λœ λ§€κ°œλ³€μˆ˜ 이름을 μ„ μ–Έν•  수 μ—†μŒ

  • 일반 ν•¨μˆ˜λŠ” μ€‘λ³΅λœ λ§€κ°œλ³€μˆ˜ 이름을 선언해도 μ—λŸ¬ λ°œμƒ X (strict mode μ œμ™Έ)
  • ν™”μ‚΄ν‘œ ν•¨μˆ˜μ—μ„œλŠ” μ€‘λ³΅λœ λ§€κ°œλ³€μˆ˜ 이름을 μ„ μ–Έν•˜λ©΄ SyntaxErrorκ°€ λ°œμƒ

 

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

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜ 내뢀와 μ€‘μ²©ν•¨μˆ˜(ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ˜ ν™”μ‚΄ν‘œ ν•¨μˆ˜)μ—μ„œ this, arguments, super, new.target을 μ°Έμ‘°ν•˜λ©΄
    μŠ€μ½”ν”„ 체인을 톡해 μƒμœ„ μŠ€μ½”ν”„μ˜ this, arguments, super, new.target을 참쑰함

 

this

ν™”μ‚΄ν‘œ ν•¨μˆ˜κ°€ 일반 ν•¨μˆ˜μ™€ κ΅¬λ³„λ˜λŠ” κ°€μž₯ 큰 νŠΉμ§•μ€ thisμž…λ‹ˆλ‹€.

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜ : ν•¨μˆ˜ 자체의 this 바인딩을 갖지 μ•Šμ•„μ„œ ν™”μ‚΄ν‘œ λ‚΄λΆ€μ—μ„œ thisλ₯Ό μ°Έμ‘°ν•˜λ©΄ μƒμœ„ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ·ΈλŒ€λ‘œ μ°Έμ‘°ν•©λ‹ˆλ‹€. (lexical this, 마치 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ™€ 같이 thisκ°€ ν•¨μˆ˜κ°€ μ •μ˜λœ μœ„μΉ˜μ— μ˜ν•΄ 결정됨)
  • 일반 ν•¨μˆ˜ : λͺ¨λ“  ν•¨μˆ˜ λ‚΄λΆ€μ˜ thisλŠ” μ „μ—­ 객체λ₯Ό 가리킴

ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό 톡해 "콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this 문제"λ₯Ό ν•΄κ²°ν•  수 있기 λ•Œλ¬Έμ— ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인수둜 μ „λ‹¬λ˜μ–΄ 콜백 ν•¨μˆ˜λ‘œ μ‚¬μš©λ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

*콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this 문제 : 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ thisκ°€ μ™ΈλΆ€ ν•¨μˆ˜μ˜ this와 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” 문제

 

// 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this 문제
class Prefixer {
  constructor(prefix) {
    this.prefix = prefix;
  }

  add(arr) {
    // add λ©”μ„œλ“œλŠ” 인수둜 μ „λ‹¬λœ λ°°μ—΄ arr을 μˆœνšŒν•˜λ©° λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œμ— prefixλ₯Ό μΆ”κ°€ν•œλ‹€.
    // β‘ 
    return arr.map(function (item) {
      return this.prefix + item; // β‘‘
      // -> TypeError: Cannot read property 'prefix' of undefined
    });
  }
}

const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));


// ν™”μ‚΄ν‘œ ν•¨μˆ˜λ₯Ό 톡해 ν•΄κ²°
class Prefixer {
  constructor(prefix) {
    this.prefix = prefix;
  }

  add(arr) {
    return arr.map(item => this.prefix + item);
  }
}

const prefixer = new Prefixer('-webkit-');
console.log(prefixer.add(['transition', 'user-select']));
// ['-webkit-transition', '-webkit-user-select']

 

이처럼 ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 this 바인딩을 갖지 μ•ŠκΈ° λ•Œλ¬Έμ— call, apply, bind λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄λ„ ν™”μ‚΄ν‘œ λ‚΄λΆ€μ˜ thisλ₯Ό ꡐ체할 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ©”μ„œλ“œλ₯Ό ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μ •μ˜ν•˜λŠ” 것은 ν”Όν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

super

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 super 바인딩을 갖지 μ•Šμ•„μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ superλ₯Ό μ°Έμ‘°ν•˜λ©΄ this와 λ§ˆμ°¬κ°€μ§€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ˜ 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?

 

arguments

ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체의 arguments 바인딩을 갖지 μ•Šμ•„μ„œ ν™”μ‚΄ν‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ argumentsλ₯Ό μ°Έμ‘°ν•˜λ©΄ this와 λ§ˆμ°¬κ°€μ§€λ‘œ μƒμœ„ μŠ€μ½”ν”„μ˜ 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

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

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

 

function foo(...rest) {
  // λ§€κ°œλ³€μˆ˜ restλŠ” μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ μ „λ‹¬λ°›λŠ” Rest νŒŒλΌλ―Έν„°λ‹€.
  console.log(rest); // [ 1, 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);


// Rest νŒŒλΌλ―Έν„°λŠ” λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°μ—¬μ•Όν•¨
function foo(...rest, param1, param2) { }

foo(1, 2, 3, 4, 5);
// SyntaxError: Rest parameter must be last formal parameter


// Rest νŒŒλΌλ―Έν„°λŠ” 단 ν•˜λ‚˜λ§Œ μ„ μ–Έ κ°€λŠ₯
function foo(...rest1, ...rest2) { }

foo(1, 2, 3, 4, 5);
// SyntaxError: Rest parameter must be last formal parameter


// length ν”„λ‘œνΌν‹°μ— 영ν–₯ X
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
  • 일반 λ§€κ°œλ³€μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯ν•˜λ©° 순차적으둜 λ§€κ°œλ³€μˆ˜μ™€ Rest νŒŒλΌλ―Έν„°μ— 할당됨
  • λ°˜λ“œμ‹œ λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°μ΄μ–΄μ•Ό 함
  • 단 ν•˜λ‚˜λ§Œ μ„ μ–Έ ν•  수 있음
  • ν•¨μˆ˜ μ •μ˜ μ‹œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜ 객체의 length ν”„λ‘œνΌν‹°μ— 영ν–₯을 주지 μ•ŠμŒ

Rest νŒŒλΌλ―Έν„°μ™€ arguments 객체

ES6μ—μ„œλŠ” Rest νŒŒνƒ€λ―Έν„°λ₯Ό ν™œμš©ν•΄ κ°€λ³€ 인자 ν•¨μˆ˜μ˜ 인수 λͺ©λ‘μ„ λ°°μ—΄λ‘œ 직접 전달받을 수 μžˆμ–΄ μœ μ‚¬ λ°°μ—΄ 객체인 arguments 객체λ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

function sum(...args) {
  // Rest νŒŒλΌλ―Έν„° argsμ—λŠ” λ°°μ—΄ [1, 2, 3, 4, 5]κ°€ ν• λ‹Ήλœλ‹€.
  return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2, 3, 4, 5)); // 15

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

ES6μ—μ„œ λ„μž…λœ λ§€κ°œλ³€μˆ˜ 기본값을 μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜ λ‚΄μ—μ„œ μˆ˜ν–‰ν•˜λ˜ 인수 체크 및 μ΄ˆκΈ°ν™”λ₯Ό κ°„μ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

// λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ€ 경우
function sum(x = 0, y = 0) {
  return x + y;
}

console.log(sum(1, 2)); // 3
console.log(sum(1));    // 1


// λ§€κ°œλ³€μˆ˜μ— undefinedλ₯Ό μ „λ‹¬ν•œ 경우
function logName(name = 'Lee') {
  console.log(name);
}

logName();          // Lee
logName(undefined); // Lee
logName(null);      // null


// Rest νŒŒλΌλ―Έν„°μ—λŠ” 기본값을 지정할 수 μ—†μŒ
function foo(...rest = []) {
  console.log(rest);
}
// SyntaxError: Rest parameter may not have a default initializer


// length ν”„λ‘œνΌν‹°μ™€ arguments 객체엔 영ν–₯ X
function sum(x, y = 0) {
  console.log(arguments);
}

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

sum(1);    // Arguments { '0': 1 }
sum(1, 2); // Arguments { '0': 1, '1': 2 }
  • λ§€κ°œλ³€μˆ˜μ— 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ€ κ²½μš°μ™€ undefinedλ₯Ό μ „λ‹¬ν•œ κ²½μš°μ—λ§Œ μœ νš¨ν•¨
  • Rest νŒŒλΌλ―Έν„°μ—λŠ” 기본값을 지정할 수 μ—†μŒ
  • ν•¨μˆ˜ μ •μ˜ μ‹œ μ„ μ–Έν•œ λ§€κ°œλ³€μˆ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜ 객체의 length ν”„λ‘œνΌν‹°μ™€ arguments 객체엔 μ•„λ¬΄λŸ° 영ν–₯이 μ—†μŒ

[좜처] λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive

https://wikibook.co.kr/mjs/

 

λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive: μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리

269개의 κ·Έλ¦Όκ³Ό 원리λ₯Ό νŒŒν—€μΉ˜λŠ” μ„€λͺ…μœΌλ‘œ ‘μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κΈ°λ³Έ κ°œλ…κ³Ό λ™μž‘ 원리’λ₯Ό μ΄ν•΄ν•˜μž! μ›ΉνŽ˜μ΄μ§€μ˜ λ‹¨μˆœν•œ 보쑰 κΈ°λŠ₯을 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ œν•œμ μΈ μš©λ„λ‘œ νƒœμ–΄λ‚œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 과도

wikibook.co.kr