개발일지

2023.10.20. TIL JavaScript 3주차 (1) 데이터 타입

이경욱 2023. 10. 20. 16:24

1. 데이터 타입 (Data type)의 종류

  // 1. 데이터 타입(Data type)
    // (1) 기본형 (Primitive type)
      // a. Number
      // b. String
      // c. Boolean
      // d. null
      // e. undefined
      // f. Symbol
    // (2) 참조형 (Reference type)
      // A. 객체 (Object)
        // a. Array
        // b. Function
        // c. Date
        // d. RegExp
        // e. Map, WeakMap
        // f. Set, WeakSet

 

기본형과 참조형을 나누는 기준?

1. 값의 저장방식

기본형 : 주소값을 복제

참조형 : 주소값 묶음의 주소값을 복제

 

2. 불변성 여부

기본형 : 불변성을 띔 

참조형 : 불변성을 띄지 않음

 

 

변수 = 데이터

식별자 = 변수명

 

2. 데이터 영역

변수 영역 주소 1001 1002 1003
데이터 이름 : str
데이터 : 5001
obj1 / 7101~7102  

변수 : 변수 영역 메모리를 변경할 수 있음

상수 : 변수 영역 메모리를 변경할 수 없음

 

데이터 영역 주소 5001 5002 5003
데이터 'test' 1 2
참조형 데이터 영역 주소 7101 7102 7103
데이터 a / 5002  b / 5003  

* 참조형 데이터는 별도 저장공간(obj1을 위한)이 필요하다.

* 참조형 데이터 영역은 데이터 영역 주소값을 변경할 수 있기에 가변하다.

 

불변하다 : 데이터 영역 메모리를 변경할 수 없음

불변하지 않다 : 데이터 영역 메모리를 변경할 수 있다.

 

 

데이터에 데이터 값을 바로 넣지 않고 주소값을 넣는 이유?

(1) 자유로운 데이터 변환

숫자는 8byte로 고정이지만 문자는 고정이 아니다 (영문 1byte, 한글 2byte)

따라서, 1001 주소에 할당된 데이터를 변경하려고 할 때 보다 큰 데이터를 저장하려면 

1004 이후부터 저장된 데이터를 다 미뤄야한다.

이걸 방지하기 위해 주소값을 넣는 것.

 

(2) 메모리의 효율적인 관리

같은 데이터의 변수들이 있을 때 데이터 저장 공간의 여유를 위해서

 

3. 객체의 복사

1. 얕은 복사

copyObject

 

2. 깊은 복사

재귀적 수행 (함수나 알고리즘이 자기 자신을 호출하여 반복적으로 실행하는 것)

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;
}

 

4. undefined, null

'없다'를 명시적으로 표현할 때는 undefined가 아닌 null을 사용해야 한다.

 

var n = null;

// 동등연산자
n == undefined // true
n == null //true

// 일치연산자
n === undefined // false
n === null // true

동등연산자를 사용하면 null과 undefined는 true로 나오지만

일치연산자를 사용하면 타입까지 맞아야 하기 때문에 false로 반환된다.