JavaScript内存管理完全指南:从入门到精通

文章目录

  • JavaScript内存管理完全指南:从入门到精通
      • 1. 哪些数据类型属于引用类型(复杂数据类型)?
      • 2. 为什么引用类型要存储在堆中?
      • 3. 引用类型的内存存储示例
        • 示例 1:对象(Object)
        • 示例 2:数组(Array)
        • 示例 3:函数(Function)
      • 4. 基本数据类型 vs. 引用数据类型
      • 5. 特殊情况:`const` 声明的引用类型
      • 总结

在这里插入图片描述

JavaScript内存管理完全指南:从入门到精通

在 JavaScript 中,所有的复杂数据类型(引用类型)都遵循这个原则

  • 变量名(标识符)存储在栈(Stack)中,并保存一个指向堆内存的引用地址(指针)
  • 实际的数据(如对象、数组、函数等)存储在堆(Heap)中

1. 哪些数据类型属于引用类型(复杂数据类型)?

JavaScript 中的引用类型包括:

  • Object(普通对象)
  • Array(数组)
  • Function(函数)
  • DateRegExpMapSet 等内置对象
  • 自定义的类实例

这些类型的数据都存储在堆中,而变量名(引用)存储在栈中。


2. 为什么引用类型要存储在堆中?

  • 动态大小:引用类型(如对象、数组)的大小可能动态变化,堆内存可以灵活分配空间。
  • 共享数据:多个变量可以引用同一个堆数据(节省内存)。
  • 栈的限制
    • 栈内存较小,适合存储固定大小的数据(如基本类型)。
    • 栈主要用于函数调用栈帧(局部变量、返回地址等),不适合存储大块数据。

3. 引用类型的内存存储示例

示例 1:对象(Object)
let obj1 = { name: "Alice" }; // `obj1` 在栈中存储堆的引用,对象数据在堆中
let obj2 = obj1;              // `obj2` 复制的是引用,指向同一个堆数据
obj2.name = "Bob";            // 修改会影响 `obj1`
console.log(obj1.name);       // "Bob"(因为 obj1 和 obj2 指向同一个堆数据)
示例 2:数组(Array)
let arr1 = [1, 2, 3]; // `arr1` 在栈中存储堆的引用
let arr2 = arr1;      // `arr2` 复制的是引用
arr2.push(4);         // 修改会影响 `arr1`
console.log(arr1);    // [1, 2, 3, 4]
示例 3:函数(Function)
function greet() { console.log("Hello!"); }
let func1 = greet;    // `func1` 存储的是函数的引用
let func2 = func1;    // `func2` 也指向同一个函数
func2();             // "Hello!"

4. 基本数据类型 vs. 引用数据类型

特性基本数据类型(Primitive)引用数据类型(Reference)
存储位置变量名和值都在变量名(引用)在中,数据在
赋值方式值拷贝(复制值)引用拷贝(复制指针)
修改影响不影响其他变量多个变量可能指向同一数据,修改会互相影响
示例let a = 10;let obj = { x: 1 };

5. 特殊情况:const 声明的引用类型

  • const 保证的是变量引用的地址不变,但堆中的数据仍然可以修改:
    const arr = [1, 2, 3];
    arr.push(4); // 允许(修改堆数据)
    arr = [5, 6]; // 报错(不能修改引用地址)
    

总结

所有复杂数据类型(引用类型)都遵循:变量名在栈中存储引用地址,实际数据在堆中。
基本数据类型(numberstring 等)直接存储在栈中。
✅ 理解这一点对避免 “浅拷贝 vs. 深拷贝”“数据共享问题” 至关重要。

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

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

相关文章

Linux网络-------3.应⽤层协议HTTP

