객체는 다양한 타입의 값을 하나의 단위로 구성한 복합적인 구조로, 원시값을 제외한 나머지 값을 의미한다.
자바스크립트는 객체 기반의 프로그래밍 언어이며, 자바스크립트를 구성하는 거의 모든것이 객체이다.
객체는 다양한 타입의 값을 하나의 단위로 구성한 복합적인 구조이다.
const counter = {
num: 0, // 프로퍼티 (키: 값)
increase: function () { // 메서드 (키: 값-함수)
this.num++;
}
};
원시값 : 객체가 아니면서 메서드도 가지지 않는 데이터로, 7가지가 있다. (string, number (en-US), * bigint (en-US), boolean, undefined, symbol, null)
Bigint : Number 원시값 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체
프로퍼티 : 객체의 상태를 나타내는 값(data)
메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작
자바스크립트는 프로토타입 기반 객체지향 언어로, 클래스 기반 객체 지향과는 달리 다양한 객체 생성 방법을 지원한다.
위 방법중 가장 일반적이고 간단한 방법은 객체 리터럴을 사용하는 방법 이다.
// 객체 리터럴 예시
const person = {};
클래스 기반 객체 지향 : C++, Java언어가 해당된다.
new CalssName형태로 인스턴스를 생성한다.
인스턴스 : 클래스에 의해 생성되어 메모리에 저장된 실체이다.
클래스 : 인스턴스를 생성하기 위한 템플릿의 역할을 한다.
객체는 프로퍼티의 집합이며, 프러퍼티는 키와 값으로 구성된다.
프로퍼티의 특징을 살펴보자
프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할을 한다.
반드시 식별자 네이밍 규칙을 따라야 하는것은 아니지만, 따르지 않는경우 반드시 따옴표를 사용해야 한다.
const person = {
firstName: 'hye-won',
'last-name': 'ji'
};
console.log(person); // {firstName: 'hye-won', last-name: 'ji'}
프로퍼티 키에 문자열이나 심벌 값 이외의 값을 사용하면 문자열이된다.(압묵적 타입 변환)
const numbers = {
0: 1,
1: 2
};
console.log(numbers); // {0: 1, 1: 2}
이미 존재하는 프로퍼티 키를 중복선언하면, overwrite되며 에러 발생하지 않는다.
const person = {
name: 'hyewon',
name: 'hyewon'
};
console.log(person); // { name: 'hyewon' }
프로퍼티 접근 방법과 특징을 소개한다.
const person = {
name: 'hyewon',
};
// 마침표 표기법에 의한 프로퍼티 접근
console.log(person.name);
// 대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']);
대괄호 표기법을 사용할때, 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 한다.
const person = {
name: 'hyewon',
};
// 마침표 표기법에 의한 프로퍼티 접근
console.log(person[name]); // ReferenceError: name is not defined
객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환하며 에러가 발생하지 않는다.
const person = {
name: 'hyewon',
};
console.log(person.age); // undefined
프로퍼티 키가 식별자 네이밍 규칙을 준수하지 않는경우, 반드시 대괄호 표기법으로 접근해야 한다.
단, 프로퍼티 키가 숫자로만 이루어졌다면 프로퍼티 접근시 따옴표를 생락할 수 있다.
const person = {
'first-name': 'hyewon',
1: 10
};
person.'first-name'; // SyntaxError: Unexpected string
person.first-name; // 브라우저환경: NaN (window.name이 존재하기 때문)
// Node.js 환경: ReferenceError: name is not definded
person[first-name]; // ReferenceError: last is not definded
person['first-name']; // hyewon
person.1; // SyntaxError: Unexpected number
person.'1'; // SyntaxError: Unexpected string
person[1]; // 10
person['1']; // 10
프로퍼티 값을 다루는 방법을 소개한다.
프로퍼티 값 갱신
이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신된다.
const person = {
name: 'hyewon',
};
person.name = 'grass';
console.log(person); // { name: 'grass' }
프로퍼티 동적 생성
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적 생성 및 추가되고 값이 할당된다.
const person = {
name: 'hyewon',
};
person.age = 20;
console.log(person); // { name: 'hyewon', age: 20 }
프로퍼티 삭제
delete연산자로 객체의 프로퍼티를 삭제한다. 이때 존재하지 않는 프로퍼티 삭제하면 에러 없이 무시된다.
const person = {
name: 'hyewon',
age: 20
};
delete person.age;
delete person.address;
console.log(person); // { name: 'hyewon' }
ES6에서 추가된 객체 리터럴의 확장기능을 소개한다.
프로퍼티 축약 표현
프로퍼티 값으로 변수를 사용하는경우, 변수 이름과 프로퍼티 키가 동일하면 프로퍼티 키를 생략할 수 있다.
const x = 1;
const y = 2;
const obj = { x, y };
console.log(obj); // { x: 1, y: 2 }
메서드 축약 표현
메서드를 정의할때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
const person = {
name: 'hyewon',
sayHi() {
console.log('Hi' + this.name);
}
};
person.sayHi(); // Hi hyewon
축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작한다. 책 26.2절 '메서드'에서 살펴볼 예정이다.
3. 계산된 프로퍼티 이름
계산된 프로퍼티 이름으로 프로퍼티 키를 동적생성 하려면
ES5는 객체 리터럴 외부에서 생성해야 했지만
ES6에서는 객체 리터럴 내부에서도 생성이 가능하다.
```jsx
const prefix = 'prop';
let i = 0;
const obj = {
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
};
console.log(obj); // { props-1: 1, props-2: 2, props-3: 3 }