[YOU DON'T KNOW JS] 3. 네이티브
네이티브
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbol()
대표적인 자료형
하지만 자바와 달리 String()이 String이 아니고 Object 이다.
내부 [[ Class ]]
typeof가 ‘object’인 값(배열 등)에는 [[class]]라는 내부 프로퍼티가 추가로 붙는다. 이 프로퍼티는 직접 접근할 수 없고 Object.prototype.toString()라는 메서드에 값을 넣어 호출합니다.
래퍼 박싱
var a = "abc";
a.length; // 3
a.toUpperCase(); // "ABC"
객체 래퍼의 함정
var a = new Boolean(false);
if(!a){
console.log("Oops"); // 실행되지 않는다.
}
false를 객체 래퍼로 감쌌지만 문제는 객체가 ‘truthy’란 점. 그래서 예상과는 달리, 안에 들어있는 false 값과 반대의 결과.
결과 => 객체 래퍼로 직접 박싱하는 건 권하고 싶지 않다.
언박싱
객체 래퍼의 원시 값은 valueOf()메서드로 추출
var a = new String("abc");
var b = new Number(42);
var c = new Boolean(true);
a.valueOf();
b.valueOf();
c.valueOf();
암시적인 언박싱이 일어남.
네이티브, 나는 생성자.
var a = new Array(1,2,3);
a; // [1, 2, 3]
var b = [1, 2, 3];
b; // [1, 2, 3]
var a = new Array(3);
var b = [undefined, undefined, undefined ];
var c = [];
c.length = 3;
3
a;
(3) [empty × 3]
b;
(3) [undefined, undefined, undefined]
c;
(3) [empty × 3]
a.join("-");
"--"
a.map(function(v,i){return i;});
(3) [empty × 3]
b.map(function(v,i){return i;});
(3) [0, 1, 2]
Object(), Function() and RegExp()
var c = new Object();
undefined
c.foo = "bar"
"bar"
c;
{foo: "bar"}
var d = {foo: "bar"};
undefined
d;
{foo: "bar"}
var e = new Function("a", "return a * 2;");
undefined
var f = function(a) {return a * 2;}
undefined
function g(a) {return a * 2;}
undefined
var h = new RegExp("^a*b+", "g");
undefined
var i = /^a*b+/g;
undefined
Symbol()
ES6에 처음 나온 시 값.
var mysym = Symbol("my own symbol");
undefined
mysym
Symbol(my own symbol)
mysym.toString();
"Symbol(my own symbol)"
typeof mysym;
"symbol"
var a = { };
undefined
a[mysym] = "foobar";
"foobar"
Object.getOwnPropertySymbols(a);
[Symbol(my own symbol)]
네이티브 프로토타입
내장 네이티브 생성자는 각자의 .prototype객체를 가진다.
var a = "abc";
a.indexOf("c");
a.toUpperCase();
a.trim();
typeof Function.prototype;
Function.prototype();
RegExp.prototype.toString(); // 빈 regex
"abc".match(RegExp.prototype); // [""]
Wrap up
자바스크립트는 원시 값을 감싸는 객체 래퍼, 즉 네이티브(String, Number, Boolean) 제공
객체 래퍼는 타입별로 쓸만한 기능이 구현되어 있어 편리하게 사용할 수 있다.
“abc” 같은 단순 스칼라 원시 값이 있을 때, 이 값의 length 프로퍼티나 String.prototype에 정의된 메서드를 호출하면 자바스크릅티는 자동으로 원시값을 ‘박싱’하여 필요한 프로퍼티와 메서드를 쓸 수 있게 도와준다.