3-4的第三个选择题没弄明白

来源:3-10 参数传递和类型检测

wubinking

2017-12-29 09:40:49

http://img.mukewang.com/climg/5a4599c40001e02606890677.jpgvar b = a之后,a和b都是引用类型(堆内存里面存储了一个[4],而栈内存里面存储了两个指向[4]的地址),为什么a=[4,44]之后(我的理解堆内存里面的数据发生了变化[4]变为[4,44],b地址指向的也是这个[4,44]啊),但是b不是[4,44],而是[4]。

写回答

3回答

一路电光带火花

2017-12-29

建议你可以将老师这节课中举得一些小栗子再听听,面向对象这块会有点难,需要多听多想,得自己写写代码多思考

引用类型的值发生变化时,指向会变化。引用类型你应该知道吧,就是除了基本类型意外,其余都是引用类型。

引用类型比如,var a={},这就是引用类型,a指向的就是{};

如果再让a={1,3},那么a指向的就是{1,3},{}和{1,3}是不同的对象,存放在堆里不同的空间。

如果通过方法给这个对象添加属性或者是值,这个对象在堆的空间位置没有变化,只是对象成员有添加,这个a还是指向这个对象。


0
hubinking
h 好的,谢谢。
h017-12-29
共1条回复

小丸子爱吃菜

2017-12-29

因为a重新被赋值为[4,44],所以它的指向重新发生变化了。

b.push方法可向数组的末尾添加一个或多个元素,所以b原有的对象没有发生变化。


0
hubinking
h 你这因为所有讲的不是很能让人理解,可以讲的再明白点吗?为什么重新被赋值就发生变化,加元素就不发生变化;还有在什么情况下指向会发生变化,什么情况下指向不会发生变化吗?
h017-12-29
共1条回复

小丸子爱吃菜

2017-12-29

a=[4]表明a指向了对象[4],将a赋值给b,那么b此刻也指向了对象[4],a的指向发生变化,指向[4,44],但是b还是指向[4],所以打印出来的b是[4]。

祝学习愉快!

0
hq_修炼者_0
回复
hubinking
h a=[4,44]这种创建函数的方式,相当于重新new了一个数组对象,原对象和新对象肯定是不等的,因为地址发生了改变。因此a的变化不会影响b-->[4] b.push(44),这种方式的改变只不过是在原来的对象上添加了一些数据而已,地址指向并不会发生改变。所以b的变化会影响a-->[4,44]
h018-04-13
共4条回复

0 学习 · 4826 问题

查看课程