3장. 객체
3.1 구문
- 객체는 리터럴 또는 생성자로 정의 가능
var obj = { key: 1 };
var obj2 = new Object();
obj2.key = 1;
3.2 타입
- 7가지 원시 타입: null, undefined, boolean, number, string, object, symbol
- null은 typeof 시 object가 반환되지만 실제 객체는 아님
- 객체 래퍼: String, Number 등
var str = 'string';
typeof str; // string
str instanceof String; // false
var objStr = new String('string');
typeof objStr; // object
objStr instanceof String; // true
3.3 내용
.,[]로 접근- 프로퍼티 키는 문자열로 변환됨
- 계산된 프로퍼티명 사용 가능 (
[key]) - 심볼도 키로 사용 가능
프로퍼티 vs 메소드
function foo() { console.log("foo"); }
var obj = {
fooMethod: foo
};
→ 메서드라기보다 "함수를 값으로 가진 프로퍼티"
배열도 객체
var arr = ['', '', ''];
arr[3] = 'baz';
arr.length; // 4
→ 객체처럼 프로퍼티 추가 가능하지만 권장되지 않음
객체 복사
var newObj = Object.assign({}, myObject);
- 얕은 복사
- 참조 유지됨
- JSON 방식은 깊은 복사처럼 보이지만 한계 존재
프로퍼티 서술자
Object.defineProperty(obj, "a", {
value: 2,
writable: false,
configurable: false,
enumerable: true
});
불변성
Object.preventExtensions,Object.seal,Object.freeze
Object.freeze(obj);
[[Get]], [[Put]], Getter / Setter
var obj = {
get a() { return this._a_; },
set a(val) { this._a_ = val * 2; }
};
obj.a = 2;
console.log(obj.a); // 4
존재 확인
"a" in obj;
obj.hasOwnProperty("a");
obj.propertyIsEnumerable("a");
열거
for (var key in obj) {
console.log(key, obj[key]);
}
Object.keys(obj); // enumerable keys
Object.getOwnPropertyNames(obj); // all keys
3.4 순회
for,forEach,every,some,for...of- 배열은 iterator (
Symbol.iterator) 내장
const it = arr[Symbol.iterator]();
it.next(); // { value, done }
- 객체는 직접 iterator 구현 필요
3.5 정리
- 객체는 리터럴, 생성자 두 방식으로 정의
- 모든 것이 객체는 아니다
- 복사, 불변성, 열거, 순회 방식은 명확히 구분 필요