JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系

JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系

JavaScript 的原始(primitive)数据类型包括包括数字(Number)、字符串(String)、布尔值(Boolean)、null、undefined、符号(Symbol,ES6 引入)和 BigInt(ES2020 引入)。这些原始数据类型是不可变的,没有属性或方法。

在 JavaScript 中,原始数据类型和内置对象(也称为对象类型或包装器对象)之间存在一种特殊的关系。

原始数据类型和对应的对象类型之间的关系:

  • 原始类型是简单的数据类型,没有属性或方法。
  • 对应的对象类型是通过构造函数创建的复杂对象,具有属性和方法。
  • JavaScript 会在需要时自动将原始类型的值包装成对应的对象类型,以便可以调用方法。
  • 这个自动包装过程通常是透明的,开发者不需要手动进行装箱或拆箱操作。
  • 通常情况下,我们在编程时使用原始数据类型,因为它们更简单、更快。只有在需要利用对象的属性和方法时,JavaScript 引擎才会临时将它们转换为对象。

理解原始数据类型和对象类型之间的关系需要注意的几个方面:

  • 自动装箱(Autoboxing:当你对一个原始数据类型的值使用属性或方法时,JavaScript 会自动将其转换(装箱)为对应的对象类型,这样就可以使用对象提供的方法和属性。例如,当你对一个字符串原始值调用 .length 属性时,JavaScript 会临时将其转换为 String 对象,然后访问其 length 属性。
  • 原始值的不可变性:原始数据类型的值是不可变的,这意味着一旦创建,它们的值就不能改变。相反,对象是可变的,你可以改变其属性和方法。
  • 性能考虑:使用原始数据类型通常比使用对象类型更高效,因为原始类型占用的内存更少,且没有对象的额外开销。
  • 类型转换:你可以通过调用对象类型的方法来显式地将原始类型转换为对象类型,反之亦然。例如,String(123) 会将数字转换为字符串,而 Number("123") 会将字符串转换为数字。

JavaScript 提供了一些内置的构造函数,如 Number 和 String,这些构造函数可以用来创建对应原始类型的包装对象。这些包装对象是可以包含属性和方法的复杂数据类型。当你对一个原始类型的值调用方法时,JavaScript 会临时将其包装成一个对象,以便你可以调用这些方法。

原始类型的数字是不可变的值。当你对一个原始类型的数字进行操作时,实际上是在创建一个新的数字值。例如:

let num = 10;

num.toFixed(2); // "10.00"

在上面的例子中,toFixed 是一个方法,看起来像是直接被数字字面量 10 调用的。但实际上,JavaScript 在幕后将 10 临时转换成了一个 Number 对象,然后在这个对象上调用了 toFixed 方法。这个过程称为 “装箱”(boxing)。

Number 对象是通过 Number 构造函数创建的,它包含了数字的属性和方法。例如:

let numObject = new Number(10);

numObject.toFixed(2); // "10.00"

在这个例子中,numObject 是一个 Number 对象,它是一个包含原始数字值的复杂对象。

原始类型的字符串也是不可变的值。字符串有很多方法,比如 toUpperCase 和 charAt,这些方法可以被字符串字面量直接调用:

let str = "hello";

str.toUpperCase(); // "HELLO"

当调用 str.toUpperCase() 时,原始字符串 "hello" 被临时包装成一个 String 对象,然后在这个对象上调用 toUpperCase 方法。完成方法调用后,这个临时对象就被丢弃了。

String 对象是通过 String 构造函数创建的,它同样包含了字符串的属性和方法:

let strObject = new String("hello");

strObject.toUpperCase(); // "HELLO"

在这个例子中,strObject 是一个 String 对象。

需要注意的是,在实际编程中,我们通常直接使用原始数据类型,而不是显式创建对象类型,因为 JavaScript 引擎会根据需要自动进行装箱和拆箱操作。

换句话说,在实际编程中,我们通常直接使用原始数据类型,因为它们更简单、更高效。JavaScript 引擎会在需要时自动进行原始数据类型到对象类型的临时转换(装箱),以便我们可以利用对象上的方法和属性,这个过程对开发者来说是透明的,通常不需要手动创建这些对象。

并不是每个原始数据类型都有一个直接对应的对象类型,具体情况如下:

Number: 有一个对应的对象类型,即 Number 对象。

String: 有一个对应的对象类型,即 String 对象。

Boolean: 有一个对应的对象类型,即 Boolean 对象。

Symbol: 有一个对应的对象类型,即 Symbol 对象。

BigInt: 有一个对应的对象类型,即 BigInt 对象。

然而,对于 null 和 undefined,情况就不同了:

null: 没有对应的对象类型。null 表示“没有值”或“空值”,它通常用于指示变量未指向任何对象。

undefined: 同样没有对应的对象类型。undefined 表示变量已声明但未被初始化。

内置构造函数和它们创建的对象包装器:

Number: 这个构造函数用于创建数字的对象包装器。例如,new Number(123) 会创建一个包装了数字 123 的 Number 对象。

String: 这个构造函数用于创建字符串的对象包装器。例如,new String("text") 会创建一个包装了字符串 “text” 的 String 对象。

Boolean: 这个构造函数用于创建布尔值的对象包装器。例如,new Boolean(true) 会创建一个包装了布尔值 true 的 Boolean 对象。

Symbol: 用于创建符号的构造函数,它是 ES6 中引入的。例如,Symbol('description') 会创建一个具有描述的新符号。

BigInt: 用于创建大整数的构造函数,它是在 ES2020 中引入的。例如,BigInt(12345678901234567890) 会创建一个 BigInt 对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】E : 货币套汇(图路径)

E : 货币套汇(图路径) Description 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,1法郎可以买到0.16美元。通过货币兑换&a…

ELK企业级日志分析平台——ES集群监控

启用xpack认证 官网:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成证书 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…

GB/T 29498-2013 木门窗检测

木门窗是指以木材、木质复合材料为主要材料制作框和扇的门窗。 GB/T 29498-2013 木门窗检测项目 测试项目 测试标准 外观质量 GB/T 29498 尺寸 GB/T 29498 装配质量 GB/T 29498 含水率 GB/T 17657 附着力 GB/T 4893.4 外门窗耐冷热循环 GB/T 4893.7 耐划痕 GB/…

Volcano3D绘制3D火山图

一边学习,一边总结,一边分享! 本期教程内容 **注:**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形,在前面的推文中,我们也推出了好几期火山图的绘制教程&#xff0…

【代数学习题4.2】从零理解范数与迹 —— 求数域元素的范数与迹

从零理解范数与迹 —— 求数域元素的范数与迹 写在最前面题目解答 2. 范数 N N N思路求解过程python求解 3. 数域 K K K 的范数 N K N_K NK​思路求解过程Python求解分析解题步骤 4. 迹 T T T求解过程共轭元素计算迹 python求解分析解题步骤 5. 数域 K K K 的迹 T K T_K …

读书笔记——《黑猩猩的政治》

前言 弗朗斯德瓦尔(Frans de Waal)的代表作《黑猩猩政治》成书于1982年,是它的首部书籍作品,也是美国国会新任议员的被推荐读物。之前看的他另一部作品的《万智有灵》是2016年的作品,时间跨度居然这么大。《万智有灵》介绍了许多…

代码随想录 135. 分发糖果

题目 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准…

SDK广告类型及其作用与收益分析

在移动应用开发领域,软件开发工具包(SDK)广告已经成为应用开发者们获取收益的一种重要途径。不同类型的SDK广告提供了多样化的选择,以满足开发者的需求。本文将介绍几种常见的SDK广告类型,并深入探讨它们的作用及对开发…

SPASS-信度分析

信度分析概述 效度 效度指的是量表是否真正反映了我们希望测量的东西。一般来说,有4种类型的效度:内容效度、标准效度、结构效度和区分效度。内容效度是一种基于概念的评价指标,其他三种效度是基于经验的评价指标。如果一个量表实际上是有效…

【亚太杯前两问论文】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——论文无偿分享!!! C题前两问论文代码已出,其他赛题及后续论文代码会持续更新。 祝各位小伙伴都能在比赛中发挥出色,取得心仪的成绩呦!一起加油&#xff…

vscode在运行c语言时,无法scanf输入

问题: 在学习c语言中,我在使用scanf和cin时无法在终端进行输入(运行了但是无法输入),在网上寻找答案,并写下笔记 解决方法 选择左上角 文件->首选项(preferences)->设置(settings&#xf…

网关和链路追踪

Spring Cloud的网关 在Spring Cloud中,网关(Gateway)是一种用于管理和路由微服务请求的中间层服务。它充当了整个微服务架构的入口点,负责将来自外部的请求转发到相应的微服务上。常见的网关包括Spring Cloud Gateway和Netflix Zu…

Java类加载那些事

Java源文件(.java文件)被编译器编译后变为字节码形式的类文件(.class文件),Java类加载的过程就是JVM加载.class的二进制文件并且放到内存中,将数据放到方法区,并且在堆区构造一个java.lang.clas…

动态规划从入门到精通

目录 动态规划的详解 动态规划的应用 机器人到达指定位置数 换钱的最少货币数 排成一条线的纸牌博弈问题 象棋中马的跳法 Bob的生存概率 换钱的方法数 动态规划的总结 动态规划的详解 暴力尝试递归操作中有很多重复计算的操作,浪费时间。动态规划就是减少暴力…

大模型增量预训练参数说明

在增量预训练过程中通常需要设置三类或四类参数,模型参数,数据参数,训练参数,额外参数。 下面分别针对这四种参数进行说明。 欢迎关注公众号 模型参数 model_type模型类型,例如bloom,llama,baichuan,qwen等。 model_name_or_path模型名称或者路径。 tokenizer_name_or…

JS数组常用的20种方法详解(每一个方法都有例子,超全面,超好理解的教程,干货满满)

目录 1.会改变原数组的方法(7种) 1.push() 2.pop() 3.unshift() 4.shift() 5.reverse() 6.sort() 7.splice() 2.不改变原数组的方法(13种,返回的新数组是从原数组浅拷贝来的) 1.concat() 2.join() 3.slice…

12个最佳WordPress投票插件

您是否正在为您的网站寻找WordPress投票插件? WordPress投票插件可让您轻松地在您的网站上进行民意调查,用户可以投票。这是在收集见解的同时建立用户参与度的有效策略。 在本文中,我们精心挑选了最好的WordPress投票插件,可帮助…

代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

文档讲解:代码随想录 视频讲解:代码随想录B站账号 状态:看了视频题解和文章解析后做出来了 300.最长递增子序列 class Solution: # 2516 ms, faster than 64.96%def lengthOfLIS(self, nums: List[int]) -> int:n len(nums)dp [1] * n…

从Discord的做法中学习 — 使用Golang进行请求合并

正如你可能之前看到的,Discord去年发布了一篇有价值的文章,讨论了他们成功存储了数万亿条消息。虽然有很多关于这篇文章的YouTube视频和文章,但我认为这篇文章中一个名为“数据服务为数据服务”的部分没有得到足够的关注。在这篇文章中&#…

QT项目移植到VS+QT(RTI-DDS)

QT中.pro文件中include(./xxx.pri) pri文件如下定义 unset(FILENAMES)for(FILENAME, FILENAMES) {HEADERFILE $$PWD/$${FILENAME}.hif(exists($$HEADERFILE)) {HEADERS * $$HEADERFILE}SOURCEFILE $$PWD/$${FILENAME}.cppif(exists($$SOURCEFILE)) {SOURCES * $$SOURCEFILE}…