목록JavaScript/객체 : 기본 (9)
dolog
객체끼리의 연산과 출력? 객체는 원시값으로 변환되고, 그 후 의도한 연산이 진행된다 객체는 논리 평가 시 true 반환 ➡️ 숫자형 또는 문자형 숫자형으로의 변환 : 빼는 연산, 수학 관련 함수를 적용할 때 ex) date1 - date2 = 두 날짜의 시간 차이가 반환 문자형으로의 변환 : console.log(obj), alert(obj) 같이 출력할 때 변환 ToPrimitive 특수 객체 매서드를 사용해 숫자형 또는 문자형으로 형 변환을 자유롭게 조절할 수 있다 ‘hint’(구분 기준) : 목표로 하는 자료형(명세서에 자세한 설명 참고하기) ㄴ “string” : alert 함수같이 문자열을 기대하는 연산 수행 시 hint ➡️ string (object ➡️ string) ㄴ “number” :..
JS에선 객체 프로퍼티 key로 오직 문자형 또는 심볼형만 허용한다 심볼(symbol) 유일한 식별자(unique identifier) Symbol() 을 사용하면 심볼값을 만들 수 있다 원시형 데이터 // id는 새로운 심볼이 된다 let id = Symbol(); 심볼을 만들 때 설명을 붙일 수 있으며 디버깅 시 아주 유용하다 // 심볼 id에는 “id” 라는 설명이 붙는다, 이름표 역할 let id = Symbol(“id”); 설명이 동일한 심볼이라도 각 심볼값은 다르다 let id1 = Symbol(“id”); let id2 = Symbol(“id”); console.log(id1 == id2); // false 심볼은 문자형으로 자동 형 변환 X JS에선 alert 함수 처럼 모든 값을 인자로 ..
옵셔널 체이닝(optional chaining) ?. - 프로퍼티가 없는 중첩 객체에 에러 없이 접근할 수 있다 옵셔널 체이닝이 필요한 이유 기존 몇가지 사례를 보자면 1)프로퍼티를 가지지않은 객체에 접근할 때 생기는 에러 2)페이지에 존재하지 않는 요소에 접근해 정보를 가져오려 했을 때 생기는 에러 ⬇️ 중첩객체의 특정 프로퍼티에 접근하기 위한 구성요소들을 && 연산자로 묶어 해당 객체나 프로퍼티가 있는지 확인했었다 console.log(user && user.address && user.address.street); // undefined 다만 이렇게 && 연산자를 사용하게 되면 코드가 길어진다 옵셔널 체이닝의 등장 - ?. 앞에 평가 대상이 undefined or null ➡️ undefined 로..
객체 생성 목적 : 사용자(user), 주문(order) 등 실제 존재하는 개체(entity)를 표현하고자 할 때 생성된다 ex) let user = { name: “Kim”, age: 26 }; 현실에서 장바구니에서 물건 선택하기, 로그인 & 로그아웃 하기처럼 user를 나타내는 객체 user도 특정한 행동을 할 수 있다 JS에선 객체 프로퍼티에 함수를 할당 ➡️ 행동 능력 부여 매서드 만들기 ex) 객체 user가 인사할 수 있도록 해보자 let user = { name: “Kim”, age: 26 }; user.sayHi = () => { // let 선언을 할 필요가 없는게 이미 앞에서 선언했기떄문 alert(“Hi”); }; user.sayHi(); // Hi 예시처럼 객체 프로퍼티에 할당된 함..
연결된 객체 let marry = (man, woman) => { woman.husband = man; man.wife = woman; return { // 새로운 객체 반환 father: man, mother: woman } } let family = marry({ name: “Kim” }, { name: “Shim” }); father과 mother.husband를 지우면 ⬇️ delete family.father; delete family.mother.husband; 둘 중 하나만 삭제해도 모든 객체는 여전히 도달 가능한 상태지만 두개 모두 지우면 Kim으로 들어오는 참조는 모두 사라져 도달 가능한 상태가 X ➡️ 메모리 삭제 즉, 외부에서 들어오는 참조만이 도달 가능한 상태에 영향을 준다 !! 결..
우리가 만드는 모든 것은 메모리를 차지한다 더는 쓸모 없게 된 것들을 어떻게 처리할까? 가비지 컬렉션 기준 JS는 도달 가능성(reachability) 라는 개념을 사용해 메모리 관리 도달 가능한 값 : 어떻게든 접근하거나 사용할 수 있는 값 도달 가능한 값은 메모리에서 삭제 되지 않는다 가비지 컬렉터(garbage collector)가 끊임 없이 동작하여 모든 객체 모니터링, 도달 가능 X 객체 삭제 고정 도달 가능 값(root) / 현재 함수의 지역 변수와 매개변수 / 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수 / 전역 변수 / etc. root가 참조하는 값 또는 체이닝으로 루트에서 참조할 수 있는 값 ➡️ 도달 가능한 값 ex) 전역 변수에 객체 저장 ➡️ 객체의 프로퍼티가 또 다..
원시 타입 : 값 그대로 저장과 할당, 복사가 가능 객체 타입 : 객체가 저장되어 있는 메모리 주소 인 객체에 대한 참조값(by reference)이 저장 ex) let user = { name: “John” } 객체는 메모리 내 어딘가에 저장되고 변수 user엔 객체를 참조할 수 있는 값이 저장 ➡️ 객체가 할당된 변수를 복사할 땐 객체의 참조값이 복사 ex) let user = { name : “John” }; let admin = user; // 참조값을 복사 admin.name = “Pete”; console.log(user.name); 변수는 두개지만 각 변수엔 동일 객체에 대한 참조 값이 저장 따라서 객체에 접근하거나 객체를 조작할 땐 여러 변수를 사용할 수 있습니다 참조에 의한 비교 == 와..
프로퍼티 이름의 제약사항 변수 이름엔 for, let, return 사용 X ex) let let; (X) 그러나 객체 프로퍼티엔 제약이 없다 ex) let obj = { for: 1, let: 2, return: 3 }; 또한 문자열 또는 심볼형에 속하지 않은 값은 문자열로 변환된다 ex) let obj = { 0: “test” // “0”: “test” 와 동일하다 }; 하지만 역사적인 이유 때문에 특별 대우를 받는 이름이 있다 ➡️ __proto__ ex) let obj = {}; obj.__proto__ = 5; // 원시값 5가 무시된다 console.log(obj.__proto__); // 값은 객체가 된다 이후에 프로토타입(프로토타입 상속, 매서드와 __proto__가 없는 객체) 관련해서 ..