1.데이터 타입

기본형과 참조형

기본형은 값이 담긴 주솟값을 바로 복제하는 반면, 참조형은 갑ㅈㅅ이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다르다.

변수

변수는 수를 의미하는게 아니라 변할수있는 무언가 라고 이해해야한다. 무언가 === 데이터
  • 변수영역과 데이터영역을 분리하면 중복된 ㄴ데이터에 대한 처리 효율이 높아진다.
  1. '변수영역'에서 빈 공간을 확보한다.
  1. 확보한 공간의 식별자를 a로 지정한다. (a 선언)
  1. '데이터영역'의 빈공간에 문자열 'abc'를 지정한다.
  1. '변수영역'에서 a라는 식별자를 검색한다.(a의 주소값)
  1. 앞서 저장한 문자열의 주소를 변수영역의 공간에 대입한다.

불변값

변수(variable)와 상수(constant)를 구분하는 성질은 '변경 가능성'이다.
변수와 상수를 구분짓는 변경 가능성의 대상은 '변수영역'의 메모리이다.
반면, 불변성 여부를 구분할 때의 변경 가능성의 대상은 '데이터영역'의 메모리이다.
var a = 'abc'; a = a + 'def'; var b = 5; var c = 5; b = 7;
변수 a에 문자열 'abc'를 할당하고 'def'를 추가하면, 기존의 변수가 바뀌는게아니라, 새로운 문자열 'abcdef'를 만들어 그 주소를 변수 a에 저장한다.
변수 b에 숫자 5를 할당한다, 데이터영역에서 숫자 5를 찾고, 없으면 데이터 공간을 하나 만들어 저장한다. 그리고 그 데이터영역의 주소값을 b에 저장한다.
변수 c에 숫자 5를 할당한다, b에 저장한 데이터영역의 숫자 5를 재활용한다.
변수 b의 값을 7로 바꾸고자한다면, 기존에 저장된 데이터의 5를 7로 바꾸는게 아니라 기존엔 7이라는 데이터가 있으면 재활용을하고, 없으면 새로 만들어서 b에 저장한다.
이처럼 문자열 값도 한 번 만든 값을 바꿀 수 없고, 숫자 값도 다른 값으로 변경할 수 없다. 변경은 새로 만드는 동작을 통해서만 이루어진다. => 불변값의 성질
한번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.

가변값

기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다.
'데이터영역'에서는 기존의 메모리 공간을 그대로 활용하고 있다.
변수에는 다른 값을 얼마든지 대입할 수 있다. 참조형데이터는 불변하지않다. (가변값이다)

가비지 컬렉터

런타임 환경에 따라 특정 시점이나 메모리 사용량이 포화 상태에 임박할 때마다 자동으로 수거 대상들을 수거(collecting)한다.
수거된 메모리는 다시 새로운 값을 할당할 수 있는 빈 공간이 된다.

깊은 복사

const 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 } let obj = { a: 1, b:{c:null,d:[1,2]}}; let obj2 = copyObjectDeep(obj) obj2.a = 3; obj2.b.c = 4; obj.b.d[1] = 3; console.log(obj); console.log(obj2);
  • 간단하게 깊은 복사 처리하는 방법 객체를 JSON 문법으로 표현된 문자열로 전환했다가, 다시 JSON객체로 바꾼다.
let copyObjectViaJSON = function(target){ return JSON.parse(JSON.stringify(target)) } let obj = { a:1, b: { c:null, d:[1,2], func1:function(){console.log(3)} }, func2:function(){console.log(4);} } let obj2 = copyObjectViaJSON(obj); obj2.a = 3; obj2.b.c = 4; obj.b.d[1] = 3; console.log(obj) console.log(obj2)
It works!

undefined와 Null

의미는 같은것같지만, 미세하게 다르고, 사용목적 또한 다르다.
  • undefined의 경우
  1. 값을 대입하지 않은 변수, 데이터영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때,
  1. 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
  1. return 문이 없거나 호출되지 않는 함수의 실행 결과
자바스크립트 버그
let n = null; console.log(typeof n) //object console.log(n == undefined) //true console.log(n == null); // true console.log(n===undefined) // false; console.log(n===null); //true
null이라는 기능이있기때문에 undefined라고 직접 할당하지 말자.