코어자바스크립트
부트캠프를 다닐때 멘토님들에게 추천 받은 책으로 언제한번 공부해야지 생각하고 있었는데 이제서야 책을 공부할수 있었다.
우선 공부한 동료들에게 들었을때는 자바스크립트의 기초에서 좀더 딥한 내용을 배울수 있다고 들었었는데 사수님이 책을 슬쩍 보더니 컴공과 관련된 내용이 좀 있다고 하셨다. 그리고 공부를 하는데 자바스크립트 기초 데이터의 구조 부터 진짜 기초에 대해 배울수 있는 기회가 되었다.
회사에서 일이 끝날때 혹은 일이 없을때 1시간정도 읽는다.
읽다가 조금 어려운 내용이라서 이해가 안되서 멍해질때도 있다.
이 책은 대략 두번정도 봐야 완벽히 이해할수 있을것 같다
책을 보면서 조금씩 정리를 해놓고 여기다가 정리한 글을 적는다.
책 표지이다. 백호가 그려져 있어서 짱짱하니 멋지다🤔
데이터타입에는 참조형과 기본형으로 나뉘어져 있다.
기본형 : 할당이나 연산시 복제가 된다
참조형 : 참조가 된다.
하지만 두개 모두 복제가된다.
차이는 기본형은 값이 담긴 주소값을 바로 복제 하지만
참조 형은 값이 담긴 주소값을 담은묶음을 가리키는 주소값을 복제
모든 데이터는 메모리 주솟값을 통해서 서로 구분하고 연결할수 있다.
변수 영역과 데이터 영역을 나눠서 할당한다.
변수를 선언하면
예시로 1000단위 주소 값에 변수를 저장하고
변수 값
a= 10 처럼 할당한 10은 다른 주소값에 저장을한다.
변수값을 그리고 연결해 주는 방식으로 할당을 해서 연결을 바꿔가면서
변수 값을 교체할수가 있다
예)
변수 a 는 1000번대 주소값에 배치
10은 5000번대 주소 값에 배치하여 변수 a에 5000번대 값을 연결해준다.
만약 abc 를 변수에 대입하고 abcd 로 수정을 했을때
abcd 라는 값을 새로운 주소값에 추가를 하여 연결 시켜주는 방법을 한다.
삭제나 추가 어떠한 방법이든 새로 주소값에 추가를 하여 연결을 시켜준다.
수정을 하는 것이 더 데이터를 안쓰는 방법이고 최적화된 방법이라고 생각하지만
기존의 주소값에서 수정을 해서 공간을 넓히게 되면 넓힌 공간만큼 뒤에 설정된 주소 값들도 전부 변경해줘야 해서 최적화된 방법이아니게 된다.
기본형 데이터인 숫자, 불리언, 문자, undefined, null 등은 불변값입니다.
let a = 123
a+ 456
위에서 설명했던 것처럼 123 값과 123456의 값은 전혀 다른 주소를 가지고 있습니다.
let b = 5
let c = 5
b에서 5를 만들고 c에서는 5라는 수를 데이터에서 찾은후 있으면 재활용하고 없으면 새로 만듭니다.
이처럼 변경은 새로 만드는 동작을 통해서만 이루어집니다.
이것이 바로 불변값의 성질입니다.
가변값으로 객체나 배열을 생각할수가 있습니다.
객체의 할당은
변수와 데이터 그리고 객체의 값들 을 각각 새로운 주소값으로 배치합니다.
예시로 변수는 1000번대
데이터는 5000번대
7000번대에 객체의 값을 저장합니다.
객체의 이름은 1000번대에 저장되고 (obj) 값은 데이터 5000번대에 7000번대 값들을 모아서 저장합니다. 1000번대의 obj 에 5000번대의 모아진 값들을 연결합니다.
7000번대는 객체의 키와 값을 저장하는데 값은 5000번대의 데이터를 재활용 하거나
없을경우 5000번대에 생성하여 연결 하는 방식으로 사용됩니다.
1000 번대 obj
5000 번대 7001~7002
7000 번대 7001 이름 : a 값 : 5000번대 값
7002 이름 : b 값: 5000번대 값 없으면 5000번대에 값 만들기
obj = {a: 1, b : 2}
결국 객체도 불변값의 성질을 갖습니다.
만약 객체내부에 배열이 있는 경우
배열은 인덱스의 값으로 이름을 설정하고 값을 저장합니다.
8000번대에 저장을 하고 저장된 값들을 모아서 5000번대에 생성합니다.
만약 값이 없어질 경우 ( 새로운 데이터로 할당할 경우 기존 데이터는 어떻게 될까 )
참조 카운트 : 어떤 데이터에 자신의 주소를 참조하는 변수가 있을 경우 카운트가 올라간다.
카운트가 0이 되면 가비지 컬렉터에 들어가고 나중에 사라진다.
let a = 1;
let b = a;
변수 복사는 데이터를 재활용하여 참조한다.
하지만 객체일때 방법이 약간 다르다 .
바로 변수 복사 이후 재할당했을 때의 방법이 다른데
변수 b 라면 새로운 데이터를 새로 저장을 하고 그것과 연결하는 반면에
객체일때는 복사를 한 이후에 프로퍼티를 변경할때
데이터 모음 주소값은 그대로 유지 된채 새로 추가된 키와 벨류 값만 7000번대에 추가한다.
let obj = { c: 1 , d:2}
let obj2 = obj
obj2.c = 3;
위의 경우 데이터 모음 (객체의 값들을 모아두는 곳)은 그대로 유지 하고
객체의 값을 모아두는 곳에 변경된 값만 연결을 변경 시켜준다.
let obj = { c: 1 , d:2}
let obj2 = obj
obj2 = {c:2, d:4}
이경우는 아예 새로운 데이터 주소값을 참조하기 때문에
데이터 참조값이 새로 생성된다.
위처럼 내부 프로퍼티를 변경할때는 참조형이 가변 값이다 라고 설명이 되는 것입니다.
불변 객체는 전달받은 객체에 변경을가하더라도 원본 객체는 변하지 않아야 할 경우에 필요합니다.
undefined와 null 모두 비어 있는 값으로 나타낼수 있다.
이것의 차이점은 무엇일까
undefined가 등장하는 조건 (자바스크립트 엔진이 자동으로 부여하는때)
값을 대입하지 않은 변수
객체 내부의 존재하지 않는 프로퍼티에 접근할때
return 문이 없거나 호출되지 않는 함수에 접근
자동으로 부여된 undefined 는 데이터에 할당되지 않아 데이터주소가 없는 말그대로 비어있는 값이다. 하지만 사람들이 직접 undefined 라고 쓰면 데이터에 저장되어 undefined 라고 데이터에 저장되어서 그대로 호출되게 된다.
이 혼란을 없애기 위해서 undefined 는 자동으로 할당되도록 놔두는것이 좋고 직접 비어있는 값을 입력해야 할때는 null 을 사용하는 것이 좋다.
하지만 typeof 에서 null 은 객체를 뱉어 버리니 조심해서 사용할것
정의는 이러하다 실행할 코드에 제공할 환경 정보들을 모아놓은 객체 이다.
확실히 한번 읽고는 이해가 되지 않는다.
정리를 하다가도 내용이 너무 벅차서 정리를 못한 부분이 있다.
그 부분은 한번더 읽고 다시 정리를 해야 할것 같다.
지금은 맘편히 한번 쭉 훑어보는 느낌으로 읽고 있다.
1장도 읽는데 시간이 잘 안나기도 해서 오래걸리긴 했다