什么是包装对象?

基本类型有自己对应的包装对象String、Number、Boolean。但是null和undefined没有包装对象

首先我们复习一下js的数据类型:分为两类基本类型和引用类型

基本类型:String、Number、Boolean、Null、Undefined

引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。

但引用类型中包含了三种基本包装类型:String、Number、Boolean。它们是特殊的引用类型,既与其他的引用类型相似,同时又具有具有与各自的原始类型相应的特殊行为

所以我们要怎样理解包装对象呢?

我们知道:引用类型是有方法和属性的,但基本类型是没有的,但是我们都遇到过这样的代码

var str = 'hello'; //string 基本类型
var s2 = str.charAt(0);
alert(s2); // h

毫无疑问上面的string是一个基本类型,但是它却能召唤出一个charAt()的方法,这是什么原因呢?

主要是因为:字符串去调方法的时候,基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装类型消失。

再看一个例子

var str = 'hello'; //string 基本类型
var s2 = str.charAt(0); //在执行到这一句的时候 后台会自动完成以下动作 :

var str = new String('hello'); // 1 找到对应的包装对象类型,然后通过包装对象创建出一个和基本类型值相同的对象
var s2 = str.chaAt(0); // 2 然后这个对象就可以调用包装对象下的方法,并且返回结给s2.
str = null; // 3 之后这个临时创建的对象就被销毁了, str =null;

alert(s2);//h
alert(str);//hello 注意这是一瞬间的动作 实际上我们没有改变字符串本身的值。就是做了下面的动作.这也是为什么每个字符串具有的方法并没有改变字符串本身的原因。


我们再来看一个面试题:

var str="hello";
str.number = 10;//包装对象消失
alert(str.number);//undefined

当我们走str.number = 10;这句话的时候。基本类型要添加一个属性(当然我们知道基本类型是没有方法和属性的),所以这时它会在基本类型所对应的包装对象下面创建一个对象,然后把10添加到了对象下面,添完之后包装对象就消失了,消失之后,当我们再执行alert(str.number);时,str又要重新执行上面的过程,重新创建一个对象,而新的对象是没有number属性的,所以结果就是undefined。

那如果我们想要这个number属性一直可以找到怎么办呢?其实也很简单,我们只需要把number这个属性添加到对应的包装对象的原型下面是再去找时是可以找到的。

var str="hello";
String.prototype.number = 10;
alert(str.num);//10

再看一个例子:

var arr=[];
arr.num = 10;
alert(arr.num);//10

这个结果是毫无疑问的,但是如果和上面的基本类型相比,你是否会有一点点的小迷惑呢?

所以接下来我们就要讨论一下包装类型和引用类型的区别啦

包装类型和引用类型的区别

引用类型和包装类型的主要区别是对象的生存期:使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于这句代码的执行期间,然后立即被销毁,这也意味着我们不能在运行时为基本类型添加属性和方法。