Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值

原始值:简单的数据即基础数据类型,按值访问。

引用值:由多个值构成的对象即复杂数据类型,按引用访问。

  • 动态属性

对于引用值而言,可以随时添加、修改和删除其属性和方法。

javascript 复制代码
let person = new Object();
person.name = 'Jason';
person.age = 42;
console.log(person.name,person.age);//'Jason',42

对于原始值而言,不能有属性,但是尝试给原始值添加属性不会报错。

javascript 复制代码
let name = 'Jason';
name.age = 42;
console.log(name.age);//undefined
  • 复制值

原始值复制的两个变量互相独立,互不干扰。

引用值的复制值实际上是指针,它指向存储在堆内存中的对象,两个变量实际上指向同一个对象。

垃圾回收

JavaScript是使用垃圾回收的语言,通过自动内存管理实现内存分配和闲置资源回收。垃圾回收主要有两种标记策略:标记清理和引用计数。

  • 标记清理

垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后在被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存。

  • 引用计数

其思路是对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为 1。如果同一个值又被赋给另一个变量,那么引用数加 1。类似地,如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1。当一个值的引用数为 0 时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。垃圾回收程序下次运行的时候就会释放引用数为 0 的值的内存。引用计数存在的问题:循环引用的数据没法进行回收,因为计数永远不会为0.

相关推荐
GreenTea6 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
mCell8 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
小弥儿8 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
笃行3509 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
excel10 小时前
前端加密的作用与使用场景
前端
知识分享小能手10 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
m4Rk_10 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白11 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
计算机魔术师11 小时前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端
去伪存真11 小时前
大模型的参数量为什么那么大?
前端·人工智能