webForumDet fria alternativet

Är detta en bugg i reverse()-metoden?

4 svar · 379 visningar · startad av mappo

mappoMedlem sedan apr. 2001664 inlägg
#1

Kod nedan, men först på svenska:

Skapa array a={0,1,2}.
Skapa array b=a.
Gör reverse på b.
Skriv ut a och b.

Det som borde hända (imho) är att a={0,1,2} och b={2,1,0},
men det som verkar hända är att a också blir omvänd. :q

Kan någon förklara vad som händer?

<html>
	<body>
		<script type="text/javascript">

			var a = new Array() ;
			a[0] = 0 ;
			a[1] = 1 ;
			a[2] = 2 ;

			var b = new Array() ;
			b = a ;

			b.reverse() ;

			document.write(a + "<br />" + b) ;

		</script>
	</body>
</html>

Resultat:

2,1,0
2,1,0

Men jag tycker, som sagt, att det borde varit:

0,1,2
2,1,0

eftersom jag aldrig bett om att vända på a.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Arrayer i JS funkar lite som pekare i C. Efter kommandot b = a; så pekar i själva verket både b och a mot samma objekt. Den nya arrayen du definierade åt b "försvinner". (Det allokerade minnet frias senare av garbage collectorn som märker att den arrayen inte refereras någonstans längre)
För att göra det du vill måste du klona arrayen på ett eller annat sätt.

mappoMedlem sedan apr. 2001664 inlägg
#3

@ nitro2k01: tackar för det!

Jag bytte ut b = a ;
mot b = a.slice() ;
vilket skapar en kopia på "värde-nivå" och alltså funkar gyllene!

headbugMedlem sedan sep. 2006867 inlägg
#4

Precis som nitro säger så är =-tecknet lite mer aggresivt i JS än vad du trodde fram tills nu, du säger att dom ska vara och tolkas som samma sak, inte likadana (om man får göra en liknelse med småbarnstjäbblet om lika vs. samma :) ).

Det du vill göra är att skapa b och sedan fylla b med innehållet hämtat från a, såhär:

var a = [1, 2, 3];
var b = a.slice(0);

/edit: Aha, du hann svara själv :)

mappoMedlem sedan apr. 2001664 inlägg
#5

@ nitro2k01: tackar för det!

Jag bytte ut
b = a ;
mot
b = a.slice() ;
vilket skapar en kopia på "värde-nivå" och alltså funkar gyllene!

EDIT: @ headbug: jag hann hitta slice-metode innan jag såg ditt svar, men tack iaf!

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)