JavaScript 中基元类型与引用类型的解析

文章目录

      • 基元类型
        • Undefined 类型
        • Null 类型
        • Boolean 类型
        • Number 类型
        • String 类型
        • Symbol 类型
      • 类型详解
        • 对象(Object)
        • 数组(Array)
        • 函数(Function)
        • 日期(Date)、正则表达式(RegExp)
      • 内存管理
      • 包装对象
      • 注意事项

基元类型

Undefined 类型

undefined 是一个特殊的值,表示变量已经声明但未初始化。它也是一个属性存在于全局对象(如 windowglobal)上的属性名,这意味着它可以被覆盖或改变。然而,在严格模式下,尝试给 undefined 赋值会导致错误。

let x;
console.log(x); // undefined
Null 类型

null 表示空值或不存在的对象。它是对象类型的实例,这在历史上是一个设计失误。nullundefined 不同,null 是赋值的结果,表示“没有对象”。

let obj = null;
console.log(obj === null); // true
Boolean 类型

Boolean 类型有两个唯一的值:truefalse。JavaScript 中存在自动类型转换的概念,当非布尔值用于条件判断时,会被隐式转换为布尔值。例如,空字符串 ("")、数字 0NaNnullundefined 都会被转换为 false,其他大多数值都会转换为 true

if (true) {console.log('This is true');
}
Number 类型

Number 类型使用 IEEE-754 标准表示浮点数。所有数字都是以64位格式存储的。此外,还有特殊数值如 Infinity, -Infinity, 和 NaN(Not-a-Number)。从 ES2020 开始,Number 对象还支持 BigInt 语法来表示任意精度的整数。

let num1 = 42;        // 整数
let num2 = 3.14;      // 浮点数
let bigIntNum = 1234567890123456789012345678901234567890n; // BigInt
String 类型

String 类型是字符序列,可以包含 Unicode 字符。字符串是不可变的,一旦创建就不能更改。但是,你可以通过各种方法操作字符串,比如连接、截取等。

let greeting = "Hello, world!";
console.log(greeting.length); // 13
Symbol 类型

Symbol 是一种原始数据类型,用于创建唯一标识符。每个符号都是独一无二的,即使两个符号具有相同的描述。

let sym1 = Symbol('desc');
let sym2 = Symbol('desc');
console.log(sym1 === sym2); // false

类型详解

对象(Object)

对象是一组无序的键值对集合。键通常是字符串或符号,而值可以是任何数据类型。对象允许我们组织和关联复杂的数据结构。

let person = {name: 'Alice',age: 25,
};
数组(Array)

数组是一种特殊的对象,用于存储有序的元素列表。尽管数组长度可变,但它们是固定大小的容器,不能像某些语言那样动态调整大小。

let arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1, 2, 3, 4]
函数(Function)

函数也是对象,因此它们不仅可以作为代码执行块,还可以作为参数传递、返回值返回,甚至可以拥有自己的属性和方法。

function greet(name) {return `Hello, ${name}!`;
}
日期(Date)、正则表达式(RegExp)

Date 对象用于处理日期和时间,而 RegExp 对象则是用来执行正则表达式的匹配操作。

let now = new Date();
let pattern = /\d+/g;

内存管理

对于基元类型,它们直接保存在栈中,复制时会创建新的副本。而对于引用类型,它们的实际数据存储在堆中,变量只保存指向这些数据的引用。当你复制引用类型的变量时,实际上是在复制引用而不是数据本身。因此,如果两个变量指向同一个对象,并且其中一个修改了该对象,另一个也会看到这个变化。

包装对象

每当读取基元类型的属性或调用其方法时,JavaScript 会临时创建一个包装对象,以便访问那些通常只有对象才有的特性。例如:

let str = "hello";
console.log(str.toUpperCase()); // HELLO

这里 str 是一个字符串基元,但在调用 toUpperCase() 方法时,JavaScript 创建了一个 String 对象的临时实例来进行方法调用,之后立即销毁这个实例。

注意事项

  • 避免不必要的包装对象:由于每次访问基元类型的方法或属性都会创建临时的包装对象,频繁这样做可能导致性能问题。
  • 深拷贝 vs 浅拷贝:当你需要复制一个对象时,必须考虑你是想要一个浅拷贝(只复制顶层属性)还是深拷贝(递归地复制整个对象树)。浅拷贝可以通过解构赋值或者使用 Object.assign() 来实现;而深拷贝可能需要借助第三方库如 Lodash 的 _.cloneDeep() 方法。
  • 注意 ===== 的区别=== 执行严格比较,不会进行类型转换;而 == 会尝试将不同类型转换为相同类型再比较。推荐总是使用 === 除非有特定需求。

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

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

相关文章

切比雪夫不等式:方差约束下的概率估计

切比雪夫不等式:方差约束下的概率估计 背景 在概率分析中,切比雪夫不等式是一个常用的工具,它通过引入随机变量的 方差信息,给出了偏离均值的概率界限。这一不等式是对 马尔科夫不等式 的自然扩展,结合了更丰富的分布…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP(多生成树协议) 通过创建多个VLAN实例,将原有的STP、RSTP升级,避免单一VLAN阻塞后导致带宽的浪费,通过将VLAN数据与实例绑定,有效提升网络速率。 VRRP(虚拟路由冗余协议) 用…

