코어자바스크립트 [01. 데이터타입]

null·2021년 10월 5일
0

🔸 원시형

Number String Boolean null undefined Symbol

🔸 참조형

Array Function Date RegExp Map,set,,

원시형과 참조형은 복제하는 방식이 다르다 How?

원시형은 값이 담긴 주솟값을 바로 복제한다

참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다

//원시형 예시
var amo = 15;
console.log(amo); //15

var amo = 'fb';
console.log(amo); /fb

예시를 보면 변수에 들어간 값이 변하는데 왜 원시형은 불변성은 띈다고 하냐.

이걸 이해하려면..

메모리와 데이터

비트

컴퓨터에서 0,1만 표현할 수 있는 하나의 메모리 조각

메모리는 매우 많은 비트들로 구성 > 각 비트는 고유한 식별자를 통해 위치 확인

바이트

비트를 한 단위로 묶으면 검색 시간 줄이고 표현할 수 있는 데이터 개수는 늘어나는 장점이 있어

문제는 낭비되는 데이터가 생긴다는 것 > 자주 사용하지 않을 데이터를 빈 공간으로 두지말고

표현 가능 개수가 줄어들더라도 문제 되지 않은 적정한 공간을 묶자! 이게 바이트

변수 선언과 데이터 할당

변수변할 수 있는 수 혹은 변경 가능한 데이터가 담길 수 있는 공간

식별자는 어떤 데이터를 식별하는데 사용하는 이름 변수명

var a; //변수 a 선언
a = 'abc'; //변수 a 데이터 할당 
var a = 'abc'; // 변수 선언과 할당을 한 문장으로 표현 

요 플로우를 이해하는 게 중요해 해당 위치에 문자열 'abc'를 직접 저장하진 않고 별도의 메모리 공간을 확보해서 그 주소를 변수 영역에 저장하거든 요약하면 변수와 데이터를 별도의 공간에 나누어 저장(p.7)

(변수영역에 주소(1002,1003) 데이터(이름: 변수명 값:@5004) / 데이터영역에 주소(5004) 데이터(abc,,))

이렇게 하는 이유는 일단 숫자형 데이터의 경우는 64비트 공간을 확보하지만 문자열 데이터는 딱히 규격이 없음

그리고 중간에 데이터를 변환하는 상황이 생긴다면? 할 일이 너무 많아진다..

그래서 차라리 'abc'를 'abcd'로 변환시킬거면 새로운 공간을 다시 만들어서 그 주소를 연결하자

기본형(원시형) 데이터 참조형 데이터

불변값(기본형은 불변값)
바꿀 수 있으면 변수 없으면 상수 상수 ≠ 불변값
변수와 상수를 구분 짓는 건 변수 공간에 다른 데이터를 재할당할 수 있냐 > 변수 영역 메모리
반면 불변성 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역..

변경은 새로 만드는 동작을 통해서만 이뤄진다! 이 것이 불변값의 성질

//a 기존값에 def를 추가하면 기존 'abc'가 'def'로 변하는 것이 아니라 새로운 문자열 생성
//그 주소를 a에 저장하는 것 즉 'abc' 'abcdef' 별개의 데이터
var a = 'abc';
a = a + 'def';

// 데이터 공간에 5 저장. 그 주소를 변수 b에 저장 
// 변수 c에 5를 다시 저장할건데.. 데이터 영역에서 5를 찾고 그 주소를 재활용
// 기존에 저장했던 7이 있으면 재활용.. 아니면 다시 저장 
var b = 5; 
var c = 5; 
b = 7; 

가변값

참조형 데이터는 대부분 가변값

참조형 데이터는 객체의 변수(프로퍼티) 영역이 별도로 존재함 > 변수에는 다른값 대입이 얼마든지 가능하다

하지만 데이터 영역은 그대로 활용 > 데이터 영역은 불변값

변수를 복사하는 과정은 기본형 데이터와 참조형 데이터 모두 같은 주소를 바라보게 되는 점에서 동일하다 하지만 데이터 할당 과정에서 차이가 있어서 복사 이후의 동작에 차이 발생(p.17)

var a = 10; 
var b = a; 
var obj1 = {c: 10. d: 'ddd'};
var obj2 = obj1;

b = 15; 
obj2.c = 20;

a !== b
obj1 === obj2

위 예시를 따라 가보자면.. 기본형 데이터를 복사한 변수 b의 값은 달라짐

즉 a와b는 다른 주소를 바라보게 됨

참조형 값은(여기서 값은 변수영역의 주소) 달라지지 않는다

자스는 주솟값을 복사하는 과정이 한 번만 이뤄지고 참조형은 한 단계를 더 거치게 된다는 점!!! >> 여기는 복습 필수

그니까 문자열 숫자 같은 경우는 불변값이기 때문에 위 같이 해버리면 데이터 주소 값이 달라짐..

여기서 불변값이라는 건 만약에 값이 a = 10 에서 a = 20으로 바뀐다고 생각하면 아예 데이터 값을 새로 할당해서 하는거라 불변값이라고 하는거임!!

근데 객체의 경우엔 데이터 주소 값이 같음

그래서 객체는 불변 객체가 아닌거야!!!!

다만 객체도 내부 프로퍼티를 변할 때 하는 말이지

객체 자체에서 직접 변경하면 달라짐!

불변 객체 그리고 얕은 복사 깊은 복사

참조형 데이터의 '가변'은 데이터 자체가 아닌 내부 프로퍼티를 변경할 때만 성립

데이터 자체를 변경하면 기본형 데이터와 마찬가지로 기존 데이터는 변하지 않음

그렇다면 내부 프로퍼티를 변경할 때마다 매번 새로운 객체를 만들어 재할당한다면? 규칙을 정하거나 자동으로 새로운 객체를 만드는 도구를 활용한다면 좋겠지,,

얕은 복사는 바로 아래 단계의 값만 복사
깊은 복사는 내부의 모든 값들을 하나하나 찾아서 전부 복사하는 방법

undefined null

  • undefined
    사용자가 명시적으로 지정할 수도 있고 값이 존재하지 않을 때 자스에서
    자동으로 부여하기도 한다 여기서 자동으로 부여하는 경우는?
    어떤 값이 지정할 것이라고 예상되는데 그렇지 않을 경우..
  • 값을 대입하지 않은 변수
  • 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
  • return 문이 없거나 호출되지 않은 함수의 실행 결과
    undefind는 값이 대입하지 않은 변수에 접근하고자 할 때
  • null
    비어있음을 명시적으로 보여주자
profile
개발이 싫어.

0개의 댓글