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

简单理解js数据结构

一、堆栈的概念

在计算机领域中,堆栈是两种数据结构。

  • 堆:队列优先,先进先出;由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 栈:先进后出;动态分配的空间 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、js的数据类型

js的数据类型主要分为两种:基本类型值和引用类型值。

  • 基本类型值 有5种:undefined,null,boolean,number,string。这五种数据类型是按值访问的,是存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。

var str1 = "I am string",
	num1 = 10,
	bool1 = true,
	u1 = undefined,
	n1 = null;
//复制变量值
var str2 = str1,
	num2 = num1,
	bool2 = bool1,
	u2 = u1,
	n2 = n1;
//修改变量值
str2 = "Are you new";
num2 = 20;
bool2 = false;
复制代码

可以看到,基本类型值的复制是值的传递,赋值以后二者再无关联,修改其中一个不会影响另一个。


  • 引用类型值: 5种基本类型值以外的数据类型都可以看做是引用类型值,比如array,object等,是保存在堆内存中的对象。js不允许直接访问堆内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际是在操作对象的引用而不是实际的对象,是按地址访问的。
var obj1 = {
	a: "test a"
},  arr1 = [2, 5, 6];

var obj2 = obj1,
	arr2 = arr1;
//修改变量值
obj2.a = "change value";
arr1[1] = 48;
复制代码

可以看到,直接传递引用类性值的时候,传递的只是引用,二者指向同一块内存,所以修改其中一个,必然会引起另一个变量的变化。 在日常的使用中,我们把对象赋值给一个变量时,通常希望得到的是一个跟原对象无关的副本,修改新的变量不影响原对象,因此就有了浅拷贝和深拷贝。

三、浅拷贝和深拷贝

简单的说,浅拷贝就是只将对象 最外层 的键值复制为一个新的对象,而深拷贝则会 递归复制所有的层 ,直到该键的值为基本类型值。 再简单点说 ,经过浅拷贝后,新旧变量可能还会有所关联(既然说了是可能还有所关联,那也可能毫无关联吧,这里的关键就在于原对象的复杂程度了);而经过深拷贝后,理论上,新旧变量再无关联。 注意 ,在进行深拷贝时,层级不宜过多。所以,一般的深拷贝也并不是绝对毫无关联的。

var obj = {
  a: "a is a",
  arr: [ 1, 2, 3]
}, obj1 = { ...obj },  //假装这里是个浅拷贝

obj2 = JSON.parse(JSON.stringify(obj));  //假装这里是深拷贝。

obj1.a = "value a";
obj1.arr[0] = 66;
复制代码

可以看到,当原对象的值为 基本类型值 时,浅拷贝和深拷贝并没有区别;而当原对象的某些值为 引用类型值 时,如果修改变量的值,浅拷贝会改变原对象的值,而深拷贝则不会。


说了这些以后,不知道大家对js的数据结构有没有理解得更深刻一点呢???^_^

参考: 《JavaScript高级程序设计(第3版)》

相关文章:

  • js检测当前设备是移动端还是PC端
  • 开发者论坛一周精粹(第五十三期) ECS如何设置404页面? 首次WordPress建站大问题!...
  • linux必会10大排错命令
  • 小数据池
  • python程序员告诉你,python怎么学?30个特性带你快速了解python
  • 五周
  • (四)Controller接口控制器详解(三)
  • 【洛谷 P2480】 [SDOI2010]古代猪文(中国剩余定理,Lucas定理)
  • heroku之python项目
  • K8S集群中部署jenkins
  • 支配vue框架初阶项目之博客网站-单页-登陆和注册的跳转
  • linux 挂在硬盘,并自动重启挂载
  • mongodb查询数据库中某个字段中的值包含某个字符串的方法
  • Go并发编程实战 第2版 PDF (中文版带书签)
  • html2canvas.js 图片跨域 生成图片模糊 图片偏移 高清图的问题总结
  • [译] 怎样写一个基础的编译器
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • codis proxy处理流程
  • ES2017异步函数现已正式可用
  • Java小白进阶笔记(3)-初级面向对象
  • Koa2 之文件上传下载
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue的全局变量和全局拦截请求器
  • 阿里云购买磁盘后挂载
  • 从零搭建Koa2 Server
  • 机器学习学习笔记一
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 树莓派 - 使用须知
  • 跳前端坑前,先看看这个!!
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • raise 与 raise ... from 的区别
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (solr系列:一)使用tomcat部署solr服务
  • (初研) Sentence-embedding fine-tune notebook
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)setTimeout 和 setInterval 的区别
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (轉)JSON.stringify 语法实例讲解
  • .CSS-hover 的解释
  • .dwp和.webpart的区别
  • .NET Remoting学习笔记(三)信道
  • .Net Winform开发笔记(一)
  • .NET 分布式技术比较
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .skip() 和 .only() 的使用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Autowired 与@Resource的区别
  • @DateTimeFormat 和 @JsonFormat 注解详解