TypeScript 在类型脚本中的装箱和开箱
盒式和非盒式的概念对TypeScript至关重要。在TypeScript中,一个值类型会通过一个被称为装箱的过程自动转换为一个引用类型。换句话说,装箱是指将一个值类型转换为一个引用类型,而解箱是指将一个引用类型转换为一个值类型。这是TypeScript中使用的两种技术,用于将一个值类型转换为一个对象类型。
Boxing 是将一个对象类型解包回一个值类型的过程。这两种技术通过减少每次将值类型转换为对象类型时分配的内存量来提高代码性能。
Boxing 在 TypeScript 中指的是原始值被传递到函数或从函数返回时的处理方式。当一个原始值被传递到一个函数时,它被装箱了,这意味着它被转换为一个对象。当值从函数返回时,对象被解开,原始值被返回。这个过程是必要的,因为原始值不是面向对象的,必须经过转换才能让函数对其进行操作。框定和解除框定可以提高TypeScript应用程序的性能和内存使用。
现在让我们逐一详细解释这两个主题。
TypeScript中的装箱
TypeScript中的装箱指的是将原始数据类型(例如,数字、字符串、布尔)的值转换为相应封装类的对象。TypeScript有内置的原始数据类型的封装类,如Number、String和Boolean。这些包装器类提供了有用的方法和属性,可以用来操作相应的原始数据类型。例如,Number包装类有toFixed()、toString()和valueOf()等方法。框选是TypeScript中的一个重要概念,因为它允许使用原始数据类型上的方法,否则就无法使用。
语法
let variable_name: number = 12345
let boxing_variable_name: Object = variable_name // Boxing
在上面的语法中,我们可以看到在装箱的过程中,数字类型的变量_name的值被转换为对象类型的变量。
示例
在这个例子中,我们进行一个装箱操作。我们声明一个名为BoxingClass的类,并声明两个变量。一个是数字,另一个是一个对象型变量。我们声明了一个名为BoxingMethod()的方法,在这里我们执行装箱操作。最后,我们在控制台记录my_object变量的值。
class BoxingClass {
my_number: number = 123
my_object: Object
boxingMethod() {
this.my_object = this.my_number
console.log('Boxing Occurs for my_object variable')
}
}
let boxing_object = new BoxingClass()
boxing_object.boxingMethod()
console.log('my_object value: ', boxing_object.my_object)
var BoxingClass = /** @class */ (function () {
function BoxingClass() {
this.my_number = 123;
}
BoxingClass.prototype.boxingMethod = function () {
this.my_object = this.my_number;
console.log('Boxing Occurs for my_object variable');
};
return BoxingClass;
}());
var boxing_object = new BoxingClass();
boxing_object.boxingMethod();
console.log('my_object value: ', boxing_object.my_object);
输出
上述代码将产生以下输出 —
Boxing Occurs for my_object variable
my_object value: 123
TypeScript中的拆箱
Unboxing 在TypeScript中,将一个复合数据类型的值(对象、数组、元组、联盟等)转换为一个更简单的数据类型(字符串、数字、布尔值等)。它类似于其他编程语言中的 “开箱”,即一个特定类型的值(如对象)被转换为一个更简单的类型,如字符串或数字。
在TypeScript中,拆箱是使用类型断言语法(角括号)来指定要拆箱的值的类型。例如,如果我们有一个任意类型的值,我们可以通过使用以下语法将其解盒为一个数字类型:
语法
let variable_name: number = 12345
let boxing_variable_name: Object = variable_name // Boxing
let unboxing_variable_name: number = <number>boxing_variable_name // Unboxing
在上面的语法中,我们可以看到数字类型的变量_name的值在装箱的过程中被转换为对象类型的变量,然后用拆箱的方式转换回数字。
示例
在这个例子中,我们同时进行装箱和拆箱操作。我们声明了一个名为BoxingUnboxingClass的类,并声明了三个变量:两个是数字,另一个是对象类型变量。首先,我们使用boxingMethod()执行装箱操作,然后使用unboxingMethod()执行解箱操作。最后,我们在控制台记录变量的值。
class BoxingUnboxingClass {
my_number: number = 123
boxing_variable: Object
unboxing_variable: number
boxingMethod() {
this.boxing_variable = this.my_number
console.log('Boxing Occurs!')
}
unboxingMethod() {
this.unboxing_variable = <number>this.boxing_variable
console.log('Unboxing Occurs!')
}
}
let boxing_unboxing_object = new BoxingUnboxingClass()
boxing_unboxing_object.boxingMethod()
boxing_unboxing_object.unboxingMethod()
console.log('boxing_variable value: ', boxing_unboxing_object.boxing_variable)
console.log(
'unboxing_variable value: ',
boxing_unboxing_object.unboxing_variable
)
var BoxingUnboxingClass = /** @class */ (function () {
function BoxingUnboxingClass() {
this.my_number = 123;
}
BoxingUnboxingClass.prototype.boxingMethod = function () {
this.boxing_variable = this.my_number;
console.log('Boxing Occurs!');
};
BoxingUnboxingClass.prototype.unboxingMethod = function () {
this.unboxing_variable = this.boxing_variable;
console.log('Unboxing Occurs!');
};
return BoxingUnboxingClass;
}());
var boxing_unboxing_object = new BoxingUnboxingClass();
boxing_unboxing_object.boxingMethod();
boxing_unboxing_object.unboxingMethod();
console.log('boxing_variable value: ', boxing_unboxing_object.boxing_variable);
console.log('unboxing_variable value: ', boxing_unboxing_object.unboxing_variable);
输出
上述代码将产生以下输出 —
Boxing Occurs!
Unboxing Occurs!
boxing_variable value: 123
unboxing_variable value: 123
总之,TypeScript 中的装箱和解箱是指当原始值被传递到函数或从函数返回时的处理方式。盒化将原始值类型转换为对象类型,而解盒是将对象类型转换回原始值类型的反向过程。这些技术通过减少每次将值类型转换为对象类型时分配的内存量来提高代码性能。在TypeScript中,装箱是通过将一个原始值分配给一个对象变量来完成的,而解箱是使用类型断言语法(角括号)来指定要解箱的值的类型。需要注意的是,原始值的内存是在堆栈中分配的,而对象值的内存是在堆中分配的。