JavaScript 中常用的原生函数有
String()
Number()
Boolean()
Object()
Array()
Function()
RegExp()
Date()
Error()
Symbol() //ES6
其中 String、Number、Boolean 这三个函数,分别对应于三种基本类型 string、number、boolean 的包装类型。它们也支持使用 new 的方式来构建,这样它们也就可以使用相应包装类型上的 prototype 函数。当然,如果直接在基本类型上调用相应的函数,则引擎会自动将其封装为相应的包装类型。并且纵使是在循环中多次调用同一个变量的方法,不用担心每次都会重新包装。引擎会自己进行相应的优化。
使用 Object 则可以对包装过程统一包装的接口,它会自动处理相应的类型,并给出对应相应的包装类型。如果需要将对应的 包装类型 拆箱成基本类型,可以使用 valueOf() 方法返回对应的基本类型。
var a = "a";
typeof a; //"string"
typeof Object(a); //"object"
Object.prototype.toString.call(Object(a)); //[object String]
typeof Object(a).valueOf(); //"string"
对于数组(Array)、对象(Object)、函数(Function) 与正则表达式(RegExp),它们都有相应的字面量形式,如果可以那么应该优先使用字面量的形式。
数组的函数形式具有两种语义,如果参数的值仅有一个并且是 number 类型,那么它会被当作预设数组的长度。而不是数组中的值,对应的数组元素全部都会被置为空。
Array.apply 调用的时候,如果第二个参数是一个伪数组对象,它会被拆分出来。
new Array(1,2); //[1, 2]
var a = new Array(1); //[empty]
a[0]; //undefined
a.length; //1
var b = new Array("a"); //["a"]
a[0]; //"a"
a.length; //1
var c = Array.apply(null, [1]); //[empty]
c[0]; //undefined
c.length; //1
var obj = {"0":1, "length":2}
var d = Array.apply(null, obj); //[1, "empty"]
函数的构造形式极少用到,不过有些地方却是有用的。比如动态的去构建一个函数,它的值都为字符串,最后一个参数作为函数体,前面的参数作为这个函数会使用到的参数。
var b = 2;
new Function("a", "return a + b;")(1); //3
正则表达式的构造形式尽管不能静态被编译与优化,但是它还是有着一些自己的优势,和函数一样。我们可以动态的构建一个正则表达式,然后使用其来判断或者其他处理。
var a = "ab";
new RegExp(a).test(a); //true
Date、Error、以及 Symbol 没有字面量的形式,它们只能使相应的函数。
Date 的构建可以传入字符串或者数字,数字是以 1970 年以来的毫秒值,它可以使用负数,代表 1970 年以前的日期。
Error 一般用于抛出异常,它可以包含一个描述信息。一般是字符串,另外还有一些用于描述特定类型错误的错误类型,如 EvalError、RangeError、ReferenceError 等...
Symbol 是 ES6 新增的基本类型,它不能使用 new 来构造,一般用它来构建属性。这些属性不能被枚举,但是可以通过 Object.getOwnPrototypeSymbols() 来获取对象身上的所有符号属性。
new Symbol(); //TypeError: Symbol is not a constructor
var a = Symbol('abc');
var b = {[a]:1} //{Symbol(abc):1}
Object.keys(b); //[]
Object.getOwnPropertySymbols(b); //[Symbol(abc)]