티스토리 뷰
https://www.notion.so/simsimjae/2-3999b2a7ca8b4083960986c771376db0
#2 자바스크립트의 원시타입
기초잡기
자바스크립트는 객체
또는 원시타입
두가지 자료형만 존재한다.
- string
- number
- undefined
- null
- bool
- symbol(
ES6
에서 도입)
위 6개를 제외한 나머지는 모두 객체
이다.
원시타입
원시타입은 변하지 않는다. → 한번 값을 넣으면 수정할 수 없다.
원시타입들은 값
그자체로 저장되지만 객체타입은 참조
형태로 변수에 저장된다.
14 === 14 // true , 값이 같기 때문
[] === [] // false
{} === [] // false , 참조값이 다르기 때문
함수는 1급 객체이다.
인자
로 넘겨질 수 있다.변수
나배열
에 할당 가능하다.리턴값
으로도 넘겨질 수 있다.
함수를 생성자로 쓰고 싶을때는 무조건 new
키워드를 붙여서 사용해야 한다.
그렇지 않으면, 그냥 일반 함수 호출로 실행되고 함수 내부에서 this
가 현재 컨텍스트를 가리키기 때문에 글로벌 컨텍스트인 window
객체의 프로퍼티가 초기화 되어 버린다.
new
키워드를 붙여서 함수를 생성자로 호출하게 되면 this
가 현재 컨텍스트인 새로 생성된 객체에 맵핑 되기 때문에 정상 동작한다.
Wrapper Object(래퍼 객체)
String()
는 인자를 문자열로 바꿔주는 함수이다.
String(1337); // "1337"
String(null); // "null"
String(true); // "true"
이 함수에 new
키워드를 붙여서 사용하게 되면 생성자로 동작하는데,new String("dog");
와 같이 실행 시키면
{
0: "d",
1: "o",
2: "g",
length : 3
}
이와 같이 문자열을 포장하는 객체
를 만들어서 리턴해준다.
오토박싱(Auto-Boxing) - 1
const pet = new String("dog");
pet.constructor === String; // true
String("dog").constructor === String; // true
한줄씩 살펴보자.
const pet = new String("dog");
-
String함수를 생성자로 호출했고 "dog"을 인자로 전달했다.
-
String 래퍼 객체가 생성되었다.
-
이 객체는
[[prototype]]
링크로 String() 함수의프로토타입 객체
를 가리킨다. -
pet이라는 참조변수는 이 객체를 가리키고있다.
pet.constructor === String; // true
-
pet에는
constructor
속성이 없다. -
프로토타입 체이닝이 일어나서
프로토타입
의constructor
가 가리키는걸 확인해보니 String()함수이다. -
그렇기 때문에 true가 나온것이다.
여기까지는 지금까지 알고 있는 지식으로 아무런 문제가 없다.
String("dog").constructor === String; // true
- String("dog")이 실행되면 "dog" 이라는 원시타입 문자열이 리턴된다.
- "dog".constructor === String 문장이 실행되는데, 여기서 어떻게 원시타입이
constructor
라는속성
을 갖는가?가 의문이다. - JS 인터프리터가 이 원시타입을 래퍼객체로 자동으로 감싸주기 때문에 이런일이 가능한것이다.
- 래퍼객체로 변환된 "dog"는 위와 같은 과정이 일어나고 마찬가지로 true가 리턴된다.
- 래퍼 객체를 모두 사용하고 난 뒤 이 래퍼객체를 지워버린다.
이 세번째 줄에서 원시타입을 래퍼객체로 자동으로 변환해주는 과정을 오토박싱
이라고 한다.
오토박싱 - 2
const foo = "bar";
foo.length; // 3
foo === "bar"; // true
여기서 두번째 줄을 살펴보자.
foo.length; // 3
- foo는 원시타입이다. 그런데 length라는 프로퍼티에 접근하고 있는데도 오류가 안난다.
- JS가 foo를 감싸는 래퍼객체를 만들고나서 length 프로퍼티를 사용한다.
- 다 사용하고 나서 2번째 줄이 끝나게 되면 래퍼객체를 지운다.
- 에러 없이 잘 동작한다.
오토박싱 - 3
const foo = 42;
foo.bar = "baz"; // Assignment done on temporary wrapper object
foo.bar; // undefined
래퍼객체에 프로퍼티를 할당했는데 이 프로퍼티는 두번째줄이 지나게 되면 쓸모 없는 프로퍼티가 되어버린다. 그래서 세번째줄에서 undefined가 출력된것이다.
undefined
나 null
는 따로 래퍼객체가 없기 떄문에 주의해야 한다.
String
, Number
, Boolean
에 대해서는 오토박싱이 동작한다.
'Javascript' 카테고리의 다른 글
#4 암묵적 타입 변환 (0) | 2019.07.29 |
---|---|
#3 값 vs 참조 (1) | 2019.07.29 |
#1 자바스크립트 함수 실행의 이해 - 콜스택, 이벤트루프, Task, 실행컨텍스트 (0) | 2019.07.29 |
[JS] ==, ===, 값에 의한 비교, 참조에 의한 비교 (0) | 2019.06.17 |
자바스크립트로 OOP 구현하기 (0) | 2019.06.17 |
- Total
- Today
- Yesterday
- storybook
- typescript
- es6
- async
- react hooks
- rendering scope
- useRef
- mobx
- webpack
- return type
- computed
- promise
- reducer
- server side rendering
- atomic design
- Babel
- design system
- Next.js
- reactdom
- Action
- props
- react
- state
- useEffect
- reflow
- Polyfill
- hydrate
- await
- javascript
- type alias
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |