UX Engineer 이명종

자바스크립트 코어 - 데이터 타입

자바스크립트 코어 - 데이터 타입

목차

데이터 타입의 종류

불변성(Immutable) 이란 기존의 값을 그대로 유지하면서 새로운 값을 추가하는 것으로 객체가 생성된 이후 그 상태를 변경할 수 없는 디자인 패턴

데이터 타입의 종류    
Primitive type (기본형) Reference type (참조형)  
Number Array  
String Function  
Boolean Date  
null RegExp  
undefined Map, WeakMap  
Symbol Set, WeakSet  

데이터 타입의 배경지식

1. 메모리와 데이터

비트(Bit) : 0 또는 1만 표현할 수 있는 하나의 메모리 조각
바이트(Byte) : 8개의 비트로 구성되는 단위

2. 식별자와 변수

변수와 데이터 할당

1. 변수 선언

var a;

변수 선언에 대한 메모리 영역의 변화

             
주소 ··· 1002 1003 1004 1005 ···
데이터     이름: a
값:
     

2. 데이터 할당

var a; // 변수 a선언
a = "abc"; // 변수 a에 데이터 할당

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

데이터 할당에 대한 메모리 영역의 변화

               
변수 영역 주소 ··· 1002 1003 1004 1005 ···
변수 영역 데이터     이름: a
값: @5004
     
데이터 영역 주소 ··· 5002 5003 5004 5005 ···
데이터 영역 데이터       ‘abc’    

문자열 반환에 대한 메모리 영역의 변화

             
주소 ··· 1002 1003 1004 1005 ···
데이터     이름: a
값: @5005(변경됨)
     
주소 ··· 5002 5003 5004 5005 ···
데이터       ‘abc’ ‘abcdef’  

기존(@5004) 데이터는 자신의 주소를 저장하는 변수가 하나도 없게 되면 가비지 컬렉터의 수거 대상이 됨

데이터 타입의 종류

1. 불변값

불변성

var a = "abc";
a = a + "def";

2. 가변값

3. 변수 복사

var a = 10;
var b = a;

var obj1 = { c: 10, d: "ddd" };
var obj2 = obj1;
             
변수 영역 주소 1001 1002 1003 1004 ···
변수 영역 데이터 이름: a
값: @5001
이름:b
값: @5001
이름: obj1
값: @5002
이름:obj2
값:@5002
 
데이터 영역 주소 5001 5002 5003 5004 ···
데이터 영역 데이터 10 @7103 ~ ? ‘ddd’    
         
객체 @5002의 변수 영역 주소 7103 7104 ···
객체 @5002의 변수 영역 데이터 이름:c
값:@5001
이름:d
값:@5003
 

불변 객체

얕은 복사

var copyObject = function (target) {
  var result = {};
  for (var prop in target) {
    result[prop] = target[prop];
  }
  return result;
};

var user = {
  name: "Jaenam",
  urls: {
    portfolio: "http://github.com/abc",
    blog: "http://blog.com",
    facebook: "http://facebook.com/abc",
  },
};
var user2 = copyObject(user);
user2.name = "Jung";

console.log(user.name === user2.name); // false

user.urls.portfolio = "http://portfolio.com";
console.log(user.urls.portfolio === user2.urls.portfolio); // true

user2.urls.blog = "";
console.log(user.urls.blog === user2.urls.blog); // true

깊은 복사

var copyObjectDeep = function (target) {
  var result = {};
  if (typeof target === "object" && target !== null) {
    for (var prop in target) {
      result[prop] = copyObjectDeep(target[prop]); // 재귀적 호출
    }
  } else {
    result = target;
  }
  return result;
};

// 결과
var obj = {
  a: 1,
  b: {
    c: null,
    d: [1, 2],
  },
};
var obj2 = copyObjectDeep(obj);

obj2.a = 3;
obj2.b.c = 4;
obj.b.d[1] = 3;

console.log(obj); // { a: 1. b: { c: null, d: [1, 3] } }
console.log(obj2); // { a: 3. b: { c: 4, d: { 0: 1, 1: 2 } } }

undefined 와 null

1. undefined

let, const 키워드는 LE가 활성화 될 때 생성되지만 실제 변수가 평가되기 전까지는 해당변수에 접근 불가

2. null

typeof null 로 타입 체크시 object 라는점에 유의 (자바스크립트 자체 버그)


Share this: