키(key)과 값(value)으로 구성된 프로퍼티(Property)들의 집합
자바스크립트는 객체(object) 기반의 스크립트 언어
자바스크립트를 이루고 있는 거의 “모든 것”
원시 타입을 제외한 나머지 값들(함수, 배열, 정규표현식 등)은 모두 객체
const apple = {
name: 'apple',
display: function () {
console.log(`${this.name} 🍎`);
},
};
let apple = { //객체
name: 'apple', // 키: "name", 값: "apple"
apple_tree: '🌳'
'bye-icon': '✋',
0: 1,
['good-icon']: '👍',
};
// 속성 추가
apple.emoji = '🍎';
console.log(apple.emoji);
console.log(apple['emoji']);
delete
연산자를 사용하면 프로퍼티 삭제 가능// 속성 삭제
delete apple.emoji;
console.log(apple);
const
로 선언된 객체는 수정될 수 있다.const
는 user
의 값(객체 참조 값)을 고정하지만, 그 내용은 고정하지 않는다.(객체의 내용(프로퍼티) 변경👌)const
는 user=...
를 전체적으로 설정하려고 할 때만 오류가 발생.const user = {
name: "John"
};
user.name = "Luna"; // (*)
alert(user.name); // Luna
// 빈 객체의 생성
let person = new Object();
// 프로퍼티 추가
person.name = 'Kim';
person.gender = 'female';
person.sayHello = function () {
console.log('Hi! My name is ' + this.name);
};
console.log(typeof person); // object
console.log(person); // {name: "Kim", gender: "female", sayHello: ƒ}
person.sayHello(); // Hi! My name is Kim
객체 리터럴 방식으로 생성된 객체는 결국 빌트인(Built-in) 함수인 Object 생성자 함수로 객체를 생성하는 것을 단순화시킨 축약 표현(short-hand)이다.
// 생성자 함수
function Fruit(name, emoji) {
this.name = name;
this.emoji = emoji;
this.display = () => {
console.log(`${this.name}: ${this.emoji}`);
};
// return this; // 생략가능
}
const apple = new Fruit('apple', '🍎');
const orange = new Fruit('orange', '🍊');
console.log(apple);
console.log(orange);
console.log(apple.name);
console.log(apple.emoji);
apple.display();
apple.name; // 마침표 표기법 dot notation
console.log(apple.bye-icon) //오류!
console.log(apple['bye-icon']); // 특수문자 포함된 키->대괄호 표기법 bracket notation
$
와 _
를 제외한 특수문자가 없어야 함const obj = {
name: 'Luna',
age: 20,
};
// 코딩하는 시점에, 정적으로 접근이 확정된다.
obj.name;
obj.age;
// 동적으로 속성에 접근하고 싶을때 대괄호 표기법 사용
function getValue(obj, key) {
return obj[key];
}
console.log(getValue(obj, 'name'));
const x = 0;
const y = 0;
//key, value 같을 때 생략 가능
const obj = { x, y }; //{ x: x, y: y };
console.log(obj);
function makeObj(name, age) {
return {
name,
age,
};
}
// 예약어를 키로 사용해도 ok
let obj = {
for: 1,
let: 2,
return: 3
};
alert( obj.for + obj.let + obj.return ); // 6
0
을 넣으면 문자열 "0"
으로 자동변환__proto__
let obj = {};
obj.__proto__ = 5; // 숫자를 할당
alert(obj.__proto__); // [object Object]
//-> 숫자를 할당했지만 값은 객체가...무시됐다....
"key" in obj
"=== undefined"
로도 프로퍼티 존재 여부 가능, 하지만let obj = {
test: undefined
};
console.log(obj.test);
// 값이 `undefined`이므로, undefined가 출력. 그런데 프로퍼티 test는 존재
console.log("test" in obj);
// `in`을 사용하면 프로퍼티 유무 제대로 확인(true가 출력).
for..in
반복문으로 객체의 모든 키를 순회 가능for (key in object) {
// 각 프로퍼티 키(key)를 이용하여 본문(body)을 실행
}
for..of
사용하기//for..in 반복문으로 모든 객체의 키 순회
let obj = {
name: 'apple',
color: 'green',
price: '3000₩',
};
// prop에 객체의 프로퍼티 이름이 반환. 단, 순서는 보장❌
for (let prop in obj) {
console.log(prop + ': ' + obj[prop]);
}
/*
name: apple
color: green
price: 3000₩
*/
let arr = ['one', 'two'];
// index변수에 배열의 경우 인덱스 반환
for (let index in arr) {
console.log(index + ': ' + arr[index]);
}
/*
0: one
1: two
*/
// 배열 요소들만을 순회하지 않는다.
arr.name = 'myArr';
for (let index in arr) {
console.log(index + ': ' + arr[index]);
}
/*
0: one
1: two
name: myArr
*/
//따라서 배열의 요소 순회할 때는 for..of 사용!
for (let value of arr) {
console.log(value);
}
/*
one
two
*/
let user = {
name: "John",
surname: "Smith"
};
user.age = 25; // 프로퍼티 추가
// 정수 프로퍼티가 아닌 프로퍼티는 추가된 순서대로 나열
for (let prop in user) {
console.log(prop); // name, surname, age
}
//정수 프로퍼티의 경우
let codes = {
"49": "독일",
"41": "스위스",
"44": "영국",
// ..,
"1": "미국"
};
for (let code in codes) {
console.log(code); // 1, 41, 44, 49
}
49
가 맨 앞에 오도록 하고 싶다?1, 41, 44, 49
순으로 프로퍼티가 자동 정렬…+
달기let codes = {
"+49": "독일",
"+41": "스위스",
"+44": "영국",
// ..,
"+1": "미국"
};
for (let code in codes) {
console.log(+code); // 49, 41, 44, 1
console.log(code); // +49, +41, +44, +1
}