博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈 js 深浅拷贝 那点事(一)
阅读量:7256 次
发布时间:2019-06-29

本文共 1130 字,大约阅读时间需要 3 分钟。

深拷贝与浅拷贝 不知道大家是咋理解的 有没有从内存空间角度去理解 前天看了一个内存空间 堆栈 下面卖弄下

在学习数据结构时候 堆栈是很熟悉了 在一端去对数据的操作

简单说 栈为自动分配内存空间 由系统自动释放

堆是动态分配的内存 大小不定也不会自动释放

  • 栈数据结构
    网上好的例子

上图很详细的说明了栈数据结构空间的存储

对于栈来说 栈的数据操作 都要在栈顶来操作

  • 堆数据结构

上面可以看到都是散落的

对于堆来说 数据项没有固定顺序 不想栈一样有顺序 在堆操作数据可以任何顺序操作 不需要必须在顶部来操作

  • js 数据类型 和堆 栈

    js中数据类型分为两类

    1. 基本类型: Undefined Null Boolean Numer String 5种基本数据类型放在栈内存中简单数据段 数据大小确定 内存空间自动分配

      var name = 'jozo'var city = 'gaungzhou'var age = 22复制代码

      上面有几个基本类型变量 在内存中结构

      内存中 包括了变量的 标识 和 值

  1. 引用类型: Object Array fun 这些引用类型 比如数组 他们的值大小是不固定的 这些放在堆内存中 js是不允许直接访问堆内存因此不能直接操作对象堆内存空间 在变量中实际上保存一个指针 这个指针指向另一个位置 实际要操作的是一个指针 不是实际对象 这个地址跟堆内存的实际值相关联

    var a = 20   var b = 'abc'   var c = true   var d = { m:20 }复制代码

上图可以看到 当要访问对内存中引用类型时候 实际上从变量对象中获取这个对象地址指针 然后从堆内存中获取数据

上面js中的数据类型内存存储

  • 数据类型特性

    1. 看基本数据类型

      var a = 1var b = ab = 2   //a还是1复制代码

      基本数据类型保存在栈中 系统自动为变量分配一个值 a b 都是1 但是他们是栈中两个相互对立的东西 所以修改b 对于a来说没有影响

    2. 看引用数据类型

      var m = { a: 10, b: 20 }var n = mn.a = 15复制代码

      引用类型真正的对象保存在堆中 var m = {} 在栈中保存了一个标识跟值 根据上述说的引用类型栈中变量对象保存是一个 堆内存的指针地址

      var n = m 这里栈中自动为其分配一个空间 也是保存一个标识跟值 值也是保存的一个指针地址
      n.a = 15 改变了n的a属性 虽然栈中保存的两个相互独立东西 但是指针指向堆内存是对象是一样的 就导致了 m 也改变了

可以看到如果通过这种方式来看的话 引用类型 基本类型本质上的区别 按值 按址

下一篇
参考链接:

转载地址:http://byvdm.baihongyu.com/

你可能感兴趣的文章
svn 增加忽略和删除忽略文件
查看>>
JavaWeb获取请求参数的两种方式
查看>>
(九)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训
查看>>
第7章 内部通讯录
查看>>
(三)闭包和高阶函数
查看>>
Serverless初探
查看>>
Apache - AH00558
查看>>
企业内部IT一体化系列之一:系统架构
查看>>
CPU物理核与逻辑核的关系
查看>>
我的友情链接
查看>>
Webpack 入门教程一
查看>>
Python While 循环语句
查看>>
mysql通过命令行删除表
查看>>
IP Truncated-ip 问题
查看>>
ftp-down.py——利用pexpect实现FTP下载文件
查看>>
使用PLSQL
查看>>
Squid 不透明代理的简单实验(redhat5.4)
查看>>
POJ-1256(permutation)
查看>>
杭电 hdu 2024
查看>>
Ansible的几个基本语句
查看>>