原生js:js的三个包装类

141 阅读2分钟

一、什么是包装类

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())来创建该值的实例对象,通过该值去访问属性或方法时,其实上是访问实例上的属性和方法 image.png

所以说字符串有length属性,这是不准确的,字符串实际上是访问了它实例对象上的length属性,而实例对象是js隐式地通过包装类创建的

三、包装类的过程

  1. 通过字面量的方式创建number、string、boolean时,会自动通过包装类创建实例对象
  2. 通过实例对象可以调用属性和方法
  3. 该实例对象会自动销毁,所以不能对原始值添加属性和方法

打印什么?

      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')