원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)
0개 이상의 프로퍼티로 구성된 집합
property : key, value로 구성
method : 프로퍼티 값이 함수인 경우
생성방법
객체 리터럴 생성
프로퍼티 : 객체의 상태를 나타내는 값(data)으로 키-값 쌍으로 구성
메서드 : 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior), 객체 안에 정의된 함수
var student = {
// 프로퍼티
name : '유관순',
age : 16,
// 메서드
getInfo : function() {
return `${this.name}(은)는 ${this.age}세 입니다.`;
}
};
var student2 = {};
프로퍼티 사용 시 주의사항, 특수한 상황
프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
프로퍼티 값 : 자바스크립트에서 사용할 수 있는 모든 값
var obj = {
normal : 'normal value',
'@ s p a c e @' : 'space value', //특수문자 사용시에는 '' 사용
'' : '', //빈 문자열 키는 오류 발생하지 않지만 권장하지 않음
0 : 1, //숫자 키는 내부적으로 문자열로 변환
var : 'var', //예약어 키는 오류 발생하지 않지만 권장하지 않음
normal : 'new value' //이미 존재하는 키를 중복 선언하면 나중에 선언한 프로퍼티로 덮어씀
};
메소드 : 객체 내부에 정의 된 함수
자바스크립트의 함수는 객체이다.
함수는 값으로 취급할 수 있고 프로퍼티 값으로도 사용할 수 있다.
var dog = {
name : '뽀삐',
// 메소드 - 객체 내부에 정의 된 함수
eat : function(food) {
console.log(`${this.name}(은)는 ${food}를 맛있게 먹어요.`);
}
};
//호출하는 방법
dog.eat('고구마');
1. 마침표 표기법(dot notation)
console.log(dog.name);
dog.eat('고구마');
2. 대괄호 표기법(square bracket notation)
프로퍼티 키는 반드시 따옴표로 감싼 문자열을 사용한다.
console.log(dog['name']);
//console.log(dog[name]); - 프로퍼티 키는 반드시 따옴표로 감싼 문자열을 사용한다.
dog['eat']('고구마');
var obj = {
'dash-key' : 'dash-value',
0 : 1
};
마침표 표기법이 간편하지만 사용할 수 없는 경우
(프로퍼티 키가 식별자 네이밍 규칙을 준수하지 않는 이름일 경우)
대괄호 표기법을 사용한다.
마침표 표기법을 사용할 수 없는 경우
var obj = {
'dash-key' : 'dash-value',
0 : 1
};
//console.log(obj.dash-key);
//console.log(obj.'dash-key');
//console.log(obj[dash-key]);
console.log(obj['dash-key']);
// 프로퍼티 키가 숫자로 이루어진 문자열인 경우 대괄호 표기법에서 따옴표를 생략할 수 있다.
// console.log(obj.0);
// console.log(obj.'0');
console.log(obj[0]);
console.log(obj['0']);
프로퍼티 변경
이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신 된다.
var dog = {
name : '뽀삐'
};
dog.name = '두부';
dog['name'] = '두부';
console.log(dog.name);
프로퍼티 동적 추가
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성 되어 추가 되고 프로퍼티 값이 할당된다.
dog.age = 3;
dog['age'] = 3;
console.log(dog);
프로퍼티 삭제
delete 연산자는 객체의 프로퍼티를 삭제하며,
만약 존재하지 않는 프로퍼티를 삭제하면 에러 없이 무시된다.
delete dog.age;
delete dog['age'];
console.log(dog);
delete dog.something;
프로퍼티 값 단축 구문
var id = 'p-00001';
var price = 30000;
var product = {
id : id, //key값 : value값
price : price
};
console.log(product);
var product2 = { id, price }; // 프로퍼티 키는 변수 이름으로 자동 생성
console.log(product2);
계산된 프로퍼티 이름
ES5에서는 계산 된 프로퍼티 이름으로 프로퍼티 키를 동적 생성하려면 객체 리터럴 외부에서 대괄호 표기법을 사용해야 한다.
var prefix = 'key';
var index = 0;
var obj = {}; // 빈 객체 선언
// 리터럴 외부에서 작성
obj[prefix + '-' + index++] = index;
obj[prefix + '-' + index++] = index;
obj[prefix + '-' + index++] = index;
console.log(obj);
var obj2 = {
[`${prefix}-${index++}`] : index,
[`${prefix}-${index++}`] : index,
[`${prefix}-${index++}`] : index
};
console.log(obj2);
// 결과값 : { 'key-0':1, key-1':2, key-2':3 }
ES5에서 메서드를 정의하려면 프로퍼티의 값으로 함수를 할당한다.
var dog = {
name : '뽀삐',
eat : function(food) {
console.log(`${this.name}(은)는 ${food}를 맛있게 먹어요.`);
}
};
dog.eat('고구마');
ES6에서 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다.
var dog2 = {
name : '뽀삐',
eat (food) {
console.log(`${this.name}(은)는 ${food}를 맛있게 먹어요.`);
}
};
dog2.eat('고구마');
in 연산자 : 프로퍼티 존재 여부 확인
test프로퍼티는 프로퍼티 값이 undefined일 뿐 프로퍼티는 존재하지만 존재하지 않는다고 판별 될 수 있는 문제가 있다.
var student = {
name : '유관순',
age : 16,
test : undefined
};
console.log(student.name === undefined); // false - 존재
console.log(student.height === undefined); // true - 존재하지 않음
console.log(student.test === undefined);
in 연산자로 판단하기
console.log("name" in student);
console.log("height" in student);
console.log("test" in student); //true
for in 반복문 : 객체의 모든 키를 순회
for(var key in student)
for (객체의 key 변수명 in 순회할 대상 리터럴객체)
var student = {
name : '유관순',
age : 16,
getInfo() {
return `${this.name}(은)는 ${this.age}세 입니다.`;
}
};
console.log(student);
for(var key in student) {
console.log(`key : ${key}`); // 프로퍼티 키 값
console.log(`student['${key}'] : ${student[key]}`); // 프로퍼티 키에 해당하는 값
}
//console.log(`student['${key}'] : ${student.key}`);
console.log(`student['${key}'] : ${student[key]}`);