bass
article thumbnail
Published 2023. 8. 23. 14:40
JS 정리 JS

기본형 / 참조형

데이터는 기본형이거나 참조형이다.

기본형

기본형은 원시값의 주소를 가리킨다.

값을 바꿔도 원시값을 가리키는 주소가 바뀌는 것이지, 같은 주소 안에서 원시값이 바뀌는 것이 아니다.

그래서 주소안의 값은 불변으로 여긴다.

 

a = 1;

b = a;

a, b 둘다 '1이 담겨있는 주소'를 가리키고 있다.

 

a === b;

둘은 같은 주소이기 때문에 true이다.

 

a = 2;

새로운 주소에 2를 할당하고 a가 그곳의 주소를 가리키게 된다.

이때, 1을 담고있는 공간에는 어떠한 변화도 없다. (즉, 불변하다)

 

후에 아무도 1을 가리키지 않는다면 각 JS 엔진의 GC가 적당한 시기에 1을 담고있는 공간을 비운다.

참조형

참조형은 데이터가 아니라 그룹의 주소를 가리킨다.

그룹의 주소는 바뀌지 않지만 그룹 안의 필드의 개수, 필드의 주소는 변경될 수 있다.

그래서 가변으로 여긴다.

 

기본형은 모두 불변값이고 참조형은 보통 가변값임, 참조형에서 '모두'가 아니라 '보통'인 이유?

⇒ Object.freez 등으로 참조형도 불변하도록 만들 수 있기 때문이다.

 

A = { a: 1 };

B = A;

A, B 둘다 '{ a: 1 }'그룹의 대표 주소를 가리키고 있다.

 

A === B;

둘은 같은 주소이기 때문에 true이다.

 

A.a = 2;

새로운 공간에 2를 할당하고 A.a가 그곳의 주소를 가리키게 된다.

이때, A는 여전히 같은 주소를 가리키지만 A.a는 변화하였다. (즉, 가변하다)

 

원시값의 점 표기법

원시값은 객체가 아니기 때문에 점 표기법으로 필드를 찾는 것이 불가능해야 한다.
하지만 JS에서는 점 표기법을 사용하면 일시적으로 원시값을 wrapper 객체로 감싸준다.
따라서'a'.length ,3.14.toFixed() 가 가능하다.

실행 컨텍스트

'함수가 실행되는 시점''실행에 필요한 정보'를 수집하여 만들어진 객체.
실행에 필요한 정보?
VariableEnvironment, LexicalEnvironment, ThisBinding
Environment?
environmentRecord + outerEnvironmentReference

스코프

식별자의 유효 범위.
⇒ [len, const === 블럭 스코프] / [var === 함수 스코프]
스코프 체이닝
outerEnvironmentReference를 통해 렉시컬 스코프(선언 시점)의 식별자를 참조 가능하다.

⇒ 이때, '실행 시점'의 내부 함수가 '선언 시점'의 외부 함수의 식별자를 참조할 수 있는데, 이를 클로저라고 한다.

프로토타입

new 키워드로 함수를 호출하면 인스턴스가 생성된다. (화살표 함수는 안된다.)
인스턴스는 함수.prototype을 참조하는__proto__ 필드가 존재한다.
인스턴스에 필드가 없어도 최상단 프로토타입까지 필드를 찾는다.

JS의 클래스

클래스의 생성자함수가 함수의 역할,

클래스의 필드, 메서드가 함수.prototype의 역할이다.

클로저

실행 컨텍스트가 빠진 스코프의 식별자를 참조하는 것.
식별자의 참조카운트가 0이 되지 않아서 GC되지 않기 때문에 참조 가능하다.

콜백함수

A함수의 인자로 B함수를 줄때, B함수를 콜백함수라고 한다.

이때, B함수의 제어권은 A함수에게 있다.

제어권이란

1. 호출시점

2. 전달하는 인자

3. this 바인딩

을 뜻한다.


B함수의 제어권이 A함수에게 있다는 것은 곧,

A함수가

1. 원할 때

2. 원하는 인자로

3. A함수의 this로 바인딩

해서 B를 호출한다는 것이다.

화살표함수

자신의 this가 없다.
⇒ this 바인딩이 없다 => 화살표함수에도 this는 존재한다. 다만 정의될 때, 상위 스코프의 this를 참조하여 만들어진다.

 

화살표 함수에 call, apply, bind 함수를 사용할 때는 this는 바인딩 되지 않고, 인자만 바인딩 된다.

Promise

resolve, reject 둘 중 가장 먼저 실행되는 것만 실행하고 나머진 무시된다.
then의 반환값에 then을 또 호출하면 이전 thenreturn 값을 인자로 받을 수 있다.

 

'JS' 카테고리의 다른 글

JavaScript / shift 안쓰고 BFS 구현하기  (0) 2023.01.29
profile

bass

@bassyu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!