请问怎么理解这个变量和内存关系?

coglass 2012-05-28 06:37:11
var a=[1,2,3]
var b=a
b=100
alert(a)

谁能帮忙逐行解析一下这段代码?最好涉及一下内存、堆栈、变量怎么赋值的基本概念?比如怎么理解这个[1,2,3]数组,它在内存中如何存储的?
...全文
185 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
o0snow 2012-05-30
  • 打赏
  • 举报
回复
请看JavaScript高级程序设计第四章,仔细看完理解你就明白了。
未知数 2012-05-29
  • 打赏
  • 举报
回复
var a=[1,2,3];
var b=a;
b=100;
alert(a);

理解为:
变量是路标,内存是位置,变量赋值后指向内存的某个位置。
你给b变量赋值为a路标,就是说a、b路标都指向同一个位置。
然后b=100;相当于改变了b路标指向的位置,但a路标的位置会改变么?当然不会,原位置的内容会受影响么?当然也是不会的。

右领军大都督 2012-05-29
  • 打赏
  • 举报
回复
这样解释,看看是不是容易理解一些。
, 存放的是简单数据和复杂数据的存放地址。
也就是说,如果存储的是个简单数据如数字 “3” , 那么就会直接将这个3存放在栈中。
而如果存储的是个复杂数据对象如:“{id : 123 , name : 'zhangsan' , sex : 'male'}” , 那么该对象其实是存储在堆中的,栈中只是保存了一个该对象在堆中存放的位置。因为程序运行是先去栈中查找值的,所以一旦在栈中发现保存的是个地址,那么就会进一步再去堆中,按照该地址取出存放在堆中的数值。
,存放的是复杂的数据对象,并在栈中保留一个堆中的地址信息,以便程序运行时在栈中找到此对象的引用地址,并获取正确的值。
001007009 2012-05-29
  • 打赏
  • 举报
回复

<script>
var a = [1,2,3];
var b = a;
b = 100; // 重新给b赋值 并不会影响a
alert(a)
</script>
<script>
var a = [1,2,3];
var b = a;
b.push(4); // 这样 a b是指向一个内存空间,b push 之后 会 影响a
alert(a)
</script>
coglass 2012-05-29
  • 打赏
  • 举报
回复
不太明白指针式什么
比如var a=3; 是不是a在栈中有个地址,3也有个地址,然后将a指向3的地址,3的地址就是指针吗?还是那个指向是指针啊?
不耐烦 2012-05-29
  • 打赏
  • 举报
回复
var a=[1,2,3]
var b=a
b=100
alert(a)


a和b是独立的 这么说能理解吗?

还有就是 这个问题的 知识点就是 javascript 的2种类型 基本类型 和 引用类型
百度
“javascript 基本类型 引用类型”
小飛不想飛 2012-05-29
  • 打赏
  • 举报
回复
跟着楼主学习了下...
未知数 2012-05-29
  • 打赏
  • 举报
回复
<script>
var a = [1,2,3];
var b = a;
b.push(4); // 这样 a b是指向一个内存空间,b push 之后 会 影响a
alert(a)
</script>
这段,理解为:
给b赋值为a,所以a、b路标指向同一个位置。
b.push(4);根据b路标找到位置,然后改变了这个位置的内容(注意,这不是给b重新赋值,而是调用了对象的一个方法,所以b路标指向的位置是没有变化的,就像在该位置又建了一栋楼,于是这儿的环境变了,但是仍然在那个位置)。
由于a、b路标指向同一个位置,所以你再根据a路标找到位置,内容当然是和b路标指向位置的内容相同。
coglass 2012-05-28
  • 打赏
  • 举报
回复
非常感谢 我还一下消化不了
右领军大都督 2012-05-28
  • 打赏
  • 举报
回复
以下说明仅就javascript而言:

//给变量a赋值, 内容存在堆空间中,栈空间里保存一个该堆空间的地址
var a = [1 , 2 , 3];



//给变量b赋值,仍是一个引用 , 内容为变量a所指向的内容
var b=a



//给变量b赋值,直接将内容写入栈中。但对于a的内容则无影响
b=100


//显示变量a内容,a仍未其引用值,数组[1 , 2 , 3]
alert(a)


栈(stack)中存储简单数据段,也就是说,它们的值直接存储在变量访问的位置。而这个变量存储的位置由系统自动分配,大小固定,所以访问速度快。
堆(heap)中存储复杂的数据对象的引用,也就是说,存储在变量访问位置的是一个指针,它指向了真正存储内容的内存的地址。因堆是有程序控制创建的,所以大小不固定,访问速度慢。

不知道是否说的清楚,如果有误,还请各位不吝赐教!

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