栈和堆
javascript的变量分为两类,简单类型和引用类型
number,strimg,boolean,undefind,unll,symbol 是简单类型
object,array,function, 是引用类型
简单类型存储在栈中。
饮用类型的对象存储在堆中,但是引用类型的引用地址存储与栈中,所以引用类型赋值是,只是将存于栈中的引用地址赋值了。赋值后的引用地址指向堆中的同一个对象。
栈:栈会自动分配内存空间,自动释放,存储基本数据类型,简单的数据段,占用固定大小空间。(string, number, boolean, unll, undefined)
堆: 动态分配内存空间,大小不定,也不会自动释放,存放引用数据类型,指可能又多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。(function, array, object)
栈和堆的区别
栈 所有方法中定义的变量都是存放在栈中的,随着方法执行结束,方法的内存栈也会自然销毁。
优缺点
优点是,存取速度快,仅次于存在CPU中,数据可以共享,缺点是,存放的大小和生命周期固定,可操作性差
堆的特性:
堆的特性是存于堆中的对象是不会随着对象执行完成而销毁,即使对象之行结束,堆内存中的对象也可能会因为被其他地方饮用而不会被销毁,创建对象就是为了反复利用。
栈和堆是传值和传址的区别
例子:
var a = [1,0,9,8,7];
var b = a;
var c =a[0];
console.log(b); //[1,0,9,8,7]
console.log(c); //1
//改变数值
b[1]=3;
c=5;
console.log(b[1]); //3
console.log(a[0]); //1
上面例子中a赋值给b因为a是array类型,所以是将a对应的堆地址传给了b,而a[0]是一个确定的值属于讲对应栈中的值传递。所以修改b的同时b对应的地址文件会被修改,而c却因为修改的是栈中数据,不会影响到堆中数据。