包装对象
所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number
、String
、Boolean
三个原生对象
这三个原生对象可以把原始类型的值变成(包装成)对象
-
-
var v1 = new Number(123); var v2 = new String('abc'); var v3 = new Boolean(true); typeof v1 // "object" typeof v2 // "object" typeof v3 // "object" v1 === 123 // false v2 === 'abc' // false v3 === true // false
-
- 目的:
- 使得 JavaScript 的对象涵盖所有的值
- 使得原始类型的值可以方便地调用某些方法
- 实例方法 :
-
- 三种包装对象各自提供了许多实例方法。这里介绍两种它们共同具有、从
Object
对象继承的方法:valueOf
和toString
- 三种包装对象各自提供了许多实例方法。这里介绍两种它们共同具有、从
- .valueOf() 返回包装对象实例对应的原始类型的值
- .toString() 方法返回对应的字符串形式
-
new Number(123).valueOf(); // 123 new String('abc').valueOf(); // "abc" new Boolean(true).valueOf(); // true new Number(123).toString(); // "123" new String('abc').toString(); // "abc" new Boolean(true).toString(); // "true"
-
- 原始类型与实例对象的自动转换 :
- 原始类型的值,可以自动当作包装对象调用,即调用包装对象的属性和方法。
- 这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例
-
'abc'.length // 3 // abc是一个字符串,本身不是对象,不能调用length属性。 // JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。 // 调用结束后,这个临时对象就会被销毁。 //这就叫原始类型与实例对象的自动转换
- 调用结束后,包装对象实例会自动销毁。
- 这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。
- 如果要为字符串添加属性,只有在它的原型对象
String.prototype
上定义
- 自定义方法 :
- 除了原生的实例方法,包装对象还可以自定义方法和属性,供原始类型的值直接调用
-
// 比如,我们可以新增一个double方法,使得字符串和数字翻倍 String.prototype.double = function () { return this.valueOf() + this.valueOf(); }; 'abc'.double(); // abcabc Number.prototype.double = function () { return this.valueOf() + this.valueOf(); }; (123).double(); // 246 1
23
外面必须要加上圆括号,否则后面的点运算符(.
)会被解释成小数点
-
- 这种自定义方法和属性的机制,只能定义在包装对象的原型上,如果直接对原始类型的变量添加属性,则无效
- 除了原生的实例方法,包装对象还可以自定义方法和属性,供原始类型的值直接调用