定义

为了方便操作原始值,ESMAScript提供了3种特殊的引用类型:Number、Boolean、String,它们同时具备某些引用类型和原始值类型的方法,为了快速理解,我们看看下面的方法:

  1. let s1 = 'aab'
  2. console.log(s1.substring(1)) // 'ab'

可能我们平常没有注意到这个问题,s1是一个原始值类型,正常是不应该具有和引用类型一样调用方法的能力的,是不??反正我平常是没有注意到的,想当然就直接调用方法了,能调用方法,其实是引用类型具有的特点

why

其实这就是ESMAScript 赋予它们的能力,这种行为又叫读模式
看上面的例子,其实我们底层的实现是这样的,s1定义成功,当s1尝试使用方法的时候,我们底层会完成如下三步:

  1. 创建一个String类型(就上面例子来说),即使用 new String()方法
  2. 调用实例上面的方法
  3. 销毁实例
    1. // s1.subsring
    2. let s1 = new String('aab')
    3. s1.substring()
    4. s1 = null
    这种行为可以让原始值拥有对象的行为,对于Boolean和Number而言,也是一样的过程。
    那直接使用new进行创建和使用这种读模式创建的对象,有什么区别呢??
    生命周期不同!!!
    自动创建的引用类型,会在使用后立即销毁,即只在执行期间有用,可以看如下例子:
    1. let s1 = 'some text
    2. s1.color = 'red'
    3. console.log(s1.color) // undefined
    出现上述打印的原因就说明了自动创建的引用类型只在执行期间有用,所以我们在调用s1的color的时候,其实是刚创建,所以是拿不到之前赋值的color的!!

    注意

    直接使用new Object创建引用对象,会根据参数创建不同的引用对象,如下:
    1. let a = new Object('a')
    2. console.log(a) // String a
    3. typeof a // Object
    4. a instanceof String // true
    使用new进行构造函数创建Boolean,判断语句会直接返回true,因为对象永远返回true
    1. let flag = new Boolean(false)
    2. console.log(flag && true) // true
    3. let flag1 = false
    4. console.log(flag1 && true) // false
    出现上述情况,是因为flag使用构造函数创建,打印flag,实际是Boolean{false},也就是其实是一个对象
    1. // 接 上面例子
    2. typeof flag // object
    3. typeof flag1 // boolean
    4. flag1 instanceof Boolean // true
    5. flag instanceof Boolean // false