什么是包装对象?
基本类型有自己对应的包装对象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。它们是特殊的引用类型,既与其他的引用类型相似,同时又具有具有与各自的原始类型相应的特殊行为
所以我们要怎样理解包装对象呢?
我们知道:引用类型是有方法和属性的,但基本类型是没有的,但是我们都遇到过这样的代码
毫无疑问上面的string是一个基本类型,但是它却能召唤出一个charAt()的方法,这是什么原因呢?
主要是因为:字符串去调方法的时候,基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装类型消失。
再看一个例子
我们再来看一个面试题:
当我们走str.number = 10;这句话的时候。基本类型要添加一个属性(当然我们知道基本类型是没有方法和属性的),所以这时它会在基本类型所对应的包装对象下面创建一个对象,然后把10添加到了对象下面,添完之后包装对象就消失了,消失之后,当我们再执行alert(str.number);时,str又要重新执行上面的过程,重新创建一个对象,而新的对象是没有number属性的,所以结果就是undefined。
那如果我们想要这个number属性一直可以找到怎么办呢?其实也很简单,我们只需要把number这个属性添加到对应的包装对象的原型下面是再去找时是可以找到的。
再看一个例子:
这个结果是毫无疑问的,但是如果和上面的基本类型相比,你是否会有一点点的小迷惑呢?
所以接下来我们就要讨论一下包装类型和引用类型的区别啦
包装类型和引用类型的区别
引用类型和包装类型的主要区别是对象的生存期:使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于这句代码的执行期间,然后立即被销毁,这也意味着我们不能在运行时为基本类型添加属性和方法。