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()
ordeep-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 디자인 패턴