⛅️ 객체란?
- 객체 타입: 다양한 타입의 값(원시값, 또 다른 객체)을 하나의 단위로 구성한 것
- 원시타입 = 변경 불가능한 값, 객체타입 = 변경 가능한 값
- 프로퍼티는 키와 값으로 구성됨
- 함수도 프로퍼티로 사용 가능(자바스크립트의 함수는 일급 객체 이기때문)
- 프로퍼티와 메서드로 구성된 집합체
❓일급 객체
- 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
- 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다. 즉, 값으로 사용 가능하다.
❓일급객체의 조건
- 변수에 할당(assignment)할 수 있다.
- 다른 함수를 인자(argument)로 전달 받는다.
- 다른 함수의 결과로서 리턴될 수 있다.
⛅️ 객체리터럴을 통한 객체 생성 방법
- 중괄호 (
{...}
) 내에 0개 이상의 프로퍼티를 정의 - 변수에 할당되는 시점에 자바스크립트 엔진이 객체 리터럴을 해석하고 객체를 생성함
- 객체 리터럴은 값으로 평가되는 표현식 => 닫는 중괄호 뒤에는 세미콜론 를 붙여야함
var donggyun = {
hobby: 'coding',
age: 25,
introduce: function () {
console.log(`hello my hobby is ${this.hobby}`);
},
};
console.log(typeof donggyun); // object
console.log(donggyun); // {hobby:'coding', age:25, introduce:f}
- 이외의 객체 생성 방법
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스
⛅️ 프로퍼티
- 객체는 프로퍼티의 집합
- 프로퍼티는 키와 값으로 구성
- 프로퍼티를 나열할때는 쉼표(,)로 구분
- 식별자 네이밍 규칙을 따르지 않는 이름에는 따옴표 사용해야 함
var person = {
// 프로퍼티 키 = name
// 프로퍼티 값 = 'donggyun'
name: 'donggyun',
};
- 프로퍼티 키 동적 생성 예제
var obj = {};
var key = 'hello';
// 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어야 함
obj[key] = 'world';
console.log(obj); // {hello: 'world'}
- 프로퍼티 키 중복 선언
var me = { name: 'dong', name: 'gyun' };
// 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다
// 에러 발생 X
console.log(me); // {name:'gyun'}
메서드
- 함수는 일급 객체 이기때문에 함수는 값으로 취급할 수 있다.
- 따라서 함수는 프로퍼티의 값으로 사용 가능
- 메서드는 객체에 묶여있는 함수를 의미함.
var circle = {
// 프로퍼티
radius: 5;
// 메서드
getDiameter = functuon() {
return 2 * this.radius;
}
};
console.log(circle.getDiameter()); // 10
⛅️ 프로퍼티 접근 방법
- 마침표 표기법: 접근 연산자(
.
) 를 사용 - 대괄호 표기법: 대괄호 프로퍼티(
[...]
) 사용
(프로퍼티가 네이밍 규칙을 준수한다면 위의 접근 방법 모두 사용 가능)
var person = { name: 'donggyun' };
console.log(person.name); // 'donggyun'
// 대괄호 표기법 내의 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함!!
// 따옴표로 감싸지 않으면 자바스크립트 엔진은 변수와같은 식별자로 해석함
console.log(person['name']); // 'donggyun'
console.log(person[name]); // ReferenceError
// 객체에 존재하지 않는 프로퍼티는 undefeind를 반환
// 에러 X
console.log(person.age); // undefined
- Node.js 환경과 브라우저 환경의 객체 접근 차이점
- 아래의 예제에서 person.last-name 을 평가할때 person.last를 먼저 평가하여
person.undefined-name 이 된다. - 브라우저 환경에서는 name이라는 전역변수(window의 프로퍼티)가 암묵적으로 존재하기 때문에
person.last-name
=>person.undefined-''
와 같게되므로NaN
가 된다. - Node.js 환경에서는 name 이라는 식별자가 없기때문에 ReferenceError 가 된다.
- 아래의 예제에서 person.last-name 을 평가할때 person.last를 먼저 평가하여
var person = {
'last-name'L 'donggyun',
1:10
};
person.'last-name'; // SyntaxError
person.last-name; // 브라우저 환경: NaN
// Node.js 환경: ReferenceError
person[last-name]; // ReferenceError
person['last-name']; // Lee
person.1; // SyntaxError
person.'1' // SyntaxError
person[1]; // 10
person['1']; // 10
⛅️ 프로퍼티 동적 생성, 프로퍼티 삭제
var person = {
name: 'donggyun',
};
// 없는 프로퍼티에 값을 할당했을때 프로퍼티가 동적으로 생성되고 값이 할당된다.
person.age = 25;
console.log(person); // {name:'donggyun', age:25}
// 존재하는 프로퍼티를 삭제할 수 있다.
// 존재하지 않는 프로퍼티를 삭제했을때는 아무일도 안일어난다. 에러 X
delete person.age;
delete person.hobby;
console.log(person); // {name:'donggyun'}
⛅️ ES6에서 추가된 객체 리터럴의 확장 기능
- 프로퍼티 축약 표현
- 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 키가 동일한 이름일때 프로퍼티 키를 생략할 수 있다.
- 프로퍼티 키는 변수 이름으로 자동 생성
var x = 1,
y = 2;
var obj = { x, y };
console.log(obj); // {x:1, y:2}
- 계산된 프로퍼티 이름
- 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해서 프로퍼티 키를 동적으로 생성 가능
- 프로퍼티 키로 사용될 표현식을 대괄호(
[...]
)로 묶어야 함.
const s = 'hello';
let idx = 0;
const obj = {
[`${s}-${++idx}`]: idx,
[`${s}-${++idx}`]: idx,
[`${s}-${++idx}`]: idx,
};
console.log(obj); //{hello-1: 1, hello-2:2, hello-3:3}
- 메서드 축약 표현
- 메서드를 정의할 때 function 키워드를 생략 가능
- 축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작하는데 이는 26장에서 살펴볼 내용
const obj = {
intoruce() {
console.log('hello world!!');
},
};
obj.introduce(); // hello world!!
📚 REFERENCE
- 모던 자바스크립트 Deep Dive 10장 객체 리터럴
'FE > Javascript' 카테고리의 다른 글
12. 모던 자바스크립트 Deep Dive(함수) (1) | 2024.12.07 |
---|---|
11. 모던 자바스크립트 Deep Dive(원시 값과 객체의 비교) (0) | 2024.12.06 |
09. 모던 자바스크립트 Deep Dive (타입 변환과 단축 평가) (0) | 2024.12.03 |
정규식 예제 (2) | 2024.11.20 |
31. 모던 자바스크립트 Deep Dive (RegExp) (2) | 2024.11.19 |