JS 基本包装类型

402 阅读2分钟

JS 提供了三种基本包装类型:String、 Number、 Boolean,与引用类型一样,基本包装类型也拥有内置方法可以对基础类型的值进行操作。

那么他们和基本类型中的:string、 number、 boolean 有什么区别呢?

下面我将以 string 为例对比他们的区别。

const a = 'hello'
const b = String('hello')
const c = new String('hello')

console.log(a) // hello
console.log(b) // hello
console.log(c) // String {'hello'}

console.log(typeof a) // string
console.log(typeof b) // string
console.log(typeof c) // object

根据打印的结果我们可以看出,通过直接对变量赋值与使用 String() 函数生成字符串的方式所得到的结果为基本类型,它们没有自己的方法或属性。

当使用 new String() 创建字符串时,此时的 String() 为构造函数,返回的结果是一个新的 String 实例,可以调用 String 的属性和方法,所以变量 c 是一个字符串对象,类型为引用类型。

所以在他们相比时会得到以下结果:

console.log(a == b) // true
console.log(a == c) // true

console.log(a === b) // true
console.log(a === c) // false

不过我们在平时的使用中,对变量赋值创建的字符串也可以直接使用 .length 方法获取它的长度,这是为什么呢?

const a = 'hello'
let length = a.length
console.log(length) // 5

原因在于,每当读取一个基本类型时,后台会自动创建一个对应的包装类型对象,从而可以调用一些方法来操作数据。

var _a = new String('hello') // 创建 String 类型的实例
let length = str.length // 调用实例上的方法
_a = null // 销毁这个实例

那基本包装类型和引用类型又有什么区别呢?

他们两个的主要区别在于生命周期的不同

  • 基本包装类型:当读取一个基本类型时,后台自动创建的包装类型只存于执行那一行的瞬间,执行完后会立即被销毁。
  • 引用类型:在执行流离开引用类型所在作用域才会销毁。

所以一般在基础类型是无法添加属性和方法的。

const a = 'hello'

// 自动创建 String 实例,这个实例添加了一个 next 属性,并将 'world' 赋值给这个属性
a.next = 'world'

// 上一行创建的 String 实例已经被销毁了,创建新的 String 实例,但这个新实例没有 next 属性
console.log(a.next) // undefined

总结

  • String 是 string 的包装类,是一种特殊的引用类型,有内置方法来操作基本类型的值,数据存储在内存中。
  • 每当读取一个基本类型时,后台会自动创建一个对应的包装类型对象,从而可以调用一些方法来操作数据,但代码执行完会被立即销毁。