객체 프로퍼티 키는 문자열타입과 심볼타입의 값만 사용할 수 있도록 규정되어 있다.
let user = {
'name':'lee',
}
let user ={
name:'lee', // name 이것도 문자열이다.
}
let name = Symbol('name');
let ag = 'ag';
let user = {
[name]:'lee', // computed property
[ag+'e']:34,
};
console.log( user[name] );
console.log( user[age] );
user객체선언시 사용된 키값 'name'와 name 둘다 사용이 가능하다.
이것은 분명히 언어규칙에 어긋나는것 같다.
키값에 문자열타입과 심벌타입만 가능하다고 했으니 'name'만 허용해야 할것같은데 name도 허용한다.
더구나 따옴표없는 name은 식별자로 이미 선언된 name이라는 변수를 의미하는것이 될수 있기때문에 혼동을 유발할 수 있다.
여하튼 키값은 따옴표가 없어도 문자열임을 유의해야 한다.
숫자도 키값으로 사용된것처럼 보이지만 내부적으로 문자열로 형변환되어 저장된다.
let user ={
name:'lee',
1:'your'
}
user[0] = 'my';
console.log( user[0],user[1] ); // my, your
위 코드로보면 분명히 숫자형 값이 객체의 키값으로 사용되고 있으며 프로퍼티에 접근할때도 숫자형 값을 사용하고 있다.
사용자입장에서는 숫자를 키값으로 사용할 수 있다고 생각할 수 있다.
console.log( user['0'] ); // my
만약 숫자가 키값으로 저장되었다면 위 코드는 undefined가 나와야 한다. 그러나 정상적으로 접근이 된다.
사용자가 사용하는 숫자는 내부적으로 문자열로 형변환되어 저장되고 접근할때도 마찬가지로 숫자를 키로 사용해도 문자열로 변환하여 접근하고 결과를 반환한다.
let user = {
name:'lee',
}
let user1 = {
user:3,
}
위 코드를 보고 혹시라도 user키값이 위에 정의한 객체 user라고 오인해서는 안된다.
let user = {
name:'lee',
}
let user1 = {
[user]:3, // computed property
}
console.log( user1['[object Object]'] );
키값유형에 문자열과 심볼형만 사용가능하다고 했는데 위와 같이 억지로 객체를 쓰면 어떻게 될까? 자바스크립트는 문자열로 변환해서 저장한다고했으니 user객체를 문자열로 변환할것이다.
user.toString(); 하면 [object Object] 문자열이된다.
위와같이 접근이 가능하지만 이것은 또다른 객체를 키값으로 사용하고자 한다면 키값이 중복되어 값도 덮어쓸것이다.
let user = { // 서드파티 코드에서 가져온 객체
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있습니다.
Symbol("id")은 유니크한 심볼형값을 생성하고 id변수는 심볼형값을 참조한다. 서드파티객체에 중복되지않는 프로퍼티가 필요할 경우 심벌형을 사용하면 된다.
시스템심볼
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.iterator
Symbol.toPrimitive
객체에 시스템심볼값을 키값으로하는 프로퍼티를 등록하여 고유기능을 추가한다.