자바스크립트는 객체 기반의 언어이다.
객체란, 다양한 타입의 값을 하나의 단위로 구성한 자료구조다. 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있으며, 함수도 프로퍼티 값으로 사용할 수 있다.
프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 "메서드"라 한다.
즉, 객체는 프로퍼티와 메서드로 구성된 집합체이다.
var counter = {
num: 0; // 프로퍼티: 객체의 상태를 나타내는 값
increase: function() { // 메서드: 프로퍼티를 참조하고 조작할 수 있는 동작
this.num++;
}
}
자바스크립트는 프로토타입 기반 객체지향 언어
로서 다양한 객체 생성 방법을 지원한다.
객체 리터럴
은 중괄호 내에 0개 이상의 프로퍼티를 정의하며, 자바스크립트의 유연함과 강력함을 대표하는 객체 생성 방식이다.객체는 프로퍼티의 집합이며, 프로퍼티
는 키와 값으로 구성된다. 프로퍼티를 나열할 때는 쉼표로 구분한다.
메서드
는 객체에 묶여 있는 함수이다.
키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할을 한다. 식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표를 사용해야 한다.
var person = {
firstName: 'So-Yeon',
'last-name': 'Lee',
};
프로퍼티 키를 동적으로 생성할 수도 있다. 이 경우에는 프로퍼티 키로 사용할 표현식을 대괄호로 묶어야 한다.
var obj = {};
var key = 'hello';
obj[key] = 'world';
console.log(obj); // {hello: 'world'}
프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다.
var foo = {
0: 1,
1: 2,
2: 3,
};
console.log(foo); // {0: 1, 1: 2, 2: 3}
이미 존재하는 키에 프로퍼티 키를 중복하면 나중에 선언한 프로퍼티가 덮어쓴다.
var foo = {
name: 'Lee',
name: 'Kim',
};
console.log(foo); // {name: 'Kim'}
var person = {
name: 'Lee',
};
console.log(person.name); // Lee
console.log(person['name']); // Lee
console.log(person[name]); // ReferenceError: name is not defined
console.log(person.age); // undefined
마침표 표기법
대괄호 표기법
var person = {
'last-name': 'Lee',
1: 10,
};
person.'last-name'; // SyntaxError: Unexpected string
person.last-name; // 브라우저 환경 -> NaN
// Node.js 환경 -> ReferenceError: name is not defined
person.[last-name]; // ReferenceError: last is not defined
person.['last-name']; // Lee
person.1; // SyntaxError: Unexpected number
person.'1'; // SyntaxError: Unexpected string
person.[1]; // 10
person.['1']; // 10
✏️ person.last-name
의 동작이 환경에 따라 다른 이유는?
Node.js
person.last
를 먼저 평가하기 때문에 person.last는 undefined
으로 평가된다.person.last-name
은 undefined-name
과 같다.name
이라는 식별자 선언이 없으므로 ReferenceError: name is not defined
에러가 발생한다.브라우저
name
이라는 전역 변수가 암묵적으로 존재한다. name은 창의 이름을 가리키며, 기본값은 빈 문자열이다.person.last-name
은 undefined-''
과 같으므로 NaN
이 된다.var person = {
name: 'Lee',
};
person.name = 'Kim';
console.log(person); // {name: 'Kim'}
var person = {
name: 'Lee',
};
person.age = 20;
console.log(person); // {name: 'Lee', age: 20}
var person = {
name: 'Lee',
};
person.age = 20;
delete person.age;
delete person.address; // 존재하지 않는 프로퍼티를 삭제하면, 에러 없이 무시된다
console.log(person); // {name: 'Lee'}
변수 이름과 프로퍼티 키가 동일한 이름이면, 프로퍼티 키를 생략할 수 있다.
let x = 1, y = 2;
const obj = { x, y };
console.log(obj); // {x: 1, y: 2}
프로퍼티 키를 동적으로 생성할 수 있다.
const prefix = 'prop';
let i = 0;
const obj = {
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
[`${prefix}-${++i}`]: i,
};
console.log(obj); // {prop-1: 1, prop-2: 2, prop-3: 3}
메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
const obj = {
name: 'Lee',
sayHi() {
console.log('Hi! ' + this.name);
},
};
obj.sayHi(); // Hi! Lee