当前位置: 首页 > news >正文

Javascript——原始数据类型的自动装箱

自动装箱

  • 聊个例子
  • 介绍
    • 例子

聊个例子

‘asd’.length
//这其中是怎么执行的

在 JavaScript 中,字符串是原始数据类型(primitive data type),但它们表现得像对象,因为它们有属性和方法。当你对一个字符串使用 .length 属性时,JavaScript 内部会执行以下步骤:

  1. JavaScript 引擎识别 ‘asd’ 是一个字符串字面量。
  2. 当尝试访问其 .length 属性时,JavaScript 临时将这个字符串字面量包装成 String 对象。这是一个自动的装箱(boxing)过程,即从原始字符串到对象的转换。
  3. 在这个临时创建的 String 对象上访问 .length 属性。
  4. .length 属性返回字符串中字符的数量。
  5. 一旦属性访问完成,这个临时创建的 String 对象就被丢弃。
    示例中 ‘asd’.length 的执行过程如下:
const exampleString = 'asd'; // 这是一个字符串字面量
const lengthOfExampleString = exampleString.length; // 访问 .length 属性
console.log(lengthOfExampleString); // 输出:3

这个过程非常高效,JavaScript 引擎优化了装箱操作,使其几乎没有性能损失。由于这种行为,原始字符串在被操作时看起来就像是具有属性和方法的对象。类似地,其他原始数据类型(如数字和布尔值)也会经历这样的自动装箱过程,当它们被用作对象时。

介绍

在 JavaScript 中,自动装箱(Automatic Boxing)是指当对原始数据类型(如字符串、数字和布尔值)执行类似对象的操作时,JavaScript 引擎会临时将其转换成对应的对象类型,以便可以使用对象上的方法或属性。

原始数据类型包括:

  • String
  • Number
  • Boolean
  • Symbol (在 ES6 及之后的版本中)

它们对应的对象类型分别是:

  • String 对象
  • Number 对象
  • Boolean 对象
  • Symbol 对象

例子

例如,当你对一个原始字符串使用方法或属性时,JavaScript 会临时创建一个 String 对象,你实际上是在这个对象上调用方法。
这个过程称为装箱,因为原始值被放入了一个对象“盒子”中。
一旦方法或属性的操作完成,这个临时创建的对象就会被销毁,这个过程是透明的,开发者通常不需要关心它。

让我们看一个具体的例子来说明自动装箱:

let primitiveValue = "hello"; // 这是一个原始字符串
console.log(primitiveValue.length); // 输出:5

在上面的代码中,.length 是 String 对象上的属性,但 primitiveValue 是一个原始字符串,并不是对象。JavaScript 引擎暂时将 primitiveValue 装箱成一个 String 对象,从而可以访问 .length 属性。随即这个临时的对象就被丢弃了。

相反的过程称为拆箱(Unboxing),即将对象转换为原始数据类型。在 JavaScript 中,可以通过调用对象的 valueOf() 或 toString() 方法来显式进行拆箱。
在这里插入图片描述

自动装箱是 JavaScript 内部机制的一部分,主要目的是提供编程的便利性。它使得在编写代码时你能够像处理对象一样处理原始数据类型,而不用手动创建对象实例。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 甄选范文“论软件设计方法及其应”软考高级论文系统架构设计师论文
  • MySQL —— 表的设计
  • 简单聊一聊Vue是如何管理多环境的后端服务的?
  • leetcode787. K 站中转内最便宜的航班——优先队列优化的Dijkstra算法+剪枝
  • 【C#】计算多边形的面积
  • Redis的面试题
  • 数据类型练习
  • 25-原理图BOM的输出
  • 智慧宠物护理:智能听诊器引领健康监测新潮流
  • 利用 Docker 和 Poetry 优化 Python 应用部署
  • 鸿蒙(API 12 Beta3版)【时域可分层视频编码】 音视频编码
  • YOLOv8改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
  • Python爬虫:下载4K壁纸
  • 六、go函数
  • 我与数据库的七年之痒:从初识到没它不行
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • crontab执行失败的多种原因
  • LeetCode算法系列_0891_子序列宽度之和
  • 阿里研究院入选中国企业智库系统影响力榜
  • 测试如何在敏捷团队中工作?
  • 基于游标的分页接口实现
  • 前端存储 - localStorage
  • 微服务框架lagom
  • 写给高年级小学生看的《Bash 指南》
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #07【面试问题整理】嵌入式软件工程师
  • #if等命令的学习
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (3)STL算法之搜索
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (六)Hibernate的二级缓存
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)大型网站架构演变和知识体系
  • (轉)JSON.stringify 语法实例讲解
  • .Net - 类的介绍
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 设计一套高性能的弱事件机制
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET6 命令行启动及发布单个Exe文件
  • .net6Api后台+uniapp导出Excel
  • .net6使用Sejil可视化日志
  • .NET导入Excel数据
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net连接MySQL的方法
  • .skip() 和 .only() 的使用
  • @31省区市高考时间表来了,祝考试成功
  • @JoinTable会自动删除关联表的数据
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945