객체란 여러 속성을 하나의 변수에 저장할 수 있도록 해주는 데이터 타입!
객체가 없으면?
문제 : 비트코인 정보를 출력하는 함수를 짜주세요.
const id = 136523;
const name = 'bitcoin';
const symbol = 'BTC';
// 그런데 여기서 얘네들을 다 출력해야돼
print(name, symbol);
function print(name, symbol){
console.log(name);
}
문제점
⇒ 관리힘듬.
객체로 한번에 관리를 해줘버리자. (약간 폴더정리 느낌임)
const 코인 = {
{
id: 136523,
name: 'bitcoin',
symbol: 'BTC',
price: '화성 가버리는 가격',
},
{
id: 142312,
name: 'yunkuk',
symbol: 'YKK',
price: '달 가버리는 가격',
}
}
function 출력해(코인){
console.log(코인[0].id);
console.log(코인[0].price);
// 한번에 다 출력하고 싶으면 .map 쓰셈
}
출력해(코인);
우리도 바탕화면에 뭔가 쨘뜩 깔려있으면 폴더 정리를 해주듯이
관계있는 데이터 또는 함수들을 묶어서 객체를 만들어주어, 관리하기 편하게끔 만들어준다!
object = { key : value }
key : object에서 우리가 접근 할 수 있는 값 (변수 같은 역할)
value : key값으로 접근했을 때 들어있는 data or function (변수에 선언한 무언가 같은 역할)
property :
const person = {
name: 'Bokchil Kim',
DOB: 1884,
age: () => 2021 - person.DOB,
}
객체에 접근할 수 있는 방법에는 2가지가 있다.
1. Dot Notation (object.key
)
2. Braket Notation (object['key']
)
보통 코딩할 때의 경우 Dot Notation 을 주로 사용하지만,
1, 2, 3 의 예외 상황에서는 Braket Notation 을 사용 해야 한다.
// 예시
function printValue(obj, key){
console.log(obj.key); // undefined
console.log(obj[key]); // 정상 출력
}
단, key는 string 타입으로 넣어줘야 한다.
let person = {
name: 'Bokchil Kim',
DOB: 1884,
age: () => 2021 - person.DOB,
};
// 추가
person.sayhello = () => console.log('하이');
// 수정
person.name = 'Bok Deok BBang';
// 삭제
delete person.age;
console.log(person);
보통 이런 경우가 json 파일 받아와서 재가공 할 때 자주 사용되는데 그래서 비트코인 정보 api에 접근해서 값들을 가져왔다.
async <function getCoins() { const response = await fetch('https://api.coinpaprika.com/v1/tickers'); if (!response.ok) throw new Error(response.error); const result = await response.json(); return result; } getCoins().then(([...coins]) => { console.log(coins); });
예를 들어,
여기서 1 번째 코인(idx는 0)의 id 를 알고 싶다면 coins[0].id
로 접근 하면 되고
3 번째(idx는 2) 코인의 rank를 알고 싶다면 coins[2].rank
로 접근하면 된다.
보통 map을 사용해서 내가 사용 할 수 있게 새로운 배열을 반환 받아 사용하거나, 계속해서 반복되는 Component를 만들 때 사용한다. (
<li>
같은거)
(map은 foreach와 다르게 재가공된 새로운 배열을 return. 그래서 따로 let을 통해 빈 배열을 만들어 줄 필요가 없다)getCoins().then(([...coins]) => { const coinIds = coins.map((coin) => coin.id); console.log(coinIds); });
배열의 Type은 Object 이지만 protoType을 보면 Array 라고 되어있다. 이게 무슨말일까?
배열은 key값을 string이 아닌 number인 객체이다.
숫자형 키(인덱스)를 사용함으로써 객체의 기본 기능 외에도 순서를 제어 할 수 있는 특별한 메소드들을 제공한다.
개발을 하다 보면 순서가 있는 덩어리가 필요할 때가 있다. 예를 들어, 순서를 만들어 정렬(sorting) 해야하는 경우가 그렇다.
또, 특정 요소를 빠르게 읽어야 할 때도 순서가 있는 배열이 객체보단 읽기 빠르다.
"유전자"
배열의 프로토타입을 검색해보니 아주 여러가지가 나온다.
arr.map() 도 가능하고 arr.sort(), arr.join() 등등 배열은 여러 메소드를 사용 할 수 있다.
그런데 배열자료에 저런 메소드를 붙일수 있는 이유가 뭘까? 우리는 저런 함수들을 추가 해 준적이 없는데??
답 : 니네 부모님 유전자 쩔더라.
const arr = new Array(5,2,4,12);
배열을 만드는 방법에는 new키워드를 사용하는 방법이 있다.
어라? 이거 class 에서 자식 뽑아낼때 쓰는 문법인데??
맞다.우리가 배열의 메소드를 따로 만들지 않아도 사용할 수 있는 이유는 이미 부모 유전자(prototype) 안에 들어있기 때문이다.
이부분은 Class 관련 이야기할 때 더 자세히 다루겠다.
그리고, https://velog.io/@yunkuk/TIL-03objectVSarray 일전에 배열과 객체의 공통점과 차이점을 정리해놓은 곳이다.