常用的原生函数有:
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbol()------ES6中新加入的!
3.1 内部属性 [[Class]]
所有 typeof 返回值为 "object" 的对象(如数组)都包含一个内部属性 [[Class]]
- 这个属性无法直接访问,一般通过 Object.prototype.toString(..) 来查看
js
console.log(Object.prototype.toString.call([1, 2, 3])); //[object Array]
console.log(Object.prototype.toString.call(/regex-literal/i));//[object RegExp]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(new Date()));//[object Date]
console.log(Object.prototype.toString.call(new Error()));//[object Error]
console.log(Object.prototype.toString.call(new RegExp()));//[object RegExp]
console.log(Object.prototype.toString.call(new String()));//[object String]
console.log(Object.prototype.toString.call(new Number()));//[object Number]
console.log(Object.prototype.toString.call(new Boolean()));//[object Boolean]
console.log(Object.prototype.toString.call(new Object()));//[object Object]
console.log(Object.prototype.toString.call(new Function()));//[object Function]
3.2 封装对象包装
JavaScript 会自动为基本类型值包装(box 或者 wrap)一个封装对象
js
var a = "abc";
a.length; // 3
a.toUpperCase(); // "ABC"
封装对象释疑
我们为 false 创建了一个封装对象,然而该对象是真值,所以这里使用封装对象得到的结果和使用 false 截然相反
js
var a = new Boolean(false);
if (!a) {
console.log("Oops"); // 执行不到这里
}
3.3 拆封
如果想要得到封装对象中的基本类型值,可以使用 valueOf() 函数
- 在需要用到封装对象中的基本类型值的地方会发生隐式拆封
js
var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true
var b = a + ""; // b的值为"abc"
typeof a; // "object"
typeof b; // "string"
3.4 原生函数作为构造函数
数组(array)、对象(object)、函数(function)和正则表达式,我们通常喜欢以常量的形式来创建它们。实际上,使用常量和使用构造函数的效果是一样的
3.4.1 Array(..)
- 构造函数 Array(..) 不要求必须带 new 关键字,Array(1,2,3) 和 new Array(1,2,3) 的效果是一样的
- Array 构造函数只带一个数字参数的时候,该参数会被作为数组的预设长度(length),而非只充当数组中的一个元素。
- 永远不要创建和使用空单元数组。
js
var a = new Array(1, 2, 3);
console.log(a); // [1, 2, 3]
var b = [1, 2, 3];
console.log(b);// [1, 2, 3]
var c = new Array(4);
console.log(c); //[空 ×4]
3.4.2 Object(..)、Function(..) 和 RegExp(..)
除非万不得已,否则尽量不要使用 Object(..)/Function(..)/RegExp(..):
3.4.3 Date(..) 和 Error(..)
创建日期对象必须使用 new Date()。
- Date(..) 可以带参数,用来指定日期和时间,而不带参数的话则使用当前的日期和时间。
- Date(..) 主要用来获得当前的 Unix 时间戳(从 1970 年 1 月 1 日开始计算,以秒为单位
构造函数 Error(..)(与前面的 Array() 类似)带不带 new 关键字都可
- 创建错误对象(error object)主要是为了获得当前运行栈的上下文
- 错误对象通常与 throw 一起使用
js
function foo(x) {
if (!x) {
throw new Error( "x wasn't provided" );
}
// ..
}
3.4.4 Symbol(..)
符号是具有唯一性的特殊值(并非绝对),用它来命名对象属性不容易导致重名
- 符号可以用作属性名
- 可以使用 Symbol(..) 原生构造函数来自定义符号
js
var mysym = Symbol("my own symbol");
console.log(mysym);// Symbol(my own symbol)
console.log(mysym.toString()); // "Symbol(my own symbol)"
console.log(typeof mysym); // "symbol"
var a = {};
a[mysym] = "foobar";
console.log(Object.getOwnPropertySymbols(a));// [ Symbol(my own symbol) ]
3.4.5 原生原型
原生构造函数有自己的 .prototype 对象,如 Array.prototype、String.prototype 等