您的位置:首页 > Web前端 > JavaScript

整理Javascript基础数据和引用数据复制值的问题

2016-11-02 09:05 288 查看
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Helvetica; color: #000000 }
span.s1 { }

Javascript数据分为两大类:1.基础类型(原始类型数据) 2.引用类型。他们的存储方式是不同的

基础类型的数据存储是保存在栈内存中的:

例如: var a=1; var b=a;



1 var a=1;
2 var b=a;
3 a=2;
4 alert(b);//1


p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Helvetica; color: #000000 }
span.s1 { }
上面的代码首先给变量a赋值1,存在栈内存中如上图,然后声明了变量b,并且把变量a的值复制一份给变量b,在栈内存中分别保存了变量a,b的值都为1,然后改变了变量a的值为2,但是他们都是独立存在于栈内存中的,所以不会受到影响,最后弹出b的值为1.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; color: #000000 }
span.s1 { }

引用类型的数据存储方式:

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 }
span.s1 { }
例如: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


p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Helvetica; color: #000000 }
span.s1 { }
引用类型中对象的存储方式和基础数据类型存储方式是不同的,对象是存在堆内存中的,而栈内存中存储的是变量名和指向堆内存中对象的地址。

第一行:申明了变量a 创建了一个对象实例保存在堆内存中,

第二行:给a对象添加了一个name属性,值为”yewenxiang”,保存在了堆内存中,

第三行:申明了一个变量b,在栈内存中把a 指向对象的地址复制给了变量b,两个地址指向的是相同的一个对象。

第四行:改变对象中name的属性值为”xiangwang”

第五行:为什么弹出的是”xiangwang”呢,因为他们指向的是同一个对象,而上行代码把name的属性值变为了”xiangwang”,所以b.name的值也是“xiangwang”.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Helvetica; color: #000000 }
span.s1 { }

碰到的难点:

1 var a={name:”yewenxiang”};
2 var b=a;
3 a={name:”xiangwang”};
4 alert(b.name);//“yewenxiang”


p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 }
span.s1 { }
为什么会弹出yewenxiang,这个问题我刚开始的思路想错了:开始以为他们都是指向同一个对象,改变了a.name的值为”xiangwang”,所以b.name的值也会改变为”xiangwang”。问题出现在第三行代码,a={name:xiangwang},这行代码不是在第一行那个对象中改变了name属性的值为“xiangwang”,而是又重新创建了另外一个对象,而且里面也有了一个name属性,值为”xiangwang”,如果不想创建一个新对象应该这么去写第三行代码a.name=“xiangwang”,最后弹出的值才是”xiangwang”。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