JavaScript - 데이터 타입

euNung·2022년 6월 25일
0

JavaScript

목록 보기
1/7
  • 기본형
    - 값이 담긴 주솟값을 복제
    - 숫자 / 문자열 / 불리언 / null / undefined / Symbol
    - 불변성

  • 참조형
    - 값이 담긴 주솟값들로 이루어진 묶음을 자리키는 주소값을 복제
    - 객체(object) / 배열(array) / 함수 / 날짜(Date) / 정규표현식 / Map / WeakMap / Set / WeakSet
    - 기본적인 성질은 가변값인 경우가 많지만,
    설정에 따라 변경 불가능한 경우(Object.defineProperty, Object.freeze 등)도 있고, 아예 불변값으로 활용하는 방안도 있음

💜 자바스크립트의 모든 데이터 타입은 참조형 데이터
=> 어떤 데이터 타입이든 변수에 할당하기 위해서는 주솟값을 복사해야하기 때문

💛 C/C++, 자바 등의 정적 타입 언어는 메모리의 낭비를 최소화하기 위해 데이터 타입별로 할당할 메모리 영역을 2byte, 4byte 등으로 나누어 정해놓음.
💛 but, 메모리 용량이 과거보다 월등히 커진 상황에서 등장한 자바스크립트는 상대적으로 메모리 공간을 좀 더 넉넉하게 할당
=> 숫자의 경우 정수형인지 부동소수형인지 구분하지 않고 8byte를 확보


  • 변수
    : 변할 수 있는 수 in 수학
    : 변할 수 있는 무언가(= 데이터) in 컴퓨터 용어
  • 식별자
    : 어떤 데이터를 식별하는데 사용하는 이름(= 변수명)
let a;        // 변수 선언 - 1), 2)
a = 'abc';    // 데이터 할당 - 3), 4)
/*
1) 명령을 받은 컴퓨터는 메모리에서 비어잇는 공간 하나를 확보(주소값 설정)
2) 이 공간의 이름(식별자)를 'a'로 지정
3) 데이터를 저장하기 위한 별도의 메모리 공간을 확보한 후 문자열 'abc'를 저장
4) 데이터를 저장한 주소(3)를 변수 선언한 영역(1)에 저장
*/

🧡 변수와 데이터 영역을 분리하면 중복된 데이터에 대한 처리 효율이 높아짐
🧡 기존 문자열에 어떤 변환을 가하든 상관 없이 무조건 새로 만들어 별도의 공간에 저장
=> 기존 데이터는 자신의 주소를 저장하는 변수가 하나도 없게 되면 가비지 컬렉터의 수거 대상이 됨
🧡 참조 카운트: 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수
=> 참조 카운트가 0인 메모리 주소는 가비지 컬렉터의 수거 대상

  • 객체의 변수 복사

    • 객체의 프로퍼티 변경

      let obj1 = { a: 1, b: 'aaa' };
       let obj2 = obj1;
      
       obj2.a = 20;
       /* 결과
       obj1 = { a: 20, b: 'aaa' }
       obj2 = { a: 20, b: 'aaa' }
       => obj1 === obj2
       */
    • 객체 자체 변경

       let obj1 = { a: 1, b: 'aaa' };
        let obj2 = obj1;
      
        obj2 = { a: 20, b: 'aaa' };
        /* 결과
        obj1 = { a: 1, b: 'aaa' };
        obj2 = { a: 20, b: 'aaa'}
        => obj1 !== obj2
        */
  • 불변 객체 만들기

    • 얕은 복사: 바로 아래 단계의 값만 복사
      let copyObject = function(target) {
        	let result = {};
        	for (let prop in target) {
          	result[prop] = target[prop];
       	 }
        	return result;
       };
    • 깊은 복사: 내부의 모든 값들을 하나하나 착아서 전부 복사
      // 방법1)
       let copyObjectDeep = function(target) {
        	let result = {};
        	if (typeof target === 'object' && target !== null) {
            	for (let prop in target) {
          		result[prop] = copyObjectDeep(target[prop]);
       	 } else {
             	result = target;
           }
        	return result;
       };
      // 방법2)
       let copyObjectViaJSON = function(target) {
        	return JSON.parse(JSON.stringify(target));
       };

  • undefined
    • 사용자가 명시적으로 지정
    • 자바스크립트 엔진이 자동으로 부여하는 경우
      1) 값을 대입하지 않은 변수
      2) 객체 내부의 존재하지 않는 프로퍼티에 접근할 때
      3) return 문이 없거나 호출되지 않는 함수의 실행 결과
  • null
    : 사용자가 명시적으로 지정
    : typeof null의 값은 object => 자바스크립트 자체 버그

💚 undefined와 null의 혼란을 피하기 위해 undefined는 직접 할당하지 않고 자바스크립트 엔진이 반환하는 경우에만 해당하도록 하고, '비어있음'을 명시적으로 나타내고 싶을 때는 null을 쓰도록 하는 것이 좋음

profile
프론트엔드 개발자

0개의 댓글