JavaScript内置了一系列原生函数,其中包括String(), Number(), Boolean(), Array(), Object(), Function(), RegExp(), Date(), Error(), Symbol()等。本文将重点讲述JavaScript中的内部属性和封装对象。
在JavaScript中,所有typeof返回结果为object的对象(如数组等)都包含一个名为[[Class]]的内部属性。我们无法直接访问这个属性,但可以借助Object.prototype.toString(..)来查看。
Object.prototype.toString.call( /regex-literal/i );// "[object RegExp]"
即使对于null和undefined,我们也可以看到此类内部属性:
Object.prototype.toString.call( null ); // "[object Null]"
注意基本类型string, number, boolean会被自动封装(boxing)成对应的对象。
对于字符串、数字的属性和方法如.length和.toString,他们并不存在。此时就需要用到对象包装。
var a = "abc";
a.length; // 3
使用new String()包装字符串后,通过typeof取得的结果可能并非你想要的。通常,我们推荐使用Xx()而不是new Xx()来包装值。
var a = new String( "abc" );
typeof a; // "object"
在需要获取包装的实际值时,我们使用xx.valueOf()方法。
var a = new String( "abc" );
a.valueOf(); // "abc"
使用new的方式创建封装对象通常并不推荐,除了Date(..)和 Error(..)等特例外。我们通常建议使用直接的字面量/常量的方式创建。
在加不加new关键词时,String(), Number()等内置函数处理方式会区别对待。
var a = new Number(3);
console.log(typeof a); // 输出 "object"
使用new,创建的是一个新的对象,而没有使用new,则进行了类型转换。
我们可以利用Object()函数将null或undefined包装为对象。
var n = Object(null);
console.log(typeof n); // 输出 "object"
所有对象都有 valueOf() 和 toString() 方法,在尝试取对象值时会自动调用。
ES6引入的解构特性,使我们能够使用模式匹配进行解构和赋值,使得从数组/对象获取值变得更加简单和直观。
ES6引入的数组解构语法,允许我们从数组中按位置提取值并赋值。
let [a, b, c] = [1, 2, 3];
对象解构语法允许我们从对象中提取属性和值。
let {foo, bar} = {foo: 'aaa', bar: 'bbb'};
我们还可以对字符串进行解构,此时字符串会被视为一个类似数组的对象。
const [a, b, c, d, e] = 'hello';