JavaScript ES6 정리 - computed property, property enumeration order
이번 포스팅에서는 ES6에서 향상된 객체의 기능(computed property, property enumeration order)에 대해 알아보자!
computed property
한글로는 계산된 프로퍼티 명이라고 하는데 이름을 기억할 필요는 없다.
obj.'a b' = 'A B' 와 같은 할당은 될까?
물론 되지 않는다. .를 찍은 후 문자열은 올 수 없다.
위 방식은 obj['a b'] = 'A B' 이렇게 해결할 수 있다.
그럼 아래 예제는 어떻게 될까?
computed property 사용 전
var className = ' Class';
var obj = {
'A' + className : 'A급'
}
/*
Result
Error
*/
뭔가 될 것도 같긴 한데 역시 Error를 출력하며 되지 않는다.
위와 같이 프로퍼티를 할당하고 싶다면 어떻게 해야 할까?
computed property 사용 후
const className = ' Class';
const obj = {
['A' + className] : 'A급'
}
obj['B' + className] = 'B급'; //대괄호 표기법
console.log(obj);
/*
Result
{ 'A Class': 'A급', 'B Class': 'B급' }
*/
기존의 대괄호 표기법은 객체가 선언된 후 나중에 프로퍼티를 추가할 때 사용했다.
하지만, ES6에서는 computed property를 사용하여 위와 같이 객체를 선언하는 순간에도 변수를 활용하여 프로퍼티를 할당할 수 있다.
아래 예제는 클로저를 활용한 예제인데 이런 방법도 있다는 정도로만 확인해보자!
const cnt = (function (c) {
return function() {
return c++;
}
})(0)
const obj = {
[`a_${cnt()}`]: cnt(),
[`a_${cnt()}`]: cnt(),
[`a_${cnt()}`]: cnt(),
}
console.log(obj);
/*
Result
{ a_0: 1, a_2: 3, a_4: 5 }
*/
property enumeration order
const obj = {
c: 1,
2: 2,
a: 3,
0: 4,
b: 5,
1: 6
}
const keys =[];
for (const key in obj) {
keys.push(key);
}
console.log(keys);
/*
Result
[ '0', '1', '2', 'c', 'a', 'b' ]
*/
위 코드의 출력 결과를 보자!
숫자는 작은 순서대로, 문자는 들어간 순서대로 출력됨을 확인할 수 있다.
이를 고정된 프로퍼티 열거 순서(property enumeration order)라고 한다.
계속해서 다음 예제를 보자!
const obj ={
[Symbol('2')] : true,
'02': true,
'10': true,
'01': true,
'2': true,
[Symbol('1')] : true,
}
const keys = [];
for(const key in obj) {
keys.push(key);
}
console.log(keys);
/*
Result
[ '2', '10', '02', '01' ]
*/
위 코드의 출력 결과는 무언가 예상과는 다르다. (Symbol은 나중에 자세히 다루고 지금은 대부분 열거 대상에서 제외된다는 점만 알아두자)
※ Reflect.ownKeys(target)로 Symbol을 출력 가능
숫자는 작은 순서대로, 문자는 들어간 순서대로 출력될 줄 알았는데 뭘까?
자바스크립트에는 아래와 같은 규칙이 있는데 이를 보고 위 코드의 출력 결과를 다시 고민해보자.
- number로 이루어진 문자열이면서 첫 글자가 0 이 아닌 경우는 숫자로 인식한다.
위 규칙으로 02, 01은 문자열, 10,2는 숫자로 인식됨을 알 수 있다.
그 결과, [ '2', '10', '02', '01' ]이 출력됨을 알 수 있다!
※ 객체를 프로그램에서 사용할 경우, 객체의 열거 순서가 다를 때 생기는 문제를 막기 위해 순서를 고정한다고 이해하자!
마지막으로 아래의 ES6 이전 문법에서는 열거 순서를 보장하지 않으니 알아두자.
- Object.keys()
- for in
- JSON.stringify()
본 포스팅은 인프런 강의 Javascript ES6+ 제대로 알아보기를 공부하며 정리한 포스팅입니다!