2021.04.14_JavaScript 객체_정리노트
오늘도 역시 ko.javascript.info/object 에서 본 내용들을 혼자 정리해서 주절주절 할 예졍!!!
단순히 객체는 여러 데이터의 집합을 나타난다고만 생각했는데, 뭐 사실 그게 다다. 하지만!!! 제대로 알아보기 위해서 다시 꼼꼼히 정리.
그으저언에_______
함수가 끝나고, 코드 품질을 위한 챕터가 하나 있었는데, 제대로 읽어보려면 아직 한참이겠지만, 그 중에서 하나만 짚고 넘어가려구 ..!
다음에 제대로 코드를 뚜들뚜들 할 때 열심히 이 챕터도 정리해야지..! 단순히 프로젝트 할 때 ESLint 라는 코드 익스텐션을 깔아서 썼었는데, 막 복잡해서 이거 꼭 써야하나..? 했는데 역시역시 훑어봐도 써야할 듯 함.. 쨋든쨋든 내가 왜 잠시 얘기를 하냐면, 나는 블로그에 쓸 때 하나하나 내가 알기 위해서, 그리고 이해가 쉽게 하기 위해서 주석을 진짜 겁 ㅂ ㅂ ㅂ ㅂ ㅂ 나 썼는데, 실제로 코드를 작성할 때는 매우 잘못된 방법인 것을 알고, 하나 정리하고 가기.
주석에 들어가면 좋은 내용
#고차원 수준 아키텍처
#함수 용례
#당장 봐선 명확해 보이지 않는 해결 방법에 대한 설명
-- 이는 나중에 내가 코드를 다시 보았을 때, 다른 사람이 내 코드를 보았을 때 효율성을 높인다.
주석에 들어가면 좋지 않은 내용
#'코드가 어떻게 동작하는지’와 '코드가 무엇을 하는지’에 대한 설명
#코드를 간결하게 짤 수 없는 상황이나 코드 자체만으로도 어떤 일을 하는지 충분히 판단할 수 없는 경우에만 주석을 넣으세요.
-- 이는 가독성을 매우 떨어뜨리므로, 넣지 않을 것,,,! 코드 이름과 코드의 스타일 등을 적극 활용해서 코드 자체만으로도 이 코드가 무슨 기능을 하는지 직관적으로 짤 생각을 해야지, 주석 통해서 주절주절 거리면서 설명하지 말아야 한다는 이야기...ㅎㅁㅎ
물론 나는 블로그에는 주석을 써서 하나하나 무슨 내용이 들어가는지 설명할 예정이다. ( but 내 블로그 제일 많이 보는 사람 = it's me )
하지만 실제로는 이렇게 코드 작성하면 안되니까 주석에 대해선 하나 짚고 넘어가자..!
자 이제 객체로 정리 갑씨다!
객체 생성자
let user = new Object(); // '객체 생성자' 문법
let user = {
// key : value >>> property
// "문자열" : 모든 자료형
};
// '객체 리터럴' 문법
객체는 문자열로 이루어진 key 와 모든 자료형으로 이루어진 value 로 이루어지며, 이를 합쳐 프로퍼티 (property) 라 부른다.
프로퍼티는 여러개 올 수 있다.
여러 프로퍼티를 만들 때는 쉼표 (,) 로 구분하며, 마지막 프로퍼티의 끝은 , 로 끝날 수 있다.
이를 trailing or hanging 쉼표라고 부르며, 끝에 쉼표를 붙이면 모든 프로퍼티가 유사한 형태이기 떄문에 프로퍼티를 추가, 삭제, 이동하는 것이 쉬워진다.
* const 객체는 수정이 가능하다.
- 객체에서 const 는 객체 전체를 설정하려고 할 때만 오류가 발생한다. ( 여기서는 user 전체 )
const user = {
name: "me"
};
user.name = "Korin";
alert(user.name); // Korin
여기서 점 표기법을 사용하여 user 안에 있는 name 의 value 를 korin 으로 바꾸어 주었다.
이렇듯 obj.key 를 통해 value 를 읽어낼 수 있다.
하지만 점 표기법은 key 에 공백이 올 수 없고, 오직 유효한 변수 식별자만 읽을 수 있다.
그래서 key 를 좀 더 자유롭게 사용하고 싶다면,
대괄호 표기법
let user = {};
// set
//여기서 value 는 모든 자료형이 올 수 있으니 true라는 불리안 값으로 프로퍼티 세팅.
user["likes birds"] = true;
// get
alert(user["likes birds"]); // true
//delete
//delete 명령어를 통해 프로퍼티 삭제 가능.
delete user["likes birds"];
대괄호 표기법은 키에 어떠한 문자열이 있어도 읽을 수 있다. 다만 문자열인 경우, 따옴표("")를 사용해서 꼭 묶어 줘야함.
이를 응용해서 모든 표현식의 평가 결과를 프로퍼티의 key 로 사용 가능.
let user = {
name: "korin",
age : "30",
};
let key = prompt(" 사용자의 어떤 정보를 얻고 싶으신가요 ? ", "name" );
// 변수의 반환 값 ( 평가 결과 ) 이 "name" 이 된다면, korin 을 띄워줌.
// 즉, 우리가 프롬프트 창에 name 이라고 입력하면, name 의 value 값인 korin 이 alert 에 출력.
alert( user[key] ) //korin
또한 대괄호 안에는 복잡한 표현식이 오는 것도 가능
let fruit = "apple";
let bag = {
[fruit + 'Computers'] : 1
};
alert(bag.appleComputers); //1
이렇듯 대괄호 표기법은 이름과 값으 제약을 없애주기 때문에 강력하다. 점 표기법으로는 할 수 없는 것들이 많기 때문.
하지만 나도 그렇고 다들 객체를 처음 접할 때 점 표기법으로 객체를 자주 만났을 텐데 , 이는 점 표기법이 좀 더 직관적이고 작성하기 편하기 때문. 그러니 key 가 처음부터 확정적이고, 간단한 프로퍼티의 경우 점으로 접근하고, 아니면 대괄호로 나중에 바꿔보기!
계산된 프로퍼티
key 가 대괄호로 둘러싸여 있는 경우, 이를 계산된 프로퍼티라 한다.
이는 문자열, 문자열로 변환 가능한 값을 대괄호로 묶어서 사용하면, 동적으로 프로퍼티의 key 를 생성할 수 있음.
//동적으로 property key 생성하기.
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
let bag = {
[fruit]: 5, // 변수 fruit에서 프로퍼티 key를 동적으로 받아옴.
};
alert( bag.apple );
// fruit에 "apple"이 할당되었다면, 5가 출력.
//계산된 프로퍼티 사용해서 동적으로 property key 생성.
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");
//빈 오브젝트 생성.
let bag = {};
// 변수 fruit을 사용해 프로퍼티 key 를 만듬.
bag[fruit] = 5;
alert( bag.apple ); // apple 이 할당 되었다면, 5 출력
이렇듯 밑의 예시처럼 계산된 프로퍼티로 생성하게 되면, 코드가 좀 더 깔끔해진다.
단축 프로퍼티
기존 변수에서 프로퍼티의 value를 받아와야 하는 경우가 있으면, 단축 프로퍼티를 사용 가능.
// name ,age 는 프로퍼티의 key 와 변수의 이름이 같음.
function makeUser(name, age) {
return {
name: name,
age: age,
};
}
let user = makeUser("korin", 23); // 기존 변수 name, age 사용.
alert(user.name); // korin
// 단축 프로퍼티
function makeUser(name,age){
return{
name, // == name : name
age, // == age : age
};
}
let user = makeUser('Korin',23 )
alert(user.name) // korin
이렇게 사용하면 마찬가지로 코드가 간단해진다. 단축 프로퍼티와 일반 프로퍼티를 한 객체 안에서 섞는 것도 가능하다.
//일반 프로퍼티, 단축 프로퍼티 혼합 사용 예시
function makeUser(name,age){
return{
name:name,
age,
};
}
객체의 프로퍼티 key 에서 문자형이나 심볼형에 속하지 않은 값은 문자열로 자동 형 변환이 된다.
변수 이름엔 for, let ,return 과 같은 이미 문법적인 용도로 사용되고 있는 예약어들에 대해서는 사용이 불가했다. 하지만 객체의 프로퍼티의key 에서는 사용이 가능하다.
let obj = {
0: "test" //"0": "test" 로 자동 형변환.
};
alert( obj["0"] ); // test
alert( obj[0] ); // test (동일한 프로퍼티)
in 연산자로 프로퍼티의 존재 여부를 확인 가능하다.
자바스크립트에서 객체의 중요 특징 중 하나는, 만약 내가 존재하지 않는 프로퍼티에 접근하려 할 때는 에러를 띄우지 않고 undefined 를 반환한다.
// 일치 연산자를 사용하여, 존재 여부를 찾는 방법
let user = {};
alert( user.noSuchProperty === undefined ); //true
//in 연산자 사용으로 존재 여부 확인 방법
let user = { name: "korin", age: 23 };
alert( "age" in user ); // true
alert( "blabla" in user ); // false
let user = { age: 23 };
let key = "age";
alert( key in user ); //true
// 여기서 key 는 "key" 라고 하지 않아서 key 라는 프로퍼티의 이름이 아니라, 변수에 저장된 "age" 로 인식해 true 출력.
"key" in obj 의 형태로 in 연산자 사용이 가능한데, 따옴표를 붙이지 않으면 엉뚱한 곳에서 찾아올 수 있으니, 주의!!
근데 다르게 쓰는 방법일 뿐인 것일까? 그러면 그냥 === 써서 해도 되는거 아닌가?
let obj = {
// 만약 test 에 undefined 를 할당했다면 ?
test: undefined
};
alert( obj.test ); //undefined
// 분명 test는 있는 값인데 , 이게 undefined 를 할당해서인지, 아니면 test가 존재하지 않는다는 건지 헷갈림.
alert( "test" in obj ); // true
// `in`을 true or false 로 정확히 프로퍼티의 유무를 확인 가능.
객체에서 for in 반복문을 쓰면, 객체의 모든 key 를 순회할 수 있다.
let user = {
name: "korin",
age: 23,
isAdmin: true
};
// for (props in obj) 형태
for (let key in user) {
// key 출력
alert( key ); // name, age, isAdmin
//value 출력
alert( user[key] ); // korin, 23 , true
}
정수 프로퍼티는 프로퍼티를 생성한 순서에 상관없이, 자동으로 정렬되어 나온다.
객체는 특별한 방식으로 정렬 된다. 정수 프로퍼티는 자동으로 정렬되고, 나머지는 객체에 추가한 순서대로 정렬된다.
정수 프로퍼티
정수에서 왔다갔다 할 수 있는 문자열로, "49" 와 같은 것들이 정수 프로퍼티. "+49" , "1.2" 같은 경우는 "49" ,"1" 로 각각 변형이 되므로 정수형 프로퍼티가 아니다.
let codes = {
"49": "독일",
"41": "스위스",
"44": "영국",
// ..,
"1": "미국"
};
// 정수형 프로퍼티는 1부터 자동정렬 하여 for문 순회.
for (let code in codes) {
alert(code); // 1, 41, 44, 49
}
정수형 프로퍼티는 이렇게 정렬되어 순회하는데, 만약 내가 작성한 순서대로 나오게 하고 싶으면 ?
// + 를 붙여 정수형 프로퍼티가 아니게 만들면, 내가 작성한 순서대로 나온다.
let codes = {
"+49": "독일",
"+41": "스위스",
"+44": "영국",
// ..,
"+1": "미국"
};
for (let code in codes) {
alert( +code ); // 49, 41, 44, 1
}
이런식으로 간단한 트릭을 사용하면 된다.
지금까지 우리는 몇 가지 특수한 기능을 가진 연관 배열 (associative array) 이라는 뜻의 일반 객체를 정리해보았움..!
이 외에도 다양한 종류의 객체들이 있는데 , 이것도 다음에 배우면서 정리해야지! ㅎㅁㅎ...!
Array – 정렬된 데이터 컬렉션을 저장할 때 쓰임
Date – 날짜와 시간 정보를 저장할 때 쓰임
Error– 에러 정보를 저장할 때 쓰임
기타 ....
후.. 어케 보면 거의 책 내용을 ..뺏긴 듯 하지만 나름.. 직접 치면서 중간중간 내가 이해 가능하게 혼자 주절 주절 거리면서 정리...한듯 하다 ㅎㅁㅎ
객체는 정말 중요한 개념이니 처음부터 끝까지 꼼꼼하게 정리해보아쑴 !! 후!!! 오늘의 포스팅 끝끝!!!!!
'JavaScript' 카테고리의 다른 글
2021.08.04 JavaSript 콜백 지옥에서 벗어나기 (2) | 2021.08.04 |
---|---|
2021.04.22 JavaScript Object 복사 (0) | 2021.04.22 |
2021.04.13 JavaScript 함수 (0) | 2021.04.13 |
2021.04.05 JavaScript 논리 연산자 정리 (0) | 2021.04.05 |
2021.03.24 Java Script 변수 선언, 할당 (0) | 2021.03.24 |
댓글