首先要弄明白堆和栈就要先了解数据类型
一数据类型
(1)简单数据类型
String Number Boolean Undefined Null
又被成为值类型,基本数据类型,这类值在存储时存储的是值本身。
(2)复杂数据类型
又称引用类型,这类值在存储时存的是地址,也可以说是引用,所以被成为引用类型.
复杂数据类型,都是通过new关键字创建的对象,
如Object,Array,Date等。
以上就是数据类型的简单概括。
二堆栈
先简单概括一下堆和栈
简单数据类型存放在栈中,直接开辟一个新的空间,存放的是简单数据类型的值
复杂数据类型存放在堆中,栈中存放的是地址
(1)栈
栈(操作系统):有操作系统自动分配释放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈,简单数据类型,存放到栈中;
(2)堆
堆(操作系统)存储复杂类型(对象),一般由程序员分配释放,如果程序员不释放,则会由垃圾回收机制进行处理(在以后的文章中会进行简单讲解)
三引用类型传递的关系
//简单数据类型
var a = '这是简单数据类型';
var b = a;
b = '存放在栈中'
console.log(a);//这是简单数据类型
console.log(b);//存放在栈中
function num(a){
a++;
var b = a;
b++;
console.log(a);//11
console.log(b);//12
}
var a = 10;
num(a)
console.log(a);//10
//复杂数据类型
function content(con){
this.con = con;
}
var a = new content('这是复杂数据类型');
var b = a
b.con = '存放在堆中';
console.log(a.con);//存放在堆中;
console.log(b.con);//存放在堆中;
这说明,简单数据类型,在栈中存放的只是值,别的变量值改变并不会受到影响。
也就是说函数的形参也可以说就是一个变量,当我们把引用类型变量传给形参时,就是将栈里存放的值复制了一分给形参,并在栈中开辟了一个新的空间,函数内部的变量如何修改都不会对外部变量进行修改
而复杂数据类型在栈中,存放的是路径,当我们把a变量的值,赋给b变量,可以发现返回值发生了改变,因为在赋值是,其实就是把a的地址完全给了b,他们其实操作的是同一个对象。