- TypeScript 基础
- TypeScript - 首页
- TypeScript - 路线图
- TypeScript - 概述
- TypeScript - 环境设置
- TypeScript - 基本语法
- TypeScript 与 JavaScript
- TypeScript - 特性
- TypeScript - 变量
- TypeScript - let & const
- TypeScript - 运算符
- TypeScript 基本类型
- TypeScript - 类型
- TypeScript - 类型注解
- TypeScript - 类型推断
- TypeScript - 数字
- TypeScript - 字符串
- TypeScript - 布尔值
- TypeScript - 数组
- TypeScript - 元组
- TypeScript - 枚举
- TypeScript - Any
- TypeScript - Never
- TypeScript - 联合类型
- TypeScript - 字面量类型
- TypeScript - 符号
- TypeScript - null 与 undefined
- TypeScript - 类型别名
- TypeScript 控制流
- TypeScript - 决策
- TypeScript - If 语句
- TypeScript - If Else 语句
- TypeScript - 嵌套 If 语句
- TypeScript - Switch 语句
- TypeScript - 循环
- TypeScript - For 循环
- TypeScript - While 循环
- TypeScript - Do While 循环
- TypeScript 函数
- TypeScript - 函数
- TypeScript - 函数类型
- TypeScript - 可选参数
- TypeScript - 默认参数
- TypeScript - 匿名函数
- TypeScript - Function 构造函数
- TypeScript - Rest 参数
- TypeScript - 参数解构
- TypeScript - 箭头函数
- TypeScript 接口
- TypeScript - 接口
- TypeScript - 扩展接口
- TypeScript 类与对象
- TypeScript - 类
- TypeScript - 对象
- TypeScript - 访问修饰符
- TypeScript - 只读属性
- TypeScript - 继承
- TypeScript - 静态方法和属性
- TypeScript - 抽象类
- TypeScript - 访问器
- TypeScript - 鸭子类型
- TypeScript 高级类型
- TypeScript - 交叉类型
- TypeScript - 类型守卫
- TypeScript - 类型断言
- TypeScript 类型操作
- TypeScript - 从类型创建类型
- TypeScript - Keyof 类型操作符
- TypeScript - Typeof 类型操作符
- TypeScript - 索引访问类型
- TypeScript - 条件类型
- TypeScript - 映射类型
- TypeScript - 模板字面量类型
- TypeScript 泛型
- TypeScript - 泛型
- TypeScript - 泛型约束
- TypeScript - 泛型接口
- TypeScript - 泛型类
- TypeScript 其他
- TypeScript - 三斜杠指令
- TypeScript - 命名空间
- TypeScript - 模块
- TypeScript - 环境声明
- TypeScript - 装饰器
- TypeScript - 类型兼容性
- TypeScript - Date 对象
- TypeScript - 迭代器和生成器
- TypeScript - Mixins
- TypeScript - 实用程序类型
- TypeScript - 装箱与拆箱
- TypeScript - tsconfig.json
- 从 JavaScript 到 TypeScript
- TypeScript 有用资源
- TypeScript - 快速指南
- TypeScript - 有用资源
- TypeScript - 讨论
TypeScript - 装箱与拆箱
TypeScript 中的值类型通过称为装箱的过程自动转换为引用类型。换句话说,装箱是指将值类型转换为引用类型,而拆箱是指将引用类型转换为值类型。这两种技术用于 TypeScript 中将值类型转换为对象类型。
装箱是将值类型包装在对象类型中的过程。相反,拆箱是将对象类型解包回值类型。这两种技术通过减少每次将值类型强制转换为对象类型时分配的内存量来提高代码性能。
TypeScript 中的装箱和拆箱指的是在将基本值传递给函数或从函数返回时处理它们的方式。当基本值传递给函数时,它会被装箱,这意味着它会被转换为对象。当值从函数返回时,对象会被拆箱,并且会返回基本值。此过程是必要的,因为基本值不是面向对象的,必须进行转换才能让函数对其进行操作。装箱和拆箱可以提高 TypeScript 应用程序的性能和内存使用率。
让我们详细逐一解释这两个主题。
TypeScript 中的装箱
TypeScript 中的装箱是指将基本数据类型(例如,number、string、boolean)的值转换为相应包装类的对象。
TypeScript 为基本数据类型内置了包装类,例如 Number、String 和 Boolean。这些包装类提供了可用于操作相应基本数据类型的有用方法和属性。
例如,Number 包装类具有toFixed()、toString() 和 valueOf() 等方法。装箱是 TypeScript 中的一个重要概念,因为它允许对基本数据类型使用否则不可用的方法。
语法
let variable_name: number = 12345 let boxing_variable_name: Object = variable_name // Boxing
在上面的语法中,我们可以看到类型为 number 的变量 variable_name 的值在装箱过程中被转换为对象类型变量。
示例
在此示例中,我们执行了装箱操作。我们声明了一个名为 BoxingClass 的类并声明了两个变量。一个是数字,另一个是对象类型变量。我们声明了一个名为 boxingMethod() 的方法,在其中我们执行装箱操作。最后,我们使用 console.log 打印 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)
编译后,它将生成以下 JavaScript 代码:
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 中的拆箱
TypeScript 中的拆箱将具有复合数据类型(对象、数组、元组、联合类型等)的值转换为更简单的类型(字符串、数字、布尔值等)。它类似于其他编程语言中的“拆箱”,其中特定类型的(如对象)的值被转换为更简单的类型,例如字符串或数字。
在 TypeScript 中,拆箱是使用类型断言语法(尖括号)来指定要拆箱的值的类型来完成的。例如,如果我们有一个 any 类型的变量,我们可以使用以下语法将其拆箱为 number 类型:<number> value。
语法
let variable_name: number = 12345 let boxing_variable_name: Object = variable_name // Boxing let unboxing_variable_name: number = <number>boxing_variable_name // Unboxing
在上面的语法中,我们可以看到类型为 number 的变量 variable_name 的值在装箱过程中被转换为对象类型变量,然后使用拆箱转换回数字。
示例
在此示例中,我们执行了装箱和拆箱操作。我们声明了一个名为 BoxingUnboxingClass 的类并声明了三个变量:两个是数字,另一个是对象类型变量。首先,我们使用 boxingMethod() 执行装箱过程,然后使用 unboxingMethod() 执行拆箱过程。最后,我们使用 console.log 打印变量的值。
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 )
编译后,它将生成以下 JavaScript 代码:
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 中,装箱是通过将基本值分配给对象变量来完成的,而拆箱是使用类型断言语法(尖括号)来指定要拆箱的值的类型来完成的。需要注意的是,基本值的内存分配在栈上,而对象值的内存分配在堆上。