1.HTTP协议 虽然我们说,应⽤层协议是我们程序猿⾃⼰定的.但实际上,已经有⼤佬们定义了⼀些现成的,⼜⾮常好⽤的应⽤层协议,供我们直接参考使⽤.HTTP(超⽂本传输协议)就是其中之⼀。 在互联⽹世界中,HTTP(HyperText Transfer Protocol,超⽂本…

05 GWAS表型数据处理原理

表型数据处理 • 质量性状 – 二分类:可用0 / 1, 1 / 2 数值表示 – 多分类:哑变量赋值,0/1 • 数量性状 – 尽量符合正太分布 – 剔除异常表型值样本 – 多年多点重复观测 – 对于阈值性状,分级数量化或哑变量赋值 R中 shapiro.t…

【Cpolar实现内网穿透】

Cpolar实现内网穿透业务需求第一步:准备工作1、关闭安全软件2、下载所需软件第二步:Nginx的配置第三步:使用cpolar实现内网穿透1、进入 https://dashboard.cpolar.com/get-started 注册,登录,完成身份证的实名认证2、下…

基于 JavaWeb+MySQL 的学院党费缴费系统

基于 JavaWeb 的学院党费缴费系统第 1 章绪论1.1 项目背景当今互联网发展及其迅速,互联网的便利性已经遍及到各行各业,惠及到每一个人,传统的缴费方式都需要每个人前往缴费点陆续排队缴费,不仅浪费大量了个人时间,而且…

LCGL基本使用

LVGC简介 light video Graphics Library (1)纯c与语言编程,将面向对象的思想植入c语言。 (2)轻量化图形库资源,人机交互效果好,在(ios Android QT)移植性较好,但是这些平台对硬件要求较高 lcgc工程搭建 工程源码的获取 获取工程结构 https://github.com/lvgl/lv_po…

嵌入式第十六课!!!结构体与共用体

一、结构体结构体是一种数据类型,它的形式是这样的:struct 结构体名{ 结构体成员语句1;结构体成员语句2;结构体成员语句3;};举个例子:struct Student {int id;char name[20];float score…

java web 实现简单下载功能

java web 实现简单下载功能 项目结构├── src\ │ ├── a.txt │ └── com\ │ └── demo\ │ └── web\ │ ├── Cookie\ │ ├── download\ │ ├── homework\ │ ├── serv…

虚幻基础:模型穿模

能帮到你的话,就给个赞吧 😘 文章目录模型穿模模型之间的阻挡是否正确设置模型是角色的组件:角色的组件不会与场景中其他的物体发生阻挡但可以发生重叠模型穿模 模型之间的阻挡是否正确设置 模型是角色的组件:角色的组件不会与场…

【Linux】linux基础开发工具(二) 编译器gcc/g++、动静态库感性认识、自动化构建-make/Makefile

文章目录一、gcc/g介绍二、gcc编译选项预处理编译汇编链接三个细节三、动静态库感性认识动静态库的优缺点四、自动化构建-make/Makefile背景知识初步上手Makefilemakefile的推导过程makefile语法一、gcc/g介绍 我们之前介绍了编辑器vim,可以让我们在linux上linux系统…

CentOS 7 上使用 Docker 安装 Jenkins 完整教程

目录 前言 准备工作 系统要求 检查系统信息 更新系统 安装Docker 第一步:卸载旧版本Docker(如果存在) 第二步:安装必要的软件包 第三步:添加Docker官方仓库 第四步:安装Docker CE 第五步:启动Docker服务 第六步:验证Docker安装 第七步:配置Docker用户权限…

30.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--公共代码--用户上下文会话

在前面的文章中,我们会看到使用ContextSession来获取当前用户的UserId和UserName。这篇文章我们就一起来看看如何实现ContextSession。 一、ContextSession的实现 我们在公共类库SP.Common中创建一个名为ContextSession的类,用于获取当前请求的用户信息。…

BaseDao

#### 10.1 DAO概念> DAO:Data Access Object,数据访问对象。 > > Java是面向对象语言,数据在Java中通常以对象的形式存在。一张表对应一个实体类,一张表的操作对应一个DAO对象!>> 在Java操作数据库时&a…

USRP捕获手机/路由器数据传输信号波形(中)

目录: USRP捕获手机/路由器数据传输信号波形(上) USRP捕获手机/路由器数据传输信号波形(中) USRP捕获手机/路由器数据传输信号波形(下) 三、双工通信信号捕获 3.1 信号接收系统 5805e6Hz&a…

使用 Kiro AI IDE 3小时实现全栈应用Admin系统

Hello, 大家好,我是程序员海军, 全栈开发 |AI爱好者 | 独立开发。 之前我是采用Node生态开发的大模型以及MCP Server,大模型开发的生态主要是Python语言,为了更好的学习大模型开发,于是开了新坑。开始学习Python, 以及…

浏览器pdf、image显示

浏览器地址栏 pdf data:application/pdf;base64, data:application/pdf;base64,JVBERi0xLjcKJeLjz9MKMjMgMCBvYmoKPDwv image data:image/jpeg;base64, data:image/jpeg;base64,/9j/4Q3fRXhpZgAATU0AKgAAAAgABwE

《Linux运维总结:银河麒麟V10 SP3启动docker容器报错permission denied》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、环境信息 二、背景 1、使用docker启动一个nginx容器,报错信息如下: docker: Error response from…

PDF源码解析

PDF源码解析打开PDF解析PDF​0. 文件头关键信息解析技术原理图解文件头的重要性实际文件结构示例开发者注意事项历史背景1. 根目录整体结构关键字段解析核心概念解释实际应用场景完整对象关系图技术总结2. 页面树对象结构关键字段解析页面树工作原理技术要点总结实际应用3. 图像…

java开闭原则 open-closed principle

基本知识 1.核心思想:面向抽象编程 2.基本内涵:对修改关闭,对扩展开放 3.要求:尽可能不修改源码而是增加新功能 例子 以spring5核心原理与30个类手写实战中的为例 package com.gupaoedu.vip.design.principle.openclose;/*** Crea…

拥抱智慧物流时代:数字孪生技术的应用与前景

概述 在数字经济全面推进的当下,物流行业正经历着前所未有的智能化升级。作为新一代信息技术的重要代表,数字孪生技术正悄然改变着物流的运作方式和决策模式。所谓数字孪生,是指在虚拟空间中创建与现实物流系统高度一致的数字模型&#xff0…

libnest2d-头文件分析-libnest2d.hpp-几何类型-策略类型-参数配置

libnest2d 库的主头文件,定义了一个用于 二维不规则形状自动排样(Nesting) 的C接口。以下是详细解析:1. 头文件结构 (1) 防止重复包含 #ifndef LIBNEST2D_HPP #define LIBNEST2D_HPP // ... #endif // LIBNEST2D_HPP确保头文件只被…