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

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.dtcms.com/a/308914.html

相关文章:

  • 智能化问题分析(Cherry Stdio+ MCP)
  • VS2022将.net4.8工程升级到.net6.0
  • 蚂蚁财富招Java高级研发
  • 基于deepseek的文本解析 - 超长文本的md结构化
  • AD域设计与管理-域策略-进阶
  • logging格式化输出日志asctime等详解
  • YOLOv13 汉化优化部署版本:超图增强自适应视觉感知的目标检测系统
  • 人工智能概念之十一:常见的激活函数与参数初始化
  • Python Day20 os模块 和 文件操作 及 例题分析
  • 【源力觉醒 创作者计划】对比与实践:基于文心大模型 4.5 的 Ollama+CherryStudio 知识库搭建教程
  • 免费数据恢复软件推荐:Wise Data Recovery 6.2.0 激活版使用指南
  • 2025年人形机器人动捕技术研讨会将在本周四召开
  • ESP32 外设驱动开发指南 (ESP-IDF框架)——GPIO篇:基础配置、外部中断与PWM(LEDC模块)应用
  • 深入理解 Slab / Buddy 分配器与 MMU 映射机制
  • React 路由守卫
  • 构型空间(Configuration Space,简称C-space)
  • 【计算机组成原理】第二章:数据的表示和运算(上)
  • Linux 系统管理-13-系统负载监控
  • 向日葵 远程控制软件下载及安装教程!
  • spring cloud ——gateway网关
  • 解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
  • 数据结构:多项式求值(polynomial evaluation)
  • 【支持Ubuntu22】Ambari3.0.0+Bigtop3.2.0——Step5—Nginx安装
  • 20250731在荣品的PRO-RK3566开发板的Android13下解决敦泰的FT8206触控芯片的只有4点触控功能
  • Redis过期策略
  • Apache RocketMQ 中 Topic 的概念、属性、行为约束和最佳实践
  • Docker 初学者需要了解的几个知识点 (五):建容器需要进一步了解的概念
  • 【生活系列】MBTI探索 16 种性格类型
  • C++入门自学Day3-- c++类与对象(赋值运算符与拷贝构造)
  • 【Linux】虚拟地址空间