webForumDet fria alternativet

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

JavaScript

4 svar · 379 visningar · startad av mappo

Medlem sedan apr. 2001664 inlägg
Frågan#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.

Medlem sedan aug. 20039 340 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.

Medlem 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!

Medlem 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 :)

Medlem 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!

250 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)