在js中数据类型被分为两大类
- 基本数据类型
- 引用数据类型
引用数据类型可以使用原型对象中内置的实例方法。为了更方便开发人员操作基本数据类型,在基本数据类型中也有内置的方法。这些方法放在es三个特殊引用类型(基本包装类型)中,他们分别是:Boolean,Number,String。
当操作一个基本类型数据的时候,后台就会创建一个基本包装类型对象,通过这个创建的对象开发人员可以调用一些内置方法操作基本数据类型。
let str='string';
let str2 = str.substring(2);
console.log(str2)
在上段代码中,str2并不是一个对象 只是一个基本数据类型,然而他调用了一个对象方法。
原因如下:
在执行let str2= str.substring(2)的时候,js会进行以下步骤:
- 自动创建一个String类型的实例,这个实例就是一个基本包装类型的对象。
- 调用这个实例上的方法
- 销毁此示例
代码描述如下:
var str = new String('test');//创建一个基本包装类型对象
var str = str.substring()//通过对象调用方法
str =null //销毁实例对象 防止性能占用
js什么时候会自动创建一个对应的基本包装类型对象呢?
当程序执行时,当前执行代码如果需要获取到这个基本数据类型的值时(这个访问过程叫做读取模式),后台就会自动创建一个基本包装类型的对象。
var str = 'hhh'
console.log(str)//需要读取 str的值,进入读取模式 后台自动创建基本包装类型对象
var str2 = str //将str的值赋值给str2 需要从内存中读取str的值 所以也会进入读取模式
通过以上的描述 不难得出常规引用类型和基本包装类型的主要区别:对象的生存期
- 引用数据类型:当使用new操作符创建的引用类型实例,在执行流离开当前作用域之前一直保存在内存中。
- 基本包装类型:只存在一行代码之中,使用完后立即销毁
在js中给基本数据类型添加方法和属性也是可行的,但并不推荐这种做法(首先没有太大意义,其次容易造成一些错误)
//给包装对象添加原型方法
var str = 'hello'
//在包装对象原型对象下写方法
String.prototype.函数名=funcion(){
//函数体
}
//这样基本数据类型就能调用新增的方法
console.log(str.新增函数名)