一、 堆(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))套用
网友评论