JavaScript 之 数据在内存中的存储和引用
栈和堆
大家都知道,JS中的数据类型包括两种:简单数据类型(String、Number、Boolean、undefined、null)和复杂数据类型(object)。
在内存中分为栈区(stack)和堆区(heap),简单数据类型存放在栈区,复杂数据类型存放在堆区。在开发时,我们能直接操作栈区的变量,不能直接操作堆区,堆区数据由JS引擎操作完成。那么是怎么完成堆区变量的操作的呢,我从头开始说起。
先画一张图:

简单数据类型
- 声明一个变量 a 的时候, 会在栈里面开辟出一块新的内存空间, 用来存放这个变量a的数值
- 当变量 a 储存的数值发生改变时,栈区里对应的那块内存里存的数据也会发生改变
- 这是又声明一个变量 b,并把变量a赋值给变量 b,这是在栈区里面会开辟出一块新的空间,用来存放变量 b,变量 b 的值是变量 a 传递给他的。
- 此时这两个变量分别对应两块内存,储存的值是相同的,当变量 a 的值发生改变时,并不会影响到变量 b 的内存空间,变量 b 不会发生改变。
var a = 10;
a = 100;
var b = a;
a = 1000;
console.log(a); //
console.log(b); //
复杂数据类型
- 在声明一个对象obj1时,会在堆区中开辟一块空间,用来存放obj1的数据 => obj1 = { name: 'zs'}
- 但是 obj1 这个变量却是存储在栈区的,obj1 指向内存中的某一个地址,通过这个地址拿到堆区对应的数据。
- 如果将 obj1 这个对象赋值给 obj2 时,就是把 obj1 在栈区的地址传递给 obj2
- 此时,他们共享了堆区的同一块内存空间,如果 obj1 把对象中的一个属性修改了,obj2 的属性也会发生变化
- 如果对 obj1 重新赋值的话,那么这个对象就会指向另一块内训空间。就不再和 obj2 共享同一块内存区域了
var obj1 = { name: 'zs'}
var obj2 = obj1
obj1 = {age: 23}
console.log(obj1) // {age: 23}
console.log(obj2) // {name: "zs"}
JavaScript 之 数据在内存中的存储和引用的更多相关文章
- C语言之数据在内存中的存储
C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...
- C/C++数据在内存中的存储方式
目录 1 内存地址 2 内存空间 在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- float数据在内存中的存储方法
浮点型变量在计算机内存中占用4字节(Byte),即32-bit.遵循IEEE-754格式标准.一个浮点数由2部分组成:底数m 和 指数e. ±mant ...
- C语言 float、double数据在内存中的存储方式
float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...
- JavaScript 变量类型 保存内存中的位置 和 引用
1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...
- 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...
- Java的各类型数据在内存中分配情况详解
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ...
- Prometheus时序数据库-内存中的存储结构
Prometheus时序数据库-内存中的存储结构 前言 笔者最近担起了公司监控的重任,而当前监控最流行的数据库即是Prometheus.按照笔者打破砂锅问到底的精神,自然要把这个开源组件源码搞明白才行 ...
随机推荐
- 向量容器vector操作
1.向量容器vector 1.1 vector说明 进行vector操作前应添加头文件#include<vector>: vector是向量类型,可以容纳许多类型的数据,因此也被称为容器: ...
- 032、Java中判断某一个数字是奇数还是偶数
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 031、Java中偶数偶数的判断方法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- eshop7-mysql
1. Mysql 安装 执行 yum -y install mysql-server 注意:(1)是否使用sudo 权限执行请根据您具体环境来决定 (2)检查是否已经安装mysql-server rp ...
- ffmpeg 知识点
ffmpeg FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/ ...
- maven集成SSM项目,jetty部署运行——搭建maven项目部署jetty试运行(一)
今天闲来没事采用maven集成一个SSM框架来复习复习,下面开始我的复习之旅,慢慢来,不着急,哈哈,不忙时候敲两下,整起来. 工具为Eclipse,首先需要建立一个maven工程,file右键new- ...
- Python的一些常用知识
1.How to force urllib2 not to use a proxy Here is an example to remove proxy settings for all reques ...
- 027-PHP编码和解码函数base64
<?php $data = "我爱PHP";//解码前的值 print("我爱PHP: " . base64_encode($data)); //进行解码 ...
- IDE一直在indexing, 造成系统卡死解决方法
点击箭头指向,重启idea
- 开发者在行动-政府侧IT需求志愿者招募令(第一弹)
京东云与AI推出了[应急资源信息发布平台],在打通物资供需的同时,各地政府及公益组织可发布疫情信息化产品开发及运维服务的IT需求,如疫情防控统计.物资供需信息收集等IT管理.需求通过评审后平台将帮助发 ...