1. 프로퍼티 이름으로 심벌 사용하기
- 이전에는 객체의 프로퍼티 이름으로 식별자나 문자열만 사용할 수 있었으나 6버전부터는 심벌을 프로퍼티 이름으로 사용할 수 있다.
- 심벌은 그 어떤 값과도 다른 유일무이한 값이다. 따라서 함수 안에서 심벌을 생성하여 그것을 속성 이름으로 사용하고 그 프로퍼티에 값을 할당하면 함수 바깥에서 프로퍼티 값을 읽거나 쓸 수 없다.
var obj = {};
var s = Symbol("heart");
obj[s] = 3;
console.log(obj); // { [Symbol(heart)]: 3 }
var obj = {[Symbol("heart")]: "A"};
console.log(obj); // { [Symbol(heart)]: 'A' }
2. 내장 생성자 prototype의 안전한 확장
- 심벌을 사용하면 메소드 이름이 겹치는 겂을 피하면서도 기본 생성자의 prototype을 확장할 수 있다.
- 메소드 이름으로 심벌을 사용하므로 Array.protype에 있는 어떠한 프로퍼티 이름과도 겹치지 않는다.
Array.prototype[Symbol.for("shuffle")] = function() {
var a = this;
var m = a.length, t, i;
while(m) { // m이 0이 되면 멈춘다
i = Math.floor(Math.random()*m--); // m 미만의 인덱스 i를 무작위로 골라서 하나씩 삭제한다
t = a[m]; a[m] = a[i]; a[i] = t; // a[i]와 a[m]을 교환한다
}
return this;
};
var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(array[Symbol.for("shuffle")]()); // [ 1, 8, 2, 6, 0, 9, 7, 3, 4, 5 ]
3. 객체 리터럴에 추가된 기능
a. 계산된 프로퍼티 이름(Computed Property name) : {[계산식] : value}
- 대괄호로 묶인 임의의 계산식이 평가된 값을 프로퍼티 이름으로 사용할 수 있다.
- 평가한 값이 Symbol 타입이면 그대로 사용하고 그렇지 않으면 문자열 타입으로 변환한다.
var prop = "name", i=1;
var obj = {[prop + i]:"Tom"};
console.log(obj); // { name1: 'Tom' }
var obj = {[Symbol("heart")]: "A"};
console.log(obj); // { [Symbol(heart)]: 'A' }
b. 프로퍼티 정의의 약식 표기 : {prop}
- 변수 prop가 선언되어 있을 때 {prop}를 {prop:prop}로 사용할 수 있다.
var prop = 2;
var obj = {prop};
console.log(obj); // { prop: 2 }
console.log(obj.prop) // 2
c. 메서드의 정의의 약식 표기 : { method() {} }
- 프로퍼티 값으로 함수를 지정할 때 사용하는 약식 표기법이 추가되었다.
- 기존 형식
var person1 = {
name: "Tom",
sayHello: function(){
console.log("Hello! " + this.name);
}
};
- 약식 표기
var person = {
name: "Tom",
sayHello() { console.log("Hello! " + this.name); }
};
person.sayHello(); // Hello! Tom
d. 제너레이터 정의의 약식 표기 : { *generator() {} }
- 프로퍼티의 값이 제너레이터 함수일 때 사용할 수 있는 약식 표기
var obj = {
*range(n) {
for(var i=0; i<n; i++){
yield i;
}
}
};
var it = obj.range(10);
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2