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';