Socket编程-tcp

1. 前言 在tcp套接字编程这里,我们将完成两份代码,一份是基于tcp实现普通的对话,另一份加上业务,client输入要执行的命令,server将执行结果返回给client 2. tcp_echo_server 与udp类似,前两步&#xff1…

深入浅出云计算 ---笔记

这是博主工作闲时的一些日常学习记录,有些之前很熟悉的,但工作中不常用,慢慢就遗忘了,在这里记录,也是为了激励自己坚持复习,如果有能帮到你,那我将感到非常的荣幸~ 快速到达↓↓↓ IaaS篇>&…

14 设计模式值观察者模式(书籍发布通知案例)

一、观察者模式定义 在日常开发中,我们经常会遇到一种场景:某个对象的状态发生变化时,需要通知并更新其他相关对象。这时,观察者模式便成为了解决问题的有效方案。观察者模式是一种常见的设计模式,它允许一个对象的状态…

15分钟训练数字人MimicTalk

只需15分钟,就能训练高质量,个性化数字人大模型。由浙江大学与字节跳动联合推出MimicTalk算法,目前已开源。 在外表和说话风格上和真人相似。将通用3D数字人大模型适应到单个目标人,采用动静结合的高效微调方案&#xff0…

c++高级篇(四) ——Linux下IO多路复用之epoll模型

IO多路复用 —— epoll 前言 在之前我们就已经介绍过了select和poll,在作为io多路复用的最后一个的epoll,我们来总结一下它们之间的区别: a select 实现原理 select 通过一个文件描述符集合(fd_set)来工作,该集合可以包含需要监控的文件…

【kettle】mysql数据抽取至kafka/消费kafka数据存入mysql

目录 一、mysql数据抽取至kafka1、表输入2、json output3、kafka producer4、启动转换,查看是否可以消费 二、消费kafka数据存入mysql1、Kafka consumer2、Get records from stream3、字段选择4、JSON input5、表输出 一、mysql数据抽取至kafka 1、表输入 点击新建…

docker-compose部署skywalking 8.1.0

一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联,版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…

用Python开发一个经典贪吃蛇小游戏

Python 是开发小游戏的绝佳工具,借助第三方库,如 pygame,我们可以快速开发一个经典的贪吃蛇游戏。本篇将介绍如何用 Python 实现一个完整的贪吃蛇小游戏。 一、游戏设计 1.1 游戏规则 玩家通过方向键控制贪吃蛇移动。贪吃蛇吃到食物后会变长,同时得分增加。如果贪吃蛇撞到…

在 MacOS 上为 LM Studio 更换镜像源

在 MacOS 之中使用 LM Studio 部署本地 LLM时,用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…

vue中.sync修饰符的用法

一、什么是.sync修饰符 在Vue.js中,.sync 修饰符用于创建一个双向绑定的 prop。它使子组件能够更新父组件的 prop 值,实现父子组件之间的双向数据同步。具体来说,.sync 修饰符主要有以下几个功能: 简化双向绑定: 使用…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo,完全适配HarmonyOS NEXT系统,实现了发送消息,添加好友等基础功能。代码开源,功能简洁,如果您有类似开发需求可以参考。 源码地址:https://github.c…

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下: -i 忽略大小写 -c 统计匹配的行数 -v 取反,不显示匹配的行 -w 匹配单词 -E 等价于 egrep ,即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

Can‘t find variable: token(token is not defined)

文章目录 例子 1:使用 var例子 2:使用 let 或 const例子 3:异步操作你的代码中的情况 Cant find variable: tokentoken is not defined源代码 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: tr…

Kafka-创建topic源码

一、命令创建topic kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2 二、kafka-topics脚本 exec $(dirname $0)/kafka-run-class.sh org.apache.kafka.tools.TopicCommand "$" 脚本中指定了…

【AI系统】GhostNet 系列

GhostNet 系列 本文主要会介绍 GhostNet 系列网络,在本文中会给大家带来卷积结构的改进方面的轻量化,以及与注意力(self-attention)模块的进行结合,部署更高效,更适合移动计算的 GhostNetV2。让读者更清楚的区别 V2 与 V1 之间的…

传奇996_51——脱下装备,附加属性设为0

奶奶的lua怎么都修改不了&#xff0c;可以调用txt的 ; LINKPICKUPITEM ; ChangeitemaddvaLue -1 5 0 ; GETITEMADDVALUE 3 5 M10 ; SENDUPGRADEITEM ; SENDMSG 9 你的衣服附加了<$STR(M10)>点防御属性. 或者lua callscriptex(actor,“LINKPICKUPITEM”) callscriptex(…

YOLOv8改进,YOLOv8引入CARAFE轻量级通用上采样算子,助力模型涨点

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…

大型制造企业IT蓝图、信息化系统技术架构规划与实施路线方案

关注 获取ppt​​​​​​全文&#xff0c;请关注作者