반응형
데이터 타입의 종류
- 기본형(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(정규표현식)
- : 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값 복제
변수 선언과 데이터 할당
- 변수 영역에 값을 직접 대입하지 않는 이유
- 데이터 변환을 자유롭게 하기 위함
- 메모리를 효율적으로 관리
- 값을 변경할 때
- 별도의 공간에 저장
- 새롭게 생성한 주솟값을 변수 공간에 연결
기본형 데이터와 참조형 데이터
- 중첩 객체의 프로퍼티 할당
- 참조 카운트*가 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
- 사용자가 명시적 지정
- 자바스크립트 엔진이 자동 부여
- 값을 대입하지 않은 변수
- (데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근 시)
var a; console.log(a); //undefined- 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
var obj = {a : 1};
console.log(obj.b); //undefined
console.log(b); //ReferenceError : b is not defined
- 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 |