js的栈堆与浅拷贝、深拷贝的理解

一:什么是堆栈?

  我们都知道:在计算机领域中,堆栈是两种数据结构,它们只能在一端(称为栈顶(top))对数据项进行插入和删除。

  • 堆:队列优先,先进先出;由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  • 栈:先进后出;动态分配的空间 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 
    以上都属于计算机基础部分,在此都不详细赘述了,下面我们联系JavaScript来剖析一下堆栈。
  • 栈堆之间的关系,在栈中存放的基本类型数据如果包含了应用类型(heap),那么栈中存放的只是堆中的一个地址,根据这个地址系统可以找到数据在堆中的位置。

二:JavaScript中的基本类型和引用类型与堆栈有什么联系?

JavaScript的数据类型分为两大种: 
1. 基本类型:Undefined、Null、Boolean、Number 和 String,这5中基本数据类型可以直接访问,他们是按照值进行分配的,存放在栈(stack)内存中的简单数据段,数据大小确定,内存空间大小可以分配。 
2. 引用类型:即存放在堆(heap)内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。 
  以上我们知道了什么是堆栈,和JavaScript的数据类型,下面我们根据js的数据类型来说明一下他们的拷贝情况:

结合下面的例子理解堆栈的关系:

	var xm = {age: 18,score: 4};var xh = {age: 18,score: 4};console.log(xm===xh);   //falsevar  newobj=xhconsole.log(newobj===xh);   //true//下面这也是一个你叫经典的例子可以试一下function setName(obj) {obj.name = 'xm';  //在传参数中新建内存对象,并且设定一个值obj = {};          //对象是引用类型。系统在堆中新建一个内存空间,与传入值无关。obj.name = 'xh';   //在新建的内存空间设置一个值(与传入值是独立开来的。)}var person = {};setName(person);console.log(person.name);   // xm
//console.log([] instanceof Array);
// console.log(typeof []);

xm和xh的对象值是一样的,可是在关系比较重为false,当新建对象赋值是这种情况就是true.下图给大家讲解。

这就会出现另外一种情况,我们想去判断引用类型的值是否相等,(下面以对象为例子进行讲解。)

	var xm = {age: 18,score: 4};var xh = {age: 18,score: 4};
function equalObjs(a, b) {for (var p in a) {if (a[p] !== b[p]) return false;}return true;}

三:什么是浅拷贝?

   基本类型拷贝的时候只是在内存中又开辟了新的空间,是的新建的值与拷贝值相互独立。(可以理解为在堆中新建一个空间存放同样的值。)这个方法可以利用上面判断相等的办法遍历出堆(heap)值重新赋值。因此深浅拷贝是相对于引用类型的。

	var xm = {age: 18,score: 4,arr1:[1,32]};function copyObj(obj) {var newObj = {};for (var p in obj) {newObj[p] = obj[p];}return newObj;}var xh = copyObj(xm);// var arr1=[1,2,3]xh.arr1.push(33)console.log(xh)  //{age: 18, score: 4, arr1: Array(3)}console.log(xh===xm); //falseconsole.log(xh.arr1===xm.arr1);  //true 

console.log(xh.arr1===xm.arr1);  //true 这里出现了一个问题,浅拷贝中遍历对象里面包含了另外一个应用类型(arr1),而它的空间是独立的,这样直接被引用。

如果想实现两个值的完全独立,这时就需要使用到深拷贝。

四:深度拷贝

      根据浅拷贝出现的问题,我们可以使用深拷贝的方法解决问题。

      深拷贝的方法比较多,我举一些比较简单的例子来说明一下。

最简单的办法:JSON.parse(obj)

	var xm = {age: 18,score: 4,arr1:[1,32]};var xh=JSON.parse(JSON.stringify(xm))xh.arr1.push(33)console.log(xh)  //{age: 18, score: 4, arr1: Array(3)}console.log(xh===xm); //falseconsole.log(xh.arr1===xm.arr1);  //false

其他的方法需要使用递归操作来进行。

转载于:https://www.cnblogs.com/qiuxiaojian/p/9415721.html

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

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

相关文章

ea 备份码是什么_EA的原始访问是什么,值得吗?

ea 备份码是什么EA’s Origin Access gives you access to more than 70 games, discounts, and new EA games before they’re released for a monthly (or yearly) subscription fee. But is it really worth it? EA的Origin Access可让您访问70多种游戏,打折游戏…

JS框架_(JQuery.js)纯css3进度条动画

百度云盘  传送门  密码&#xff1a;wirc 进度条动画效果&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1">…

如何在Android主屏幕上添加热点快捷方式

Portable Wi-Fi hotspots on your Android phone are great, because hotel Wi-Fi usually isn’t, but toggling that hotspot on and off is a pain. Here are several easy ways to add a hotspot widget to your home screen. 您的Android手机上的便携式Wi-Fi热点很棒&…

SQLI DUMB SERIES-16

&#xff08;1&#xff09;无论怎么输入&#xff0c;都没有回显&#xff0c;但当输入 admin")#时&#xff0c;显示登录成功。若通过其他方法获取数据库的用户名&#xff0c;可通过这个方法登录成功。 &#xff08;2&#xff09;获取其他信息可用考虑时间延迟注入。方法同1…

