详解JavaScript原始类型和包装对象

JavaScript 中的数据类型分为原始类型和对象类型。

基本类型的字符串和数字不是对象,但可以通过称为包装对象的机制将它们视为对象。

这一次,我将介绍原始类型和包装对象。

原始类型

在JavaScript中有7种原始类型

  • 数字(Number)

  • 字符串(String)

  • 长整数(BigInt)

  • 布尔值(Boolean)

  • null

  • undefined

  • 符号(Symbol)

以下代码定义字符串。

let str = 'string';

尝试对str使用toUpperCase方法。

let str = 'string';

console.log(str.toUpperCase()); // "STRING"

这将以大写形式输出“STRING”。

但是,为什么原始类型的字符串str可以调用toUpperCase方法呢?

那是因为创建了与原始类型的值相对应的特殊对象。

让我们仔细看看。

包装对象

在原始类型中,除了null和undefined之外,都有一个对应的包装对象。

原始类型包装对象
数字Number
字符串String
长整数BigInt
布尔值Boolean
符号Symbol

可以使用new运算符创建每个包装对象的实例。

例如,要创建字符串对应的String对象实例,可以这样写。

// 创建String对象的实例
let str = new String('string');

// 调用String对象的方法
console.log(str.toUpperCase()); // "STRING"

String可以将该对象'string'与包含的字符串值进行比较。

因此,这样的对象被称为原始类型值的包装对象。

声明变量时,原始类型的值仍然是该值的类型。

但是当你创建一个包装对象时,它的类型是对象。

let str = 'string';
console.log(typeof str); // "string"

let wrapperStr = new String('string');
console.log(typeof wrapperStr); // "object"

let num = 5;
console.log(typeof num); // "number"

let wrapperNum = new Number(5);
console.log(typeof wrapperNum); // "object"

像这样,对象的类型发生了变化,就能使用相应的方法。

详解JavaScript原始类型和包装对象

包装器对象的自动转换

通过使用new运算符创建包装对象,您可以调用该对象的方法。

下面的代码没有创建实例,但可以调用String对象的实例方法toUpperCase()。

let str = 'string';

console.log(str.toUpperCase()); // "STRING"

这是因为当您访问原始类型值的属性时,它会自动转换为包装对象。

这与使用new String()创建包装器对象的效果相同。

// 1和2相同
// 1.对字符串型的值进行方法的调用
let str = 'string';
str.toUpperCase();

// 2.创建包装对象后进行方法的调用
let wrapperStr = new String('string');
wrapperStr.toUpperCase();

一般来说,对于原始类型的数据使用字面值更好。

// 建议:使用字面值
let str = 'string';
let num = 5;

// 不建议:使用包装对象
let wrapperStr = new String('string');
let wrapperNum = new Number(5);

原因是仅在必要时对原始值使用方法自动将它们转换为包装器对象。没有必要一开始就创建包装对象。

此外,使用字面值的原始类型值和使用包装对象的值可能会引起混淆,因为它们表示不同的类型。(例如:使用typeof运算符时,字符串类型为‘string’,包装对象为‘object’)

正因为如此,对于原始类型的数据,大多数情况下都使用字面值。

结语

这一次,我介绍了原始类型和包装对象。

  • 除了null和undefined之外,每个原始类型的值都有各自对应的包装对象

  • new 运算符可用于实例化包装对象

  • 访问原始类型值的属性时会自动将其转换为包装对象

  • 从而可以在每个包装对象上调用方法