基础类型:string Number Boole Null Undefined
引用类型:Objcet
基本类型数据直接存入栈内存。
基本类型
直接上图。然后一步一步解释。
我们都知道 var变量中存入的类型都是基础值,从图中可以看出,JS中的变量都存入了栈内存中。
var a =123 ;
var b =a ;
a++;
我们先是存入了a变量赋值为123,然后把a变量赋值给了b变量。此过程就是,在栈中又存入了b变量,然后b变量复制了a的值,此时从图中可以看出,a,b都已经存在了栈内存中,二者是独立的2个变量,互不影响。
所以我们执行a++的时候,修改的是a变量,对b变量并没有影响。
所以执行完后 a=124 ,b=123
引用类型
对象是保存在堆内存当中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间,而栈内存的变量,保存的是对象的内存地址(对象的引用)。
当通过一个变量修改属性的时候,另一个也会受到影响。
看图 解释:
var obj =new Objcet() ;
obj.name ="swk";
var obj2=obj;
obj.name="zbj";
从图中可以看到,我们new了一个对象,对象是存在堆内存的,当你new了一个对象后,堆内存给你开辟一个空间,并给了你一个标识,这个标识就是内存地址,然后你把这个内存地址赋值给了变量obj,然后变量是存储在栈内存中,所以从上图中可以看到,栈内存中obj存入的值是堆内存的地址,这样栈内存和堆内存就关联了起来。
然后你给了obj一个name属性,他存储在堆内存中,接着你将obj又赋值给了obj2,我们从图一的解释可以知道,obj2会复制obj的值,所以,obj和obj2都指向了同一个地址,同一块内存,所以当你修改name属性值的时候,二者都会改变。
此时我们在进行改变,看图。
当obj2=null的时候
obj是不受影响的,因为图一中已经解释过,他俩是独立的变量。你让obj2为空,只是断开了他的指向,但并不影响obj的指向。