자바스크립트에서 사용할 수 있는 자료형은 두가지로 분류된다
형태 :
{ 키 : 값 }
let 변수명 = new Object();
let 변수명 = {};
let user = { // 객체
name: "John", // 키: "name", 값: "John"
age: 30 // 키: "age", 값: 30
};
점 표기법(dot notation) 사용하기!!
객체명.키
alert(user.age); // output -> 30
객체명.추가할 키 = 추가할 값;
user.isAdmin = true; // 값은 모든 자료형 가능 (boolean도)
delete
객체명.삭제할 키;
delete user.age;
💡 const 객체는 수정될 수 있다!
보통const
로 선언된 변수들은 수정이 불가능한 것으로 유명하지만,
객체는 수정, 즉 새로운 property를 추가 혹은 삭제하는 것이 가능하다!
키가 여러 단어로 이루어졌을 경우, 반드시 "
따옴표로 감싸주어야 한다.
let user = {
name: "John",
age: 30,
"likes birds": true
};
💡 property는 쉼표로 끝날 수 있다!
{~:~, ~:~,}
이럴 때 사용하는 쉼표 : trailing / hanging 쉼표
= square bracket notation
앞서 점 표기법(객체명.키
)으로 값을 읽는 법을 배웠다.
하지만 여러 단어로 구성된 키의 경우, 점표기법을 통해 값을 읽어올 수 없다.
user.likes birds = true; //error
해당 키는 '유효한 변수 식별자'가 아니고,
이럴 땐 대괄호 표기법을 사용해야 JS가 코드를 이해할 수 있다.
// 읽기(get)
alert(객체명["여러 단어 키"]);
// 추가(set)
객체명["여러 단어 키"] = 추가할 값;
// 삭제(delete)
delete 객체명["여러 단어 키"];
let 변수명 = "여러 단어 키";
//추가 (set)
객체명[변수명] = 값;
이런 형태는 키값을 사용자에게 입력받을 때와 같은 경우 유연하고, 유용하게 사용할 수 있다!
객체 리터럴에 [키]
가 쓰여서 객체를 생성할 경우를 말한다.
예시를 보며 이해해보자. 다음과 같은 경우들이 가능해진다.
1. 객체 생성 시, 키를 사용자의 입력에 따라 받아올 수 있다.
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
let bag = {
[fruit]: 5, // 변수 fruit에서 프로퍼티 이름을 동적으로 받아 옵니다.
};
alert( bag.apple ); // fruit에 "apple"이 할당되었다면, 5가 출력됩니다.
let fruit = 'blueberry';
let bag = {
[fruit + 'Yogurt']: 5 // bag.blueberryYogurt = 5
};
보통 실무에서 property의 값은 변수로 받는다.
특히 키와 변수명 모두 같은 값을 가리키고,의미하는 이름이기 때문에 동일하게 설정될 때가 많다.
이렇게 키
와 값의 변수명
이 동일할 때 사용할 수 있는 것이 바로 shorthand property!
예시 :
function makeUser(name, age) {
return {
name: name,
age: age,
// ...등등
};
}
let user = makeUser("John", 30);
alert(user.name); // John
위의 예시에서
가 동일한 것을 볼 수 있다.
이럴 때, 아래와 같이 property를 단축할 수 있다.
function makeUser(name, age) {
return {
name, // name: name 과 같음
age, // age: age 와 같음
// ...
};
}
쉽게 말해,
어떤 프로퍼티의 키가 A, 값이 123, 값을 담는 변수명이 A일 때
A : 123
, A : A
A
A : A
와 같은 역할을 한다. 일반 property와 단축 property를 혼용하는 것도 가능하다.
function makeUser(name, age) {
return {
name,
age : 24
};
}
일반 변수명에 주어지는 제약사항과 달리,
Property 이름, 즉 키에는 제약사항이 거의 없다.
__proto__
는 키로 사용할 수 없다. in 연산자는 property의 존재여부를 확인하는 데에 쓰인다.
💡js의 특징이자 장점! 존재하지 않는 property에 접근하면 에러가 발생하지 않고, undefined 가 반환된다.
따라서 객체명.키 === undefined
의 참거짓을 따져보면 존재여부를 판단하기가 쉽다
이 외에 존재여부를 판단하는 더 간단한 연산자가 바로 in이다.
"키" in 객체명
예시 :
let user = { age: 30 };
let key = "age";
alert( "key" in user ); // true
//변수 key에 저장된 값("age")을 사용해 프로퍼티 존재 여부를 확인합니다.
이때 주의할 점은, in 좌측의 키 자리에 "
따옴표를 붙이지 않는다면, 코드 내에 같은 이름의 변수에 접근하는 의도치않는 프로세스가 실행하기 때문에 존재 여부 판별이 어렵다.
property의 값이 undefine
일 수도 있기 때문에, undefined와의 동일 비교보다 in을 사용한 존재여부 판단이 더 정확하다!
객체 내 모든 키를 순회할 때 사용한다.
for (변수명 in 객체명) { ... ]
변수에 매 회차마다 각 키가 담기게 된다.
다음의 예제처럼 모든 키를 뽑아서 출력할 수 있다.
let user = {
name: "John",
age: 30,
isAdmin: true
};
for (let key in user) {
alert( key ); // name, age, isAdmin
}
또, 이를 활용해서 모든 값을 뽑아서 출력할 수도 있다.
for (let key in user) {
alert( user[key] ); // John, 30, true
}
💡위의 예시에서 볼 수 있듯이, 우리에게 익숙한
for(반복변수 초기화;조건;증감)
을 사용할 때처럼 반복변수는 for문 내에서 let으로 선언해서 사용한다.
💡 여기서 정수 property란, 정수형<->문자형 변환 시 형태를 유지하는 정수를 말한다. 즉,
42
: 정수 property (O)+42
: (X)1.2
: (X)
{프로퍼티, 프로퍼티}
이며, 프로퍼티의 기본 형태는 키:값
이다.