Web 前端开发

关于JS的堆和栈的理解

2018-08-09  本文已影响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))套用

上一篇下一篇

猜你喜欢

热点阅读