什么是包装类呢?
在讲解包装类之前我们先看一个现象:
var str = "好好学习,天天向上";
console.log(str.length); //9
上述例子,会输出字符串的长度为9。众所周时,字符串属于原始类型的数据,原始数据类型是没有属性和方法的,所以,字符串类型数据中的length是哪里来的呢?
这就涉及到了我们今天要讲到的包装类了,除了字符串类型还有数字类型,布尔类型的数据在调用属性和方法时都会首先经过包装类包装成对象的形式再调用该调用的属性和方法。
这样说可能还不太明白,没关系,我们从头开始讲。要明白包装类就要从对象开始讲起。
对象的定义方法
这里假设你已经具备了面向对象编程的基本功,(这里我们并不打算详细讲解对象的一些定义和使用方法,而是通过对象引出包装类的由来),js中对象的定义方法一般有两种
(1)对象字面量,类似这样:
var person = {
name: “liu”,
sex: “male”
}
(2)构造函数,而构造又可以分为两种,一种是自定义的构造函数,另一种就是系统自带的构造函数。
系统自带的构造函数有:Object, Array, Number, String, Boolean, Math, Date, RegExp, Error等
通过new Object()就可以创建一个空对象。
我们仔细观察这些系统自带的构造函数就可以发现Number,String,Boolean这些原始值类型也可以创建对象。
var num = new Number(123); //创建一个数字对象,这时num就不再是一个单纯的数字了,而是以一个对象的形式存在,可以有方法和属性
var str = new String("abc") //创建一个字符串对象
var boolean = new Boolean(123) //创建一个布尔值对象
由于这些系统自定义的构造函数的存在,就导致了我们刚才提到的有趣的现象。
包装类的原理
回到刚才我们提到的现象
var str = "好好学习,天天向上";
console.log(str.length); //9
当读到str.length这句代码时,系统会发现这句代码理论上来说并不正确,但是系统内部会隐式的调用new String(“好好学习,天天向上”).length。而通过调用new String(“好好学习,天天向上”)就创建了一个对象,这个对象身上是有length方法的。因此就可以输出字符串的长度。
还有值得注意的一点就是系统内部隐式创建好对象并调用了相关方法后会立马销毁对象
我们再看一个例子:
var str = "abc";
str.length = 2;
console.log(str); //"abc"
console.log(str.length); //3
分析: 在执行第二句时,系统内部实际是在执行new String(“abc”).length = 2.但是执行完后就会立马将对象销毁,因此对str本身并没有产生什么影响。最后一句仍然是再行new String(“abc”).length,这时就会输出3.