자바스크립트를 구성하는 원시 값을 제외한 함수,배열,정규표현식 값은 객체다.
원시 타입은 하나의 값만 나타내지만 객체 타입은 다양한 값(원시 값 또는 다른 객체)을 하나의 단위로 구성한 복합적인 자료구조다.
또한 원시 값은 변경 불가능한 값이지만 객체는 변경 가능한 값이다.
객체는 0개 이상의 프로퍼티로 구성된 집합이며 프로퍼티는 키와 값으로 구성된다.
객체 | |||
프로퍼티 | 프로퍼티 | ||
프로퍼티키 | 프로퍼티값 | 프로퍼티 키 | 프로퍼티 값 |
const counter{
num:0, //프로퍼티 키/값
increase: function(){ //메서드
this.num++
}
};
const saram = {
firstname : "Kim" // 네이밍 규칙을 준수
"last-name" : "Myungseong" // 네이밍 규칙을 미준수
}
다음과 같이 값을 찾아낼 수도 있다
1. saram["firstname"] // output : "Kim"
2. const 아무거나 = "firstname"
saram[아무거나] // outfut : "Kim"
마침표 프로퍼티 접근 연산자( . )를 사용하는 마침표 표기법
대괄호 프로퍼티 접근 연산자[ ]를 사용하는 대괄호 표기법.
사용할 때에는 반드시 따옴표로 감싼 문자열이 와야 한다.
객체에 존재하지 않는 프로퍼티에 접근하면 에러가 아닌 undefined를 반환한다.
const saram = {
name: "kim Myungseong"
}
saram.age = 20 // 객체 saram에 age: 20이 추가 된다.
const saram = {
name: "Kim Myungseong"
age: 20
delete saram.name // name이 있으므로 삭제한다
delete job // job이 없으므로 삭제할 수 없지만, 에러는 발생하지 않는다.
자바스크립트의 객체는 함수와 밀접한 관계를 갖는다.
함수로 객체를 생성하기도 하며, 함수 자체가 객체이기도 하다.
자바스크립트에서 함수와 객체는 분리해서 생각할 수 없는 개념이기에 객체와 함수에 대해 정확히 이해할 수 있어야 한다.
자바스크립트의 함수는 일급객체다 따라서 함수는 값으로 취급할 수 있기에 프로퍼티 값으로 사용할 수 있다.
프로퍼티 값이 함수일 경우 함수와 구분하기 위해 메서드라 부른다.
const circle = {
radius: 5,
getDiameter: function() {
return 2 * this.radius;
}
};
console.log(circle.getDiameter()); // 10
이중에서 가장 일반적이고 간단한 방법은 객체 리터럴을 사용하는 방법이다.
리터럴이란?
사람이 이해할 수 있는 문자, 약속된 기호를 사용하여 값을 생성하는 표기법.
객체 리터럴 - 사람이 이해할수 있는 문자와 기호를 사용하여 객체를 생성하는것.
const literal = {}; //객체 생성
ES5
let x = 1, y = 2;
let obj = {
x: x,
y: y
};
console.log(obj) // output {x: 1, y:2}
ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략(property shothand)할 수 있다. 이때 프로퍼티 키는 변수 이름으로 생성된다.
ES6
let x = 1, y = 2;
const obj = { x ,y };
console.log(obj) // { x: 1, y: 2}
ES6에서는 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성할 수 있다.
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}
ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
const obj = {
name: 'Kim',
SayHi(){
console.log('Hi' + this.name);
}
};
obj.sayHi(); // output: Hi Kim
ES6의 메서드 축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작한다.