求解,result.push(a)输出为什么是ab+abcd
javascript吧
全部回复
仅看楼主
level 4
Bogjjf
楼主
求解,result.push(a)输出为什么是ab+abcdabcd+abcdeabcdeabcde?
if条件成立的第一次把ab添加给了result,第二次条件成立result不应该是ab+abcd然后第三次条件成立不是应该输出ab+abcd+abbcde吗?
2020年09月08日 01点09分
1
level 1
贴吧用户_7t9PS7S
你push一个数组放进另外一个数组里面干啥,感觉你push进来的可能是一个地址,然后地址指向的数据数组a在变化,然后就是这个结果,想输出你想要的结果的话,result.push(a.join('')),把每次a数组里面的值转换为字符串添加进去
2020年09月08日 06点09分
5
Bogjjf
我这个就是练习题,我就是想知道为什么会输出这样的结果?我现在好像了解了一点,因为js他有个预编译过程也就是初始化提前
2020年09月08日 15点09分
level 11
夜深不知梦
你以为push的是a的内容, 实际上只是a的引用
想要你的结果, 每次result推入的时候做一次深拷贝
result.push([...a])
2020年09月08日 10点09分
6
Bogjjf
我这个是初级脚本算法练习题,我就是想知道为什么会输出这样的结果?我现在好像有了更深入的了解,因为js他有个预编译过程也就是初始化提前
2020年09月08日 15点09分
Bogjjf
正常逻辑思维不是应该是这样:第一次条件成立,数组里面的ab添加到result里面,此时result=ab; 第二次条件成立,把数组里面的abcd添加到result里面,此时ab+abcd的话就是result=ababcd;第三次条件成立,把数组里面的abcde添加到result里面,此时就是ab+abcd+abcde那么eesult=ababcdabcde才对;
2020年09月08日 15点09分
Bogjjf
为什么你第一次输出result的是ab,第二次输出teault的时候是abcdabcd,第三次输出result的时候是abcdeabcdeabcde?你有没有想过这个问题?你可以自己试一下
2020年09月08日 15点09分
夜深不知梦
@Bogjjf
都跟你说了是引用, 你还扯一堆没用的干什么啊,每次条件成立,result里推入一个a的引用, 所以result里依次是[a] [a,a] [a,a,a], 根据条件, 只有在偶数次以及循环最后一次才触发, 那么触发条件的时候这3次的a依次是, [a,b] [a,b,c,d] [a,b,c,d,e], 你在把这3次的a给换回去不就是答案?
2020年09月08日 16点09分
level 11
夜深不知梦
const a = [1,2,3,4,5]
const b = [a]
a.push(6)
console.log(b)
这么看能明白了吗?
2020年09月08日 16点09分
7
level 13
BSPR0002
这应该才是你预期的结果:
上面那位老哥大概已经不想理你了,我也差不多了,你还是再想想我们说的什么意思吧。
2020年09月08日 19点09分
12
Bogjjf
我不期待什么效果,我只是不明白为什么输出的结果是这样子的,我现在理解了,这是因为堆内存&栈内存的原因,result.push(a)推入的是a的地址,因为a是一个数组,一个堆内存
2020年09月09日 21点09分
Bogjjf
我不想要什么结果,我只想明白为什么输出这样的结果?那是因为result.push(a)是推入的a的地址,因为a是数组,属于堆内存,不是栈内存,我这么理解对吗?
2020年09月09日 22点09分
BSPR0002
@Bogjjf
不是,js 里没有堆栈概念的。原因是,push(a) 放入的是对 a 这个数组的引用,不是把 a 抄下来,而是记下它在哪里,到用到它的时候去它那里看一下,而其他地方又对 a 进行了修改,所以是这种结果。
2020年09月10日 06点09分
level 3
飞翼之航空白马
因为你result三次都push了同一个a,所以三个a都一样,想要得到你要的预期就把a的引用地址换换就行了
2020年09月09日 05点09分
13
Bogjjf
我不想要什么效果,我就是想要理解为什么会得出这个结果?是因为堆内存的原因吗?
2020年09月09日 21点09分
Bogjjf
刚刚在群里有个人回我了,因为result取的是a数组里面的地址吗?是堆内存
2020年09月09日 21点09分
飞翼之航空白马
result里面push了三个a,三个a指向同一块内存区域,所以不管你在a里面push什么,三个a都是一样的,和它们加入result的顺序没有一点关系。这里连堆内存的知识都不需要用到
2020年09月10日 04点09分
1