alt
Home Node.js 디자인 패턴 1장 - 2. ES2015(ES6 이후)에서 달라진 점
Post
Cancel

Node.js 디자인 패턴 1장 - 2. ES2015(ES6 이후)에서 달라진 점


var, let, const

var

  • 변수 재선언, 재할당 가능

  • Function scope

    • if문에서 선언하면 block이기 때문에 전역변수
    • 함수 내부라면 블록 밖이라도 참조 가능
  • 함수 내부에서 var로 선언한 것은 함수 내부까지만 hoisting

    • var hoisting 방지를 위해 ‘use strict’(ES2015)


let

  • ES2015에서(이전에는 ES6라고 함) var을 보완하기 위해 나옴
  • block scope
    • 이게 있기 전에는 if문 내부 변수는 밖에서 액세스 가능했다.
  • 재선언 불가, 재할당 가능


const

  • ES2015에서(이전에는 ES6라고 함) var을 보완하기 위해 나옴
  • 기본적으로 const를 지향
  • block scope
  • 재선언 불가, 재할당 불가
    • 상수의 경우 const로 선언
    • 완전 불변 객체를 만들고싶으면 const만으로 충분하지 않다. Object.freeze() or deep-freeze 모듈을 사용해야 한다. -> 객체 속성조차 변경 불가
  • 대문자 상수: const COLOR_RED = "F00";


arrow function

  • 간결하다. -> 직관적

    1
    2
    3
    4
    5
    
    A.map( function cb(element) { 
      return element.length; 
    });
      
    A.map((element) => element.length);
    
  • this의 범위가 어휘 범위(lexical scope)로 바인딩

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // with arrow function
    function Person(){
      this.age = 0;
      
      setInterval(() => {
        this.age++; // this는 person 객체(window)를 참조
      }, 1000);
    }
      
    var p = new Person();
      
    // without arrow function
    setInterval( function cb() {
        this.age++; // 이 경우 this는 undefined. 따라서 this.age도 undefined
    }, 1000);
    


클래스 구문

1
2
3
4
5
6
7
8
9
10
11
12
13
// 기존의 방식
function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.getFullName = function() {
    return this.name + '' + this.surname;
}

Person.older = function(person1, person2) {
    return (person1.age >= person2.age) ? person1 : person2;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ES2015부터의 방식
class Person {
    constructor (name, age) {
        this.name = name;
        this.age = age;
    }
    
    getName() {
        return this.name;
    }
    
    static older (person1, person2) {
        return (person1.age >= person2.age) ? person1 : person2;
    }
}
  • ES2015에서 생겼지만, 여전히 내부적으로는 전통적인 prototype이 사용 됨
    • 런타임에 의해 내부적으로 객체가 관리되는 방식이 달라진 것이 아님
  • 차이점: 기존과는 다르게, super, extends 키워드를 통해 Person 프로토타입을 확장할 수 있다는 점


객체 리터럴

  • 새로운 형태의 getter, setter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const person = {
  name: 'AA',
  get name() {
    return this.name;
  }

  set name(name) {
    this.name = name;
  }

	validate: (): void => {
        //something
    }
}

console.log(person.name)
person.validate()
1
2
3
4
5
module.exports = {
    square(x) {
        return x * x;
    }
}


이 외

  • Map, Set, 콜렉션
  • WeekMap, WeekSet 콜렉션: 객체만을 키로 가질 수 있다. -> 해당 Week collection 내 유일 참조가 남을 경우 GC에 의해 삭제
  • Template 표기법 - 백틱을 통해 변수 삽입


Reference)

Node.js 디자인 패턴

This post is licensed under CC BY 4.0 by the author.