如何在YouTube视频上禁用注释

YouTube has that betcha-can’t-watch-just-one appeal to it, which is why YouTube’s annoyances become so pronounced the more you use it. Many of these features, such as annotations can be permanently disabled, making for a more enjoyable viewing experience…

快速实现一个Http回调组件

2019独角兽企业重金招聘Python工程师标准>>> 快速实现一个Http回调组件 一、前情回顾 ​ 我们平时在使用一些库的时候&#xff0c;会遇到一些看起来很舒服的写法&#xff0c;用起来感觉很简单&#xff0c;而且写法也很优雅&#xff0c;比如OkHttp&#xff0c;或者是…

MyBatis缓存通俗易懂

1.1 mybatis缓存介绍 如下图&#xff0c;是mybatis一级缓存和二级缓存的区别图解&#xff1a; Mybatis一级缓存的作用域是同一个SqlSession&#xff0c;在同一个sqlSession中两次执行相同的sql语句&#xff0c;第一次执行完毕会将数据库中查询的数据写到缓存&#xff08;内…

Python基础教程:Python pass语句详解

2019独角兽企业重金招聘Python工程师标准>>> Python pass 语句 Python pass是空语句&#xff0c;是为了保持程序结构的完整性。 pass 不做任何事情&#xff0c;一般用做占位语句。 Python 语言 pass 语句语法格式如下&#xff1a; 实例&#xff1a; 学习从来不是一个…

网络串流_串流NFL足球的最便宜方式(无需电缆)

网络串流Football season is almost upon us. That means one thing: expensive cable or satellite TV packages. Okay, it also means beer commercials and overpriced stadium tickets and quarterbacks trying to sell you car insurance. But in terms of immediate cost…

【高清】网络安全思维导图

本文转自 是阿杰啊 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/jschinamobile/1969018

Pixel相机是怎么做到自动补抓最不错的自拍照

网络大厂 AI研究团队近日在最新的Pixel相机中&#xff0c;于无快门模式Photobooth新增亲吻侦测功能&#xff0c;当用户亲吻自己的爱人时&#xff0c;相机会自动捕捉这一瞬间。网络大厂过去是藉由Photobooth模式&#xff0c;让用户更简单地成功自拍&#xff0c;不管是一个人、情…

os x 启动引导_什么是OS X的启动板以及它如何工作?

os x 启动引导If you’re new to OS X, or even if you’re not and you’re simply used to pinning everything to the Dock, you might have wondered what Launchpad is, what it does, and how to use it. 如果您不熟悉OS X&#xff0c;或者即使您不熟悉OS X&#xff0c;而…

freeradius的proxy功能

要配置freeRADIUS的proxy功能&#xff0c;就需要熟悉它的两个配置文件&#xff1a;proxy.conf 和client.conf。 1. proxy.conf主要是用来配置被代理的radius server&#xff08;也叫home server&#xff09; 和 realm&#xff0c; 以及他们之间的映射关系&#xff0c;也就是req…

小程序 iphone和安卓_如何阻止iPhone和iPad应用程序要求评级

小程序 iphone和安卓Lots of iPhone and iPad apps ask for ratings, and they often don’t stop. Even if you do leave a review just to stop seeing the review requests, new apps you install will pester you for reviews, too. iOS 11 fixes this problem, limiting h…

一篇年薪60万的JVM性能调优文章

2019独角兽企业重金招聘Python工程师标准>>> JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗&#xff0c;垃圾收集器能支撑应用达到的最高性能指标。延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿…

手机主题随手机壳改变_无线充电可以与手机壳一起使用吗?

手机主题随手机壳改变With wireless charging making its way into the new iPhones, there are undoubtedly a lot of questions floating around about how this technology works in practical application. The biggest question I’ve heard so far is: will it work with…

android 文本后图标_如何在Android中更改文本,图标等的大小

android 文本后图标Let’s face it: no matter how good the screens are on our phones and tablets, the text can sometimes be too tiny if you have poor eyesight. The good news is that there are a variety of methods to help you alleviate squinting just to make …

Linux文本查看命令之uniq

uniq是专用的去重命令限制&#xff1a;必须相邻的两行内容相同才算是重复&#xff0c;如果内容相同&#xff0c;但是两行之间有其他内容就不算重复。使用uniq命令先排序&#xff0c;再去重。-d 的选项是用来仅显示重复行的-u 仅显示不重复的行-c 统计每一行出现的次数本文转自 …

BitMap位图与海量数据的理解与应用

1. Bit Map算法简介 来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value&#xff0c; 而Key即是该元素。由于采用了Bit为单位来存储数据&#xff0c;因此在存储空间方面&#xff0c;可以大大节省。 2、 Bit Map的基本思想 我们先来看一个具体的例子&a…

imdb文件_如何停止IMDB应用程序向您发送通知

imdb文件Recently, the IMDB app started sending out notifications for “Featured Trailers”. As near as I can guess, this is where the production company pays IMDB to push a link to the trailer to a load of people in an effort to promote it. If IMDB isn’t …