一、什么是包装类
js内置的三个构造函数:Number、String、Boolean就是包装类。
undefined是变量和对象的默认初始值,不提供包装类
null用于对象占位值,不提供包装类
二、为什么会有包装类
js的三大基本数据类型(number、string、boolean),本来是没有任何的属性和方法的, 但是当我们操作简单数据类型时,还可以使用属性和方法,这是怎么回事?
const num = 1
console.log(num.toFixed(2))
const str = 'abc'
console.log(str.length)
const flag = true
console.log(flag.toString())
原因是js底层会针对这三种原始值,隐式地通过包装类(如new String())来创建该值的实例对象,通过该值去访问属性或方法时,其实上是访问实例上的属性和方法
所以说字符串有length属性,这是不准确的,字符串实际上是访问了它实例对象上的length属性,而实例对象是js隐式地通过包装类创建的
三、包装类的过程
- 通过字面量的方式创建number、string、boolean时,会自动通过包装类创建实例对象
- 通过实例对象可以调用属性和方法
- 该实例对象会自动销毁,所以不能对原始值添加属性和方法
打印什么?
const a = 1
a.len = 3
console.log(a.len)
打印undefined,为什么?
原始值是不能写a.len
的,点语法是对象才有的啊。但是非要这么写,js也不会报错,实际上隐式地通过new Number()为数字1创建了一个实例对象了,所以操作实例对象的属性和方法时不会报错,而a是原始值,存在栈中,a.len没有地方保存啊,所以会被delete,打印a.len就是undefined了
const _a = new Number(1) // 为数字1创建实例对象(Number {1})
_a.len = 3 // 因为给对象添加属性len,所以不会报错
delete _a.len // 添加完属性后又将该属性删除,所以再次访问就是undefined
console.log(_a.len) // undefined
如果希望给数字1添加len属性,那么可以使用包装类声明
const a = new Number(1)
a.len = 3
console.log(a, a.len) // Number {1, len: 3} 3
要注意:undefined和null是没有包装类的,这样写会报错
const u = undefined
undefined.len = 3 // Uncaught TypeError: Cannot set properties of undefined (setting 'len')