本文主要是介绍JavaScript各种基础对象:(2)包装对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1 包装对象
1.1 定义
1.2 包装对象的构造函数
1.3 包装对象实例的方法
1.3.1 valueOf方法
1.3.2 toString方法
1.4 原始类型的自动转换
1.5 自定义方法
1 包装对象
1.1 定义
在JavaScript中,“一切皆对象”,数组和函数本质上都是对象,就连三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。
所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
var v1 = new Number(123);
var v2 = new String("abc");
var v3 = new Boolean(true);
上面代码根据原始类型的值,生成了三个对象,与原始值的类型不同。这用typeof运算符就可以看出来。
typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"v1 === 123 // false
v2 === "abc" // false
v3 === true // false
JavaScript设计包装对象的最大目的,首先是使得JavaScript的“对象”涵盖所有的值。其次,使得原始类型的值可以方便地调用特定方法。
1.2 包装对象的构造函数
Number、String和Boolean这三个原生对象,既可以当作构造函数使用(即加上new关键字,生成包装对象实例),也可以当作工具方法使用(即不加new关键字,直接调用),这相当于生成实例后再调用valueOf方法,常常用于将任意类型的值转为某种原始类型的值。
Number(123) // 123String("abc") // "abc"Boolean(true) // true
工具方法的详细介绍参见第二章的《数据类型转换》一节。
1.3 包装对象实例的方法
包装对象实例可以使用Object对象提供的原生方法,主要是 valueOf 方法和 toString 方法。
1.3.1 valueOf方法
valueOf方法返回包装对象实例对应的原始类型的值。
new Number(123).valueOf()
// 123new String("abc").valueOf()
// "abc"new Boolean("true").valueOf()
// true
1.3.2 toString方法
toString方法返回该实例对应的原始类型值的字符串形式。
new Number(123).toString()
// "123"new String("abc").toString()
// "abc"new Boolean("true").toString()
// "true"
1.4 原始类型的自动转换
原始类型可以自动调用定义在包装对象上的方法和属性。比如String对象的实例有一个length属性,返回字符串的长度。
var v = new String("abc");
v.length // 3
所有原始类型的字符串,都可以直接使用这个length属性。
"abc".length // 3
上面代码对字符串abc调用length属性,实际上是将“字符串”自动转为String对象的实例,再在其上调用length属性。这就叫原始类型的自动转换。
abc是一个字符串,属于原始类型,本身不能调用任何方法和属性。但当对abc调用length属性时,JavaScript引擎自动将abc转化为一个包装对象实例,然后再对这个实例调用length属性,在得到返回值后,再自动销毁这个临时生成的包装对象实例。
这种原始类型值可以直接调用的方法还有很多,除了前面介绍过的valueOf和stringOf方法,还包括三个包装对象各自定义在实例上的方法。
'abc'.charAt === String.prototype.charAt
// true
上面代码表示,字符串abc的charAt方法,实际上就是定义在String对象实例上的方法(关于prototype对象的介绍参见《面向对象编程》一章)。
如果包装对象与原始类型值进行混合运算,包装对象会转化为原始类型(实际是调用自身的valueOf方法)。
new Number(123) + 123
// 246new String("abc") + "abc"
// "abcabc"
1.5 自定义方法
三种包装对象还可以在原型上添加自定义方法和属性,供原始类型的值直接调用。
比如,我们可以新增一个double方法,使得字符串和数字翻倍。
String.prototype.double = function (){return this.valueOf() + this.valueOf();
};"abc".double()
// abcabcNumber.prototype.double = function (){return this.valueOf() + this.valueOf();
};(123).double()
// 246
上面代码在123外面必须要加上圆括号,否则后面的点运算符(.)会被解释成小数点。
但是,这种自定义方法和属性的机制,只能定义在包装对象的原型上,如果直接对原始类型的变量添加属性,则无效。
var s = "abc";s.p = 123;
s.p // undefined
上面代码直接对支付串abc添加属性,结果无效。
这篇关于JavaScript各种基础对象:(2)包装对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!