美文网首页Web 前端开发
关于JS的堆和栈的理解

关于JS的堆和栈的理解

作者: 张小娃 | 来源:发表于2018-08-09 17:39 被阅读0次

    一、  堆(heap)和栈(stack)

    栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放

    二、数据类型

    1、基本类型(简单的数据段,存放在栈里面,占固定大小的空间)

    基本类型有:Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

    2、引用类型(多个值构成的对象,保存在堆内存中,包含引用类型的变量实际上保存的不是变量本身,而是指向该对象的指针)

    引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。

    三、数据销毁

    基本数据类型在当前执行环境结束时销毁,而引用类型不会随执行环境结束而销毁,只有当所有引用他的变量不存在时这个对象才会被回收机制回收。

    四、引用类型最好不要比较

    举个栗子:

    var a={name:"ayi",age:21};//初始化一个对象(引用类型)

    var obj1=a,obj2=a;//将obj1和obj2指向同一个地址,都为a的地址

    obj1.name="aha";//改变obj1的name的值,这个时候obj1的地址并没有变化

    console.log(obj1==obj2)//这个时候打印的值为true,因为他们还是指向同一地址引用。

    obj1={name:"aiyo"};//这个时候obj1指向了另外一个地址引用

    console.log(obj1==obj2)//false

    五、项目中遇到的问题

    ···

      var arry1=[

    {name:"zhang",age:23,key:"12"},

            {name:"as",age:23,key:"123"},

            {name:"sd",age:23,key:"124"},

            {name:"df",age:23,key:"125"},

            {name:"fd",age:23,key:"126"},

            {name:"as",age:23,key:"127"},

            {name:"as",age:23,key:"1276"},

            {name:"as",age:23,key:"533"}];

        var item={name:"as",age:23};

        function btnClick() {

    // var _item=JSON.parse(JSON.stringify(item))

            var _item=item;

            for(var i=0;i

    if(_item.name==arry1[i].name){

    _item.key=arry1[i].key+"1"//item本来没有key,现在使得他的key的地址指向arry1[i].key+"1"

    //第二次单击时,改变item.key的地址,之前push到arry1的item.key的地址也变成现在的,所以两次是一样的。

    //想要他们的引用地址不一样,可以使用JSON.parse(JSON.stringify(value))套用

                }

    }

    arry1.push(_item)

    console.log(arry1)//单击两次以后,发现打印出来最后两个元素的key值是一样的

        }

    在赋值的时候,其实改变的是引用地址,想要改变他的地址以及值,可以使用JSON.parse(JSON.stringify(value))套用

    相关文章

      网友评论

        本文标题:关于JS的堆和栈的理解

        本文链接:https://www.haomeiwen.com/subject/bfoqbftx.html