Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型。他们的存储方式是不同的
基础类型的数据存储是保存在栈内存中的:
例如: var a=1; var b=a;
1 var a=1; 2 var b=a; 3 a=2; 4 alert(b);//1
上面的代码首先给变量a赋值1,存在栈内存中如上图,然后声明了变量b,并且把变量a的值复制一份给变量b,在栈内存中分别保存了变量a,b的值都为1,然后改变了变量a的值为2,但是他们都是独立存在于栈内存中的,所以不会受到影响,最后弹出b的值为1.
引用类型的数据存储方式:
例如:var a=new Object();a.name=“yewenxiang”;
1 var a=new Object(); 2 a.name=“yewenxiang”; 3 var b=a; 4 a.name=“xiangwang”; 5 alert(b.name);//xiangwang
引用类型中对象的存储方式和基础数据类型存储方式是不同的,对象是存在堆内存中的,而栈内存中存储的是变量名和指向堆内存中对象的地址。
第一行:申明了变量a 创建了一个对象实例保存在堆内存中,
第二行:给a对象添加了一个name属性,值为”yewenxiang”,保存在了堆内存中,
第三行:申明了一个变量b,在栈内存中把a 指向对象的地址复制给了变量b,两个地址指向的是相同的一个对象。
第四行:改变对象中name的属性值为”xiangwang”
第五行:为什么弹出的是”xiangwang”呢,因为他们指向的是同一个对象,而上行代码把name的属性值变为了”xiangwang”,所以b.name的值也是“xiangwang”.
碰到的难点:
1 var a={name:”yewenxiang”}; 2 var b=a; 3 a={name:”xiangwang”}; 4 alert(b.name);//“yewenxiang”
为什么会弹出yewenxiang,这个问题我刚开始的思路想错了:开始以为他们都是指向同一个对象,改变了a.name的值为”xiangwang”,所以b.name的值也会改变为”xiangwang”。问题出现在第三行代码,a={name:xiangwang},这行代码不是在第一行那个对象中改变了name属性的值为“xiangwang”,而是又重新创建了另外一个对象,而且里面也有了一个name属性,值为”xiangwang”,如果不想创建一个新对象应该这么去写第三行代码a.name=“xiangwang”,最后弹出的值才是”xiangwang”。