前言
- 是否了解JavaScript中的包装类型?
包装类型
在ES中,数据类型整体上来讲可以分为两大类:基本类型和引用数据类型
按照最新的ES标准定义,基本数据类型包括string、number、boolean、null、undefined、Symbol(ES6新增)、BigInt(ES2020新增)。
引用数据类型包括Object、Array、Date、RegExp等。
基本数据类型和引用类型这两个类型其中一个很明显的区别是,引用类型有自己内置的方法,也可以自定义其他方法用来操作数据,而基本数据类型不能像引用类型那样有自己的内置方法对数据进行更多的操作。
但基本数据类型真的就不能使用方法吗?对于部分基本类型来说确实是这样的。
有3个是ES提供了对应的特殊引用类型(包装类型)Booleean、Number、String。
基本包装类型,和其他引用类型一样,拥有内置的方法可以对对数据进行额外操作。如下:
var str = 'hello world';
console.log(str.charAt(0)); // h
上述代码中,str是一个基本数据类型,但是它却可以调用charAt方法,这是因为当基本数据类型调用方法时,JavaScript会自动将基本数据类型转换为对应的包装类型,然后再调用方法,调用完之后,包装类型会立即被销毁。
基本类型的值虽然没有方法可以调用,但是后台临时创建的包装对象上有内置方法可以让我们调用方法,因此这样我们就可以对字符串、数值、布尔值这三种基本数据类型的数据进行更多操作。
而什么时候后台会自动创建一个对应的基本包装类型的对象,取决于当前执行的代码是否是为了获取它的值。
每当读取一个基本类型的值,也就是当我们需要从内存中获取到他的值时(这个访问过程称为读取模式),这时后台就会自动创建一个基本包装类型的对象。例如:
var str = '123'
console.log(str) // 读取模式,后台自动创建基本包装类型对象
var str2 = str // 赋值给变量str2,也需要读取str的值,同上
基本包装类型的对象和引用类型的对象最大的一个区别是,对象的生存期不同,导到数的一个结果就是,基本包装类型无法自定义自己的方法。
对于引用类型的数据,在执行流离开当前作用域之前都会保存在内存中,而对于自动创建的基本包装类型的对象,只存在于一行代码的执行瞬间,执行完毕就会立即被销毁。例如:
var str = '123'
str.number = 10
console.log(str.number) // undefined
上面第二行代码给自动创建的String实例对象添加了number属性,虽然此刻代码执行时他是生效的,但是在这行代码执行完毕后该String实例就会立刻被销毁,String实例的number属性也就不不存在了。
因此,第三行代码在读取str的number属性时,就会返回undefined。
用代码解释如下
var str = '123'
// str.number = 10 这行等价于下面三行
var _str = new String('123')
_str.number = 10
_str = null
console.log(str.number) // undefined
那么我们怎么才能给基本类型添加方法或者属性呢?
答案是在基本包装对象的原型下面添加,每个对象都有原型。
String.prototype.number = 10
var str = '123'
console.log(str.number) // 10
总结
- 是否了解JavaScript中的包装类型?
包装对象,就是当基本类型以对象的方式去使用时,JavaScript会转换成对应的包装类型,相当于new了一个对象,内容和基本类型的内容一样,然后当操作完成再去访问的时候,这个临时对象会被销毁,然后再访问的时候就是undefined。
number、string、boolean都有对应的包装类型。
因为有了基本包装类型,所以JavaScript中的基本类型值可以被当作对象来访问。
基本类型特征:
每个包装类型都映射到同名的基本类型
在读取模式下访问基本类型值时,就会创建对应的基本包装类型的一个对象,从而方便了数据操作
操作基本类型值的语句一经执行完毕,就会立即销毁新创建的包装对象