객체
📢 키로 구분된 데이터 집합이나 복잡한 개체(entity)를 저장할 수 있다.
객체의 생성
◾️ 객체생성자
let user = new Object();
◾️ 객체 리터럴
let user = {};
리터럴과 프로퍼티
◾️ Property → 키(key) : 값(value)로 구성
◾️ Property를 추가, 삭제할 수 있다.
◾️ Property의 값(value)엔 모든 자료형 가능
◾️ 여러 단어를 조합해 Property 이름을 만든 경우에는 따옴표로 묶어줘야 한다.
◾️ 마지막 Property 끝은 쉼표로 끝날 수 있다. (trailing, hanging쉼표)
let user = {
name: "suzu",
age: 25,
"one two": 12,
};
delete user.age; // property 삭제
user.isAuth = true; // property 추가
console.log(user); // {name: "suzu", 'one two': 12, isAuth: true}
대괄호 표기법(square bracket notation)
◾️ 점 표기법 : key가 유효한 변수 식별자인 경우에만 사용할 수 있다.
◾️ 대괄호 표기법 : key에 어떤 문자열이 있던지 상관없이 동작한다.
◾️ 대괄호 표기법 안에서 문자열을 사용할 땐 문자열을 따옴표로 묶어줘야 한다.
◾️ 모든 표현식의 평가 결과를 property key로 사용할 수 있다.
◾️ 변수 key는 런타임에 평가 -> 평가가 끝난 이후의 결과가 property key로 사용
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
let bag = {
[fruit]: 5, // 변수 fruit에서 프로퍼티 이름을 동적으로 받아온다.
};
console.log( bag.apple ); // 5
계산된 프로퍼티(computed property)
◾️ 객체를 만들 때 객체 리터럴 안의 프로퍼티 키가 대괄호로 둘러싸여 있는 경우
◾️ [fruit]는 property이름을 변수 fruit에서 가져오겠다는 의미
◾️ 이미 속성을 읽고 설정하는 데 사용했을 수 있는 속성접근자 구문의 각괄호 표기법을 연상시킨다. MDN
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
let bag = {};
bag[fruit] = 5;
console.log(bag); // { apple: 5 }
◾️ property 이름이 확정, 단순한 변수명_점 표기법 ➡️ 복잡한 상황_대괄호 표기법
단축 프로퍼티(property value shorthand)
◾️ 변수를 사용해 Property를 만드는 경우 Property의 key와 value 값이 동일 할 때 사용 단축구문을 사용할 수 있다.
function makeUser(name, age) {
return {
name, // name: name 과 같음
age : 30
};
}
프로퍼티 이름의 제약사항
◾️ Property 이름엔 특별한 제약이 없다.
◾️ 문자형이나 심볼형에 속하지 않은 값은 문자열로 자동 형 변환된다.
◾️ 예외 __proto__ ➡️ 프로토타입
let obj = {};
obj.__proto__ = 5;
alert(obj.__proto__); // [object Object]
'in' 연산자로 프로퍼티 존재 여부 확인하기
◾️ 존재하지 않는 Property에 접근하려 해도 에러가 발생하지 않고 undefined를 반환한다
→ Property 존재 여부를 쉽게 확인
let user = {};
console.log( user.noSuchProperty === undefined ); // true -> 프로퍼티가 존재X
◾️ 연산자 in을 사용하는 방법 ➡️ "key" in object
◾️ in 왼쪽엔 반드시 Property 이름이 와야 한다. (보통 따옴표로 감싼 문자열)
let user = { name: "suzu", age: 30 };
console.log( "age" in user ); // ture;
console.log( "address" in user ); // false
◾️ undefined 비교보다 보다 in을 사용하면 프로퍼티 존재 여부를 제대로 판별 할 수 있다.
◾️ Property는 존재하는데 값에 undefined를 할당한 경우
◾️ 값을 ‘알 수 없거나(unknown)’ 값이 ‘비어 있다는(empty)’ 것을 나타낼 때는 주로 null을 사용한다.
let obj = {
test: undefined
};
console.log(obj.test); // undefined
console.log("test" in obj); // true;
for...in 반복문
◾️ 객체의 모든 키를 순회할 수 있다.
◾️ 반복 변수명은 자유롭게 정할 수 있다.
let user = {
name: "suzu",
age: 30,
isAdmin: true
};
for (let key in user) {
console.log(key); // name, age, isAdmin
console.log(user[key]); // suzu, 30, true
}
객체 정렬 방식
◾️ 정수 프로퍼티(integer property)는 자동으로 정렬되고, 그 외의 프로퍼티는 객체에 추가한 순서 그대로 정렬
💬 정수 프로퍼티 : 변형 없이 정수에서 왔다 갔다 할 수 있는 문자열
// 함수 Math.trunc는 소수점 아래를 버리고 숫자의 정수부만 반환한다.
alert( String(Math.trunc(Number("49"))) ); // '49' 기존에 입력한 값과 같으므로 정수 프로퍼티 O
alert( String(Math.trunc(Number("+49"))) ); // '49' 기존에 입력한 값(+49)과 다르므로 정수 프로퍼티 X
alert( String(Math.trunc(Number("1.2"))) ); // '1' 기존에 입력한 값(1.2)과 다르므로 정수 프로퍼티 X
◾️ 정수 프로퍼티인 경우
let codes = {
"9": "독일",
"1": "스위스",
"4": "영국",
};
for (let code in codes) {
alert(code); // 1, 4, 9
}
◾️ 정수 프로퍼티가 아닌 경우
let codes = {
"+9": "독일",
"+1": "스위스",
"+4": "영국",
};
for (let code in codes) {
alert(+code); // 9, 1, 4
}
📝 오늘 새롭게 배운 내용 📝
✅ 점 표기법과 대괄호 표기법의 차이점과 활용법
✅ 계산된 프로퍼티
✅ 프로퍼티 존재 여부 in 연산자
✅ 객체의 정렬 방식과 정수 프로퍼티
📌 [JAVASCRIPT_INFO 객체]
객체
ko.javascript.info
📌 [MDN 객체초기자]
객체 초기자
객체는 new Object(), Object.create() 또는 literal 표기법 (initializer 표기법)을 사용하여 초기화될 수 있습니다. 객체 초기자(object initializer)는 0개 이상인 객체 속성명 및 관련값 쌍 목록입니다, 중괄호({})
developer.mozilla.org
'모던 자바스크립트' 카테고리의 다른 글
4.5 'new' 연산자와 생성자 함수 (0) | 2020.08.10 |
---|---|
4.4 메서드와 'this' (0) | 2020.08.08 |
4.3 가비지 컬렉션 (0) | 2020.08.06 |
4.2 객체 - 참조에 의한 객체 복사 (0) | 2020.08.05 |
모던 JavaScript 정독하기 (0) | 2020.08.04 |