JavaScript中的内部类属性和对象封装详解

JavaScript中的原生函数、内部属性及封装对象

JavaScript内置了一系列原生函数,其中包括String(), Number(), Boolean(), Array(), Object(), Function(), RegExp(), Date(), Error(), Symbol()等。本文将重点讲述JavaScript中的内部属性和封装对象。

1. JavaScript内部Class属性

在JavaScript中,所有typeof返回结果为object的对象(如数组等)都包含一个名为[[Class]]的内部属性。我们无法直接访问这个属性,但可以借助Object.prototype.toString(..)来查看。

Object.prototype.toString.call( /regex-literal/i );// "[object RegExp]"

即使对于nullundefined,我们也可以看到此类内部属性:

Object.prototype.toString.call( null ); // "[object Null]"

注意基本类型string, number, boolean会被自动封装(boxing)成对应的对象。

2. JavaScript对象包装

对于字符串、数字的属性和方法如.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(..)等特例外。我们通常建议使用直接的字面量/常量的方式创建。

2.1 “new Target()” 与 “Target()” 的区别

在加不加new关键词时,String(), Number()等内置函数处理方式会区别对待。

var a = new Number(3);
console.log(typeof a); // 输出 "object"

使用new,创建的是一个新的对象,而没有使用new,则进行了类型转换。

2.2 包装 null 和 undefined

我们可以利用Object()函数将nullundefined包装为对象。

var n = Object(null);
console.log(typeof n); // 输出 "object"

2.3 拆封对象值

所有对象都有 valueOf()toString() 方法,在尝试取对象值时会自动调用。

3. JavaScript对象及数组的解构

ES6引入的解构特性,使我们能够使用模式匹配进行解构和赋值,使得从数组/对象获取值变得更加简单和直观。

3.1 数组解构

ES6引入的数组解构语法,允许我们从数组中按位置提取值并赋值。

let [a, b, c] = [1, 2, 3];

3.2 对象解构

对象解构语法允许我们从对象中提取属性和值。

let {foo, bar} = {foo: 'aaa', bar: 'bbb'};

3.3 字符串解构

我们还可以对字符串进行解构,此时字符串会被视为一个类似数组的对象。

const [a, b, c, d, e] = 'hello';

你可能感兴趣的:(JS高级,javascript,开发语言,ecmascript)