귀찮지만 만들어보자

you don't know javascript 리뷰 - 3장 네이티브 본문

카테고리 없음

you don't know javascript 리뷰 - 3장 네이티브

타우렌주술사 2017. 12. 24. 13:41

3. 네이티브 
사실 네이티브는 내장함수다 ex) String()

var s = new String("Hello World");
console.log(s.toString()); // "Hello World"

- 생성자처럼 사용 가능하지만 살짝 다름
- 만약 생성자였다면 typeof 연산자를 먹였을 때 string이 나와야겠지만 이것은 object를 뱉어낸다
이거 뭐 어쩌라는건지 모르겠다

3-1. 내부 [[Class]]
- typeof가 object인 값에는 [[Class]] 라는 내부 프로퍼티가 추가로 붙는다
- 직접 접근은 불가능하고, Object.prototype.toString.call() 과 같은 함수를 호출해서 불러낼 수 있다 ex) [object Array]
- 원시 값에도 [[Class]]가 있다. null -> [object Null], undefined -> [object Undefined]
- 나머지 타입들은 boxing 과정을 거쳐서 타입을 뱉는다

3-2 래퍼 박싱하기
- 원시 값에는 프로퍼티나 메서드가 없다 (이거는 좀 와닿는다) 
- .length, toString()으로 접근하려면 원시 값을 박싱해줘야 하는데 자바스크립트는 이것을 알아서 해준다 (이것도)

var a = "abc";
a.length; // 3
a.toUpperCase(); // "ABC"

- 변수에 값을 입력하면 알아서 boxing 해준다
- 아래 짤과 같이 괄호 ()로 감싸면 또 알아서 boxing 해준다. 문자열은 그것도 필요없나보다 (크롬 기준?)




3-3. 언박싱
- 객체의 원시값은 valueOf() 함수로 가져온다.

var a = new String("abc");
a.valueOf(); // 이런식으로

var b = a + ""; // b에는 언박싱된 원시값 "abc"가 대입됨

typeof a; // object
typeof b; // string

3-4. 네이티브, 나는 생성자다
- 확실히 필요해서 쓰는게 아니라면 생성자는 가급적 쓰지 않는편이 좋다
- 가급적이면 리터럴 방식으로 객체를 생성하자

3-4-1. Array()

var a = new Array(1,2,3);
a; // [1,2,3]
var b = [1,2,3];
b; // [1,2,3]

var c = new Array(3); // 이렇게 되면 배열에 3을 넣는게 아니라 길이를 3으로 지정하는 것이다 -_-;

- 이것만 보더라도 생성자는 잘 모르고 쓰면 안된다는 것을 알 수가 있다

3-4-2. Object(), Function(), RegExp()
- 이 친구들도 마찬가지로 분명한 의도가 있는게 아니라면 리터럴 방식을 사용하는 편이 낫다

3-4-3. Date(), Error()
- 이 둘은 리터럴 형식이 없다.
- Error() 객체는 디버깅에 유용하게 사용이 가능함.

3-4-4. Symbol() (ES6 이후에 사용가능)
- 새로운 원시 값 타입
- 충돌 염려없이 객체 프로퍼티로 사용가능한 '유일한 값'
- 사용할때 new를 붙이면 에러가 발생
- ES6을 제대로 써본적이 없어서 잘 모르겠다

3-4-5. 네이티브 프로토타입
- 내장 네이티브 생성자 (위에서 언급된 것들)는 각각의 .prototype 객체를 가진다
- 각 생성자에 따라 유용한 기능을 갖고 있다.
- ex) Array.prototype.push(), String.prototype.substr()