일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- javascript value
- spring security
- JetBrains
- effectivejava
- javascript
- java.util.LinkedHashMap cannot be cast
- Spring
- nodeJS
- CAS
- javascript type
- 이펙티브 자바
- requestbody
- javascript 기초
- Redis
- ES6
- 자바
- Effective Java
- webpack
- webstorm
- java
- you don't know js
- 이펙티브자바
- Spring Session
- Intellij
- Babel
- spring batch #스프링 배치 #스프링 배치 중복 실행
- javascript 값
- ECMA2015
- javascript native
- 자바스크립트
- Today
- Total
귀찮지만 만들어보자
you don't know javascript 리뷰 - 3장 네이티브 본문
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()