目录
导语
1. 包装对象的理解
2. 三大包装对象的知识点
3. 小结
导语
包装对象是为了弥补基本数据类型的非对象特性而产生的,对于基本类型值而言,本来是不存在属性和方法的,但是我们可以在使用字面量创建字符串时,调用例如"hello".concat(" world")
的方法,那么其内在原理究竟是什么呢?
阅读完本篇文章,相信你能找到答案。
1. 包装对象的理解
包装对象指的是数据类型为Number
、String
和Boolean
的值对应的原生对象;
三大包装对象能力在于:
- 能够将上述基本类型值包装成真正的对象,从而体现JavaScript语言一切皆对象的特点;
- 是字面量使用对应包装对象的方法的内在原理;
- 是进行数据类型转换的利器;
1.1 三大包装对象及其字面量
基本数据类型我们可以直接采用字面量的形式创建:
var num = 1,str = "hello",bool = true;
也可以采用对应包装对象的形式创建:
var num = new Number(1),str = new String("hello"),bool = new Boolean(true)
二者区别在于前者是基本数据类型,后者是属于对象的引用数据类型;
二者的联系在于:
-
通过对象的valueOf()方法可以获取其基本类型值;
-
字面量可直接调用包装对象的实例的方法;
其原理在于每次基本类型字面量在调用包装对象实例的方法时,首先创建对于包装对象的实例,然后在实例上调用该方法,最后销毁该实例,即
var str = "hello world";
str.split(" ")
等价于
var str = new String("hello world")
str.split(" ")
str = null;
所以,每当为字面量赋属性值时是无效的,因为每次字面量调用完包装对象实例的方法后都会销毁实例;
关于更多包装对象的实例属性和方法详见下文;
1.2 Object对象与三大包装对象的关系
在《JavaScript标准库系列——Object对象和Array对象(一)》一文中,小羊曾提到Object是其他一切对象的构造函数,所以三大包装对象的实例都可以由Object来构造;
var num = new Object(1);等价于 new Number(1)
var str = new Object('hello');new String('hello')
var bool = new Object(true);new Booleab(true)
Object构造函数根据传入参数的数据类型返回相应的基本包装类型的实例;
2. 三大包装对象的知识点
2.1 包装对象直接作为工具方法
包装对象直接作为工具方法实现到不同类型数据之间的类型转换作用,详见《JavaScript数据类型(四)》一文;
2.2 包装对象的实例方法
-
继承自Object对象的valeOf()和toString()方法
这两个方法继承自Object对象,经常在使用字面量与其他类型数据进行运算时调用,例如:
这里顺带讲一下+
运算符的原理: - 先自动转成原始类型的值(即先执行该对象的valueOf
方法,如果结果还不是原始类型的值,再执行toString
方法;如果对象是Date实例,则先执行toString
方法); - 两个运算子都是原始类型的值以后,只要有一个运算子是字符串,则两个运算子都转为字符串,执行字符串连接运算;
- 否则,两个运算子都转为数值,执行加法运算;
来自阮一峰《JavaScript 标准参考教程》;
以1+str
、1+obj
和1+bool
为例:
1+str
加法运算符两侧的运算子包含字符串,采用字符串拼接方法;
1+obj
加法运算符两侧的运算子包含对象,先采用valueOf()方法,发现还是对象,在调用toString()方法得到"[object Object]"
,然后进行字符串拼接;
1+bool
发现其中一个运算子是布尔值直接使用Number()进行包装; -
源自包装对象实例的方法
三大包装对象中String对象的实例方法相对来说比较重要,这里重点讲一下,其他两个可以参考阮一峰的教程;
字符方法
charAt():返回指定位置的字符;
charCodeAt():返回给定位置字符的Unicode码
类数组方法
length:返回字符串的长度;
concat:合并字符串,返回新字符串,不改变原字符串;
slice:提取字符串,第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置),返回子字符串,不改变原字符串;
substr:提取字符串,第一个参数是子字符串的开始位置,第二个参数是子字符串的长度,返回子字符串,不改变原字符串;
格式化方法
toUpperCase:将字符串变大写
toLowerCase:将字符串变小写
trim:去除字符串前后的空格
检索相关方法
match:传入一个参数,若原字符串匹配参数则返回匹配的符串数组;
replace:可传两个参数,第一个为检索表达式,第二个为替换值;
更多详见《JavaScript标准库系列——RegExp对象(三)》
var str = "hello world"
str.split(" ").map(function(ele){
return ele.replace(/^\w/,function(match){
return match.toUpperCase()
})
}).join(" ")
//"Hello World"
split()方法
split:按照给定的参数去分割字符串,和数组的join是互为逆方法;
小结
通过全文的浏览,我们了解到:
- 包装对象是三大原始类型数据Number、String和Boolean对于的原生对象;
- 三大包装对象在JavaScript中的作用主要是能将三大基本数据类型也包装成对象,从而体现JavaScript一切皆对象的特性;是字面量调用对应实例方法的内在原理;是进行数据类型转换的利器;
- 通过new+包装对象方法能够创建不同的包装对象实例,调用其valueOf()方法就可以得到对应的原始类型值;同时也可以通过Object对象去构造对应的包装对象;
- 包装对象的使用既可以作为工具方法,起到数据类型转换作用;又可以创建实例,从而实例可以调用部署在对应包装对象原型上的方法;
- valueOf()和toString()是三大包装对象实例的共有方法,在进行数据类型转换时会派上用场;
- 本文主要讲解了关于String包装对实例的方法,包括字符方法、类数组方法、格式化方法、检索方法和split方法;
参考资料
- 《JavaScript高级程序设计(第3版)》
- 《JavaScript标准参考教程》——阮一峰