专栏首页小蔚记录js--- 堆栈 于拷贝

js--- 堆栈 于拷贝

1、栈(stack)和堆(heap)

stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小不定也不会自动释放。

2、基本类型和引用类型

基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配

  5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,所以可以直接访问

引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。

  当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。

3、传值与传址

var a = [1,2,3,4,5];
    var b = a;
    var c = a[0];
    alert(b);//1,2,3,4,5
    alert(c);//1
    //改变数值        
    b[4] = 6;
    c = 7;
    alert(a[4]);//6
    alert(a[0]);//1

  从上面我们可以得知,当我改变b中的数据时,a中数据也发生了变化;但是当我改变c的数据值时,a却没有发生改变。

  这就是传值与传址的区别。因为a是数组,属于引用类型,所以它赋予给b的时候传的是栈中的地址(相当于新建了一个不同名“指针”),而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数据值,并保存在栈中。所以b修改的时候,会根据地址回到a堆中修改,c则直接在栈中修改,并且不能指向a堆内存中。

3、浅拷贝

  前面已经提到,在定义一个对象或数组时,变量存放的往往只是一个地址。当我们使用对象拷贝时,如果属性是对象或数组时,这时候我们传递的也只是一个地址。因此子对象在访问该属性时,会根据地址回溯到父对象指向的堆内存中,即父子对象发生了关联,两者的属性值会指向同一内存空间。

var a = {
        key1:"11111"
    }
    function Copy(p) {
        var c = {};
        for (var i in p) { 
          c[i] = p[i];
        }
        return c;
  }
    a.key2 = ['小辉','小辉'];
    var b = Copy(a);
   b.key3 = '33333';
    alert(b.key1);      //1111111
    alert(b.key3);     //33333
    alert(a.key3);    //undefined

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • js---对象 和 函数this

       当函数被保存为一个对象的属性时,它就可称为这个对象的方法。当一个方法被调用时,this被绑定到这个对象上。如果调用表达式包含一个提取属性的动作(. 或 ...

    小蔚
  • 面向对象思想总结 新手如何理解JS面向对象开发?

    面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你...

    小蔚
  • vue --- watch 高级用法

    上面的代码的效果是,当我们输入firstName后,wacth监听每次修改变化的新值,然后计算输出fullName。

    小蔚
  • js中的this指向

    js中的this指向 首先,js中的this指向是根据运行时确定的,而非定义时。 js中的this指向大致分为如下几种: 作为对象的方法调用 作为普通函数调用 ...

    用户1141560
  • 重学前端(二)-你真的了解你JS的对象吗?

    ECMAScript标准+ webAPI 那么我们今天要一起学习的就是ECMASciript中的-Object,他实际上是一个es的语言标准

    用户7413032
  • 面试官问我JVM垃圾回收算法,还好我看了这篇

    程序计数器、虚拟机栈、本地方法栈都是线程私有的,会随着线程而生,随线程而灭; 栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈和入栈操作. 每个栈帧中的本...

    JavaEdge
  • 设计模式之对象池模式

    对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效...

    烟草的香味
  • java造成内存泄露原因

    一、Java内存回收机制  不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址。Java中对象是采用new或者反射的...

    xiangzhihong
  • js实现深拷贝和浅拷贝

    浅拷贝: 思路----------把父对象的属性,全部拷贝给子对象,实现继承。 问题---------如果父对象的属性等于数组或另一个对象,那么实际上,子对象获...

    李文杨
  • HotSpot 图解年轻代回收

    实际上,只是用对象的对象头去把对象连接起来(这里说的对象都是 C++ 层面对象的具体实现,也就是 oopDesc 的对象 在内存中占用的一段内存块)

    执生

扫码关注云+社区

领取腾讯云代金券