본문으로 건너뛰기

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 정리

  • 객체는 리터럴, 생성자 두 방식으로 정의
  • 모든 것이 객체는 아니다
  • 복사, 불변성, 열거, 순회 방식은 명확히 구분 필요