https://ko.javascript.info/object-basics
객체 리터럴
이라고 한다.delete user.age;
let user = {
name: "John",
age: 30,
"likes birds": true // 복수의 단어는 따옴표로 묶어야 합니다.
};
let user = {
name: "John",
age: 30,
}
유효한 변수 식별자
인 경우에만 사용할 수 있다.유효한 변수 식별자
가 아닌 경우엔 대괄호 표기법
을 사용해야한다.let user = {
name: "John",
age: 30
};
let key = prompt("사용자의 어떤 정보를 얻고 싶으신가요?", "name");
// 변수로 접근
alert( user[key] ); // John (프롬프트 창에 "name"을 입력한 경우)
계산된 프로퍼티
라고 부른다.let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
let bag = {
[fruit]: 5, // 변수 fruit에서 프로퍼티 이름을 동적으로 받아 옵니다.
};
alert( bag.apple ); // fruit에 "apple"이 할당되었다면, 5가 출력됩니다.
=== undefined
를 사용해서 확인할 수 있다.in 연산자
를 사용해서 프로퍼티 존재 여부를 확인할 수 있다.for...in
반복문을 사용하면 객체의 모든 키를 순회할 수 있다.let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
// permissions1과 permissions2의 프로퍼티를 user로 복사합니다.
Object.assign(user, permissions1, permissions2);
// now user = { name: "John", canView: true, canEdit: true }
도달 가능성
이라는 개념을 사용해 메모리 관리를 한다.mark-and-swap
알고리즘루트 정보를 수집
하고 이것을 mark
한다.mark
한다.mark
된 모든 객체들에 방문하고 그 객체들이 참조하는 객체도 mark
한다.mark
되지 않은 객체를 메모리에서 삭제한다.자바스크립트의 this는 런타임에 결정이 된다. 컨텍스트에 따라 달라진다. 동일한 함수라도 다른 객체에서 호출했다면 this가 참조하는 값이 달라진다.
new User(...)
를 써서 함수를 실행하면 다음과 같은 알고리즘이 동작한다.function User(name) {
// this = {}; (빈 객체가 암시적으로 만들어짐)
// 새로운 프로퍼티를 this에 추가함
this.name = name;
this.isAdmin = false;
// return this; (this가 암시적으로 반환됨)
}
첫 글자를 대문자
로 작성한다.new.target
을 이용해서 함수가 new와 함께 실행되었는지 알 수 있다.function User() {
alert(new.target);
}
// "new" 없이 호출함
User(); // undefined
//"new"를 붙여 호출함
new User(); // function User { ... }
자바스크립트는 객체 프로퍼티 키로 문자열과 심볼형만을 허용한다.
심볼은 유일한 식별자를 만들고 싶을 때 사용한다. 심볼을 만들 때 심볼 이름이라 불리는 설명을 붙일 수도 있다.
심볼을 이용해서 숨김 프로퍼티를 만들 수 있다. 숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 덮어쓸 수 없는 프로퍼티이다.
let user = { // 서드파티 코드에서 가져온 객체
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있습니다.
키가 심볼인 프로퍼티는 for..in
반복문에서 배제된다.
심볼은 이름이 같더라도 모두 별개로 취급된다. 그런데 이름이 같은 심볼이 같은 객체를 가리키기를 원하는 경우도 있는데 전역 심볼 레지스트리
는 이러한 경우를 위해서 만들어졌다.
레지스트리 안에 있는 심볼을 읽거나 새로운 심볼을 생성하려면 Symbol.for(key)
를 사용한다.
// 전역 레지스트리에서 심볼을 읽습니다.
let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만듭니다.
// 동일한 이름을 이용해 심볼을 다시 읽습니다(좀 더 멀리 떨어진 코드에서도 가능합니다).
let idAgain = Symbol.for("id");
// 두 심볼은 같습니다.
alert( id === idAgain ); // true
변수 명을 사용해서 전역 심볼 레지스트리의 이름을 얻으려면 Symbol.keyFor(sym)
을 사용한다.
객체끼리 더하는 연산이나 빼는 연산을 하면 자동 형 변환이 일어난다.
특수 객체 메서드를 사용하면 숫자형이나 문자형으로의 형변환을 원하는대로 조절할 수 있다.
객체의 형 변환은 세 종류로 구분되는데 hint 값이 기준이 된다.
자바스크립트는 형 변환이 필요할 때 Symbol.toPrimitive
메서드가 있는지 찾고, 있다면 메서드를 호출한다.
hint가 string이라면 obj.toString() 호출, 없다면 obj.valueOf() 실행
hint가 number라면 obj.valueOf() 실행, 없다면 obj.toString() 호출
자바스크립트에는 Symbol.toPrimitive
라는 내장 심볼이 존재한다. 이 시미볼은 목표하는 자료형(hint)를 명명하는데 사용된다.
let user = {
name: "John",
money: 1000,
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
};
// 데모:
alert(user); // hint: string -> {name: "John"}
alert(+user); // hint: number -> 1000
alert(user + 500); // hint: default -> 1500