23. april 2005 - 12:47Der er
11 kommentarer og 1 løsning
Problem med Object properties i Opera 7.54
Hej!
Jeg har et problem med forventet rækkefølge af object properties i Opera 7.54, så måske er der en ude i stuerne, som har en forklaring på mit spørgsmål.
Givet følgende object literal notation:
var opera_default = { first : "first", second : "second" };
og en test print funktion:
function object_parser(vpObject) { var i = 0; document.write("<br><br>object parsed:<br>-----------------------<br>"); for(var u in vpObject) { document.write("index[" + i + "]" + u.toString() + " = " + vpObject[u] + "<br>"); i++; } }
object_parser(opera_default);
---------------
Når jeg kører ovenstående kode får jeg følgende ud:
object parsed: ----------------------- index[0]first = first index[1]second = second
- ganske som forventet i den rækkefølge som objektet er defineret.
Men hvis man ændrer "first" til "first1" i samme browser session eksempelvis:
var opera_default = { first1 : "first", second : "second" };
Så vender opera det hele på hovedet:
object parsed: ----------------------- index[0]second = second index[1]first1 = first
Og hvis man så ændrer tilbage til:
var opera_default = { first : "first", second : "second" };
Så kommer rækkefølgen korrekt ud igen.
Det ser ud til at Opera husker det oprindelige navn og ikke opdaterer ændringen (trods force reload), sålænge der arbejdes i den samme session. Alle andre browsere fungerer upåklageligt.
Danmark vil mindske afhængigheden af globale techgiganter, men det kræver mere end politiske formuleringer og strategier, understreger PROSA’s formand Niels Bertelsen.
Slettet bruger
23. april 2005 - 13:55#1
Det ser ud til at det var en browser bug, jeg har lige downloadet Opera Version 8.0, Build 7561 og problemet er løst.
Nej, det er ikke en browserbug. Hvis du får properties ud i den rækkefølge, de er oprettet, er det et specialtilfælde. Det er langt fra altid tilfældet ... i nogen browser :)
/mvh </bole>
Synes godt om
Slettet bruger
24. april 2005 - 12:10#3
Hej olebole,
Kan du da give en forklaring på hvorfor rækkefølgen pludselig ændres, fordi man skifter property navnet og at rækkefølgen bliver korrekt hvis navnet ændres tilbage til det oprindelige? - det lugter da langt væk af bug :-)
Skal der være tale om en bug, skal der være tale om en 'adfærd', der er i strid med den vedtagne (standardiserede). Det er der ikke. Der står ingen steder noget om, i hvilken rækkefølge objekt-properties skal optræde, når man bladrer dem igennem i en for/in-løkke.
At de tilfældigvis optræder i den rækkefølge, du opretter dem i med den anvendte objekt-instantierings metode, er et tilfælde. Bruger du f.eks. en constructor-funktion til instantieringen (og/eller prototype'er objektet), er det ikke tilfældet.
I et strengindekseret, associativt array giver det ingen mening at tale om rækkefølge ... de er jo netop strengindekseret - ikke talindekseret. Jeg har på fornemmelsen, din misforståelse bunder i en manglende forståelse af indekserede datastrukrurer i form af arrays. Der er i hvert fald ikke tale om en browserbug :)
At rækkefølgen ændres tilbage, når du skifter navnet tilbage kunne til gengæld tyde på en dårlig garbagecollection. Det tyder unægtelig på, at property'en aldrig slettes helt, men gemmes et sted i hukommelsen, når navnet skiftes. Når man så skifter tilbage til det gamle streng-indeks ligger dette stadig på sin gamle plads i array'et.
I den pågældende Opera-version kunne det være interessant at skifte navn på en property 10.000 gange og se, hvormeget hukommelsesforbruget stiger og hvor godt/dårligt der egentlig bliver rydtet op i hukommelsen :)
Synes godt om
Slettet bruger
25. april 2005 - 22:35#5
Jeg har skam fuld styr på hashes og streng indekserede arrays, men erkender at brugen af literal notation er nyt for mig. Årsagen til at jeg netop gerne vil benytte mig af denne struktur er, at jeg skal bruge et objekt som indeholder en masse default værdier.
Hvis et givet array (her tale om et normalt strengindekseret array) opdateres til en ny værdi på baggrund af en handling (checkbox checked, eller inputfelt), så skal værdien kunne revertes til den oprindelige værdi, som er lagret i det ovenstående objekt.
Men siden du tilsyneladende har fuldstændigt styr på indekserede datastrukturer i arrays og literal notation, så har du måske et andet forslag til at gemme default værdier, når du nu mener at det er helt tilfældigt at de kommer ud i den rækkefølge, som de blev oprettet? - det er som sagt kun Opera som swapper rundt i det, så helt tilfældigt synes det ikke til at være :-)
Synes godt om
Slettet bruger
25. april 2005 - 22:44#6
Glemte lige at nævne at jeg skal have dem ud i en kronologisk rækkefølge via en forløkke :-)
Som sagt er det ikke kun Opera, men enhver browser ... blot i forskellige situationer. Det skyldes naturligvis, der ikke i standarden er fastlagt regler for lige netop dette.
Hvordan det skal gøres må afhænge af din kodestruktur, men hvis du i et associativt array (eller et objekt, som jo blot er et andet interface for samme datastruktur) skal reverseres til en default-værdi, er det vel bare at oprette et tilsvarende array/objekt med default-værdierne :)
Synes godt om
Slettet bruger
26. april 2005 - 08:04#8
Hej Olebole,
Du har fuldstændig ret, ved at instantiere via en constructor funktion:
Nææhhh ... så let er det nu heller ikke med en constructor :)
<script type="text/JavaScript"> function MakeObj() { this.bla = "noget" this.valFromFunc = this.func(); this.blabla = "noget andet"; return this; } var _p = MakeObj.prototype; _p.func = function() { return "Værdi returneret fra en funktion"; }
var o = new MakeObj(); for (x in o) alert(x+" => "+o[x]) </script>
Der _er_ ingen 'rigtig' rækkefølge af properties på et objekt. Det giver ganske enkelt ingen mening at tale om rækkefølge, når indeks er en streng. Du har ingen anelse om, hvordan tingene ser ud i den næste browserversion, når du baserer din kode på udokumenterede tilfældigheder :)
Arrays og objekter er noget 'gummi-agtigt' noget i JavaScript. Arrays kan både være tal- og tekstindekserede - eller begge dele på én gang.
Objekter og arrays er samme datastruktur med to lettere forskelligt interface. Eneste forskel er vist de specielle metode, der knytter sig til henholdsvis arrays og objekter (f.eks. ARRAY.push() og OBJECT.watch()). Faktisk er det så rodet, at du også kan anvende shorthand constructor'en for arrays i de to sidste eksempler:
Hmmm ... jeg skriver vist bedre JS end dansk. Du skal ikke betale ekstra for 'sdavøfajl' :)
Synes godt om
Slettet bruger
27. april 2005 - 23:13#11
Ikke noget gummi-ikke-transperent kode, det skal jo også kunne vedligeholdes over tid og af andre :-)
Hvad siger du til denne konstallation:
var default_values = new Array( { first : "nr 1" }, { second : "nr 2" } );
function default_parser(vpDefault) { for(var i = 0; i < vpDefault.length; i++) { for (var obj in vpDefault[i]) { alert( obj + " -> " + vpDefault[i][obj]); } } }
default_parser(default_values);
--
tror du at vi så rammer en standard som er fremtidssikret?
Synes godt om
Slettet bruger
03. august 2005 - 21:52#12
Hej olebole, Jeg giver dig fuldstændig ret. Dog er o.blabla = o[0] = "noget andet"; en kende funky i en større kontekst :-)
Tak for dialogen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.