개발 공부/JavaScript

데이터 타입

무우너대갈 2022. 7. 12. 22:46
반응형

데이터 타입의 종류

  • 기본형(primitive type)
    • number(숫자)
    • string(문자열)
    • boolean(불리언)
    • null
    • undefined
    • symbol
      • Symbol() 함수로 생성(호출될 때마다 Symbol 값 생성
      let mySymbol = Symbol();
      
      console.log(mySymbol); //Symbol()
      console.log(typeof mySymbol); //symbol
      
      • new 연산자 사용 X
      new Symbol(); //TypeError : Symbol is not a constructor
      
      • Symbol()에는 문자열을인자로 전달 가능(설명용, 디버깅 용도로 사용됨)
      let symbolWithDesc = Symbol('chaz');
      
      console.log(symbolWithDesc); //Symbol(chaz)
      console.log(symbolWithDesc === Symbol('chaz')); //false
      
      
    • : 이름의 충돌 위험이 없는 유일한 객체의 프로퍼티 키(property key)를 만들기 위해 사용
  • : 불변성을 띔(값이 담긴 주솟값을 바로 복제)
  • 참조형(reference type)
    • object(객체)
    • array(배열)
    • function(함수)
    • date(날짜)
    • regexp(정규표현식)
  • : 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값 복제

변수 선언과 데이터 할당

  • 변수 영역에 값을 직접 대입하지 않는 이유
    • 데이터 변환을 자유롭게 하기 위함
    • 메모리를 효율적으로 관리
  • 값을 변경할 때
    1. 별도의 공간에 저장
    2. 새롭게 생성한 주솟값을 변수 공간에 연결

기본형 데이터와 참조형 데이터

  • 중첩 객체의 프로퍼티 할당
    • 참조 카운트*가 0이 되면 가비지 컬렉터**의 수거 대상
  • JS의 모든 데이터 타입은 참조형 데이터 타입
    • 기본형은 주소를 복사하는 과정이 한번만 이루어짐
    • 참조형은 한 단계를 더 거침 

불변 객체

  • 얕은 복사와 깊은 복사
var user = {
	name : 'Chaz',
	urls : {
		github : 'https://github.com/Huiri',
		blog : 'https://ooctopushead.tistory.com/'
	}
};

//shallow copy function
var copyObject = function(target) {
	var result = {};
	for(var prop in target) {
		result[prop] = target[prop];
	}
	return result;
};
  • 얕은 복사(shallow copy)
  • : 바로 아래 단계의 값만 복사
var user2= copyObject(user);

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

user.urls.github = '<https://github.com/GDSC-Daejin>';
console.log(user.urls.github === user2.urls.github);  //true

user.urls.blog = '';
console.log(user.urls.blog === user2.urls.blog);  //true
  • 깊은 복사(deep copy)
  • : 내부의 모든 값들을 하나하나 찾아서 복사
var user2= copyObject(user);
var user2.urls = copyObject(user.urls);

user.urls.github = '<https://github.com/GDSC-Daejin>';
console.log(user.urls.github === user2.urls.github);  //false

user.urls.blog = '';
console.log(user.urls.blog === user2.urls.blog);  //false
//deep copy function
var copyObjectDeep = function(target) {
	var result = {};
	if(typeof target === 'object' && target !== null){
		//null의 typeof 가 object임
		for(var prop in target) {
			result[prop] = copyObjectDeep(target[prop]);
		}
}	else {
		result = target;
}
	return result;
};
//deep copy function by JSON
var copyObjectViaJSON = function(target) {
	return JSON.parse(JSON.stringify(target));
};

undefined와 null

  • undefined
    • 사용자가 명시적 지정
    • 자바스크립트 엔진이 자동 부여
      1. 값을 대입하지 않은 변수
      2. (데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근 시)
      var a;
      console.log(a);  //undefined
      
      1. 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
var obj = {a : 1};
console.log(obj.b); //undefined
console.log(b); //ReferenceError : b is not defined
  1. return 문이 없거나 호출되지 않는 함수의 실행 결과
var func = function() {};
var c = func();
console.log(c); //undefined
  • null
    • 비어있음을 명시적으로 나타내기 위한 타입
    • typeof null === object
    var n = null;
    console.log(typeof n); //object
    
    console.log(n == undefined); //true
    console.log(n d== null); //true
    
    console.log(n === undefined); //false
    console.log(n === null); //true
    
     

 

*참조 카운트

  : 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수

**가비지 컬렉터

  : 런타임 환경에 따라 특정 시점이나 메모리 사용량이 포화 상태에 임박할 때마다 자동으로 수거 대상들을 수거

반응형

'개발 공부 > JavaScript' 카테고리의 다른 글

this  (0) 2022.07.14
실행 컨텍스트  (0) 2022.07.13
ES11에 추가된 문법!  (0) 2022.01.28
ES6에 추가된 문법!  (0) 2022.01.27
12. async, await  (0) 2022.01.26