栈中一般用来存放基本数据类型:null,undefined,boolean,string,number,
堆中一般用来存放对象,数组,字符串
关于栈堆的特点:
栈:先进后出(上端不是闭合的)
堆:在堆中存放的变量位置是不变的
栈空间和堆空间:
栈空间:方法调用时保留变量对象的引用或变量实例
堆空间:所有存活的对象在此分配
栈内存和堆内存:
栈内存:在函数中定义的一些基本类型变量和引用类型变量都是在函数的栈内存中分配,当在一段代码块中定义一个变量时,Java就在这个栈中为这个变量分配内存空间,当超过变量的作用域时,Java就会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用.
堆内存:栈中存放的是指针,有了指针后去堆中寻找对应的内存空间地址,
堆内存中用来存放由new创建的对象和数组,在堆中分配的内存:由JVM自动垃圾回收器来处理,在堆中产生了一个对象或者是数组之后,还可以在栈中定义一个特殊变量,这个变量的取值等于数组或者是对象在堆内存中的首地址,在栈中这个特殊变量就变成了数组或者是对象的引用变量,以后就可以在程序中使用栈内存的引用变量来访问堆中的数组或者对象,引用变量相当于数组或对象的别名.
大概就可以用下面这张图表示,
1.关于函数类型的堆栈图关系:
function Cat(name){
//this.name=arguments ['0'];//用这个的话,不给cat后面的括号写name
this.name = name;
}
var c1 = new Cat('小花');//c1.name = '小花';
var c2 = new Cat('小白');//c2.name='小白';
console.log(c1,c2);
console.log(c1.toString());//c1.__proto__.__proto__Object.prototype.toString()
//String.prototype.toString()
//var r =String.prototype.toString.call(c1);//通过call反建立起函数与c1的关系
//console.log(r);
c1.age=2;
c1.price=200;
c1.toString=function(){
//return this.name
//this-->c1
var str = "";
for(var key in this){
var value = this[key];
str += value;
}
return str;
}
console.log(c1.toString());
console.log(c2.toString());//[object object]
console.log(c1.toString.apply[c2]);
拿上面这段代码举例,在这段代码中又包含原型和原型链的关系,其中最上面的object是函数function的原型,我们定义的对象c1的原型对象是cat,而cat的原型对象是object,通俗来讲,就是object是爷爷,cat是爸爸,c1是儿子,下面是关于上面例子的堆栈图:
关于数组类型的堆栈图,会在下一篇笔记中总结.