omg-wtf-eval: 'custom' eval functie probleem

Status
Niet open voor verdere reacties.

That Guy

Meubilair
Lid geworden
28 nov 2006
Berichten
5.010
Yow,

Zoals gewoonlijk was ik rustig bezig met 2d tile engines, kwam ik plots op dit rare geval. Aanschouw eerst eens de code:[JS]
var superEvalFunctie = function(data) /* niet de daadwerkelijke constructie, maar het gaat om het idee */
{
if(data.substr(0,1) == '[' && data.substr(-1) == ']')
{
data = data.replace('[','').replace(']','');
return data.split(',');
}else
if(data == 'false')
{
return false;
}else
if(data == 'true')
{
return true;
}else
if(data.match(/^[-]?\d*\.?\d*$/) != null)
{
return parseFloat(data);
}

return data; /* eet string! */
};[/JS]nu werkt dit in alle gevallen goed, behalve het array gedeelte:[JS]//via de manier dat ik het wil:
if(data.substr(0,1) == '[' && data.substr(-1) == ']')
{
data = data.replace('[','').replace(']','');
return data.split(',');[/JS][JS]//zo werkt ie wel:
if(data.substr(0,1) == '[' && data.substr(-1) == ']')
{
return eval(data);[/JS]nu heb ik even wat gechecked (via de normale eval() functie), maar beide (custom & eval()) zijn van het type 'object' en beide zijn een array met dezelfde waardes. Maar toch werkt het niet goed. Weet iemand toevallig waarom?


:thumb:
 
Laatst bewerkt:
Welke output zou je moeten krijgen dan, en bij welke input? Want het lijkt mij toch logisch dat je een object terug krijgt?:confused:

Jouw javascript problemen gaan mij meestal boven de pet, maar vind dit toch wel een interessante ;)
 
Hi,

Vannochtend op de fiets (of all places) bedacht ik me dat het natuurlijk mogelijk was dat het wel een array returnde, maar de items in de array niet van het goede type waren (String.split() maakt de elementen dus string?! Kan/kon het nergens vinden). Nu, dat bleek de oplossing, hier is de correcte, werkende code:[JS]evalValue = function(data)
{
if(data.substr(0,1) == '[' && data.substr(-1) == ']')
{
data = data.replace('[','').replace(']','');
data = data.split(',');
var i, l = data.length;

for(i=0; i<l; i++)
{
data = evalValue(data);
//recursief. Maakt elk value uit de array van het goede ('echte') type.
}

return data;
}else
if(data == 'false')
{
return false;
}else
if(data == 'true')
{
return true;
}else
if(data.match(/^[-]?\d*\.?\d*$/) != null)
{
return parseFloat(data);
}


return data;
};[/JS]overgens wat background: mn nieuwe spel gebruikt .ini bestanden (jawel, vanuit javascript) om bepaalde settings op te slaan en te laden. (opslaan werkt nog niet ;)) Nu, deze zijn gewoon javascript waardes, zoals stringgetje (noot: zonder quotes, returnt zowiezo als string), false, -42, 1337 en [2,3,5,0,11]. Vandaar deze functie, die zorgt dat ik geen eval() meer hoef te gebruiken.


Overgens, mocht je ooit nog eens 9240x een loop uitvoeren per seconde op een array, check eens 'hash tables' (zoekwoord: javascript hash table). Het gaat zo'n 10 a 20 keer zo snel. Ik heb er gister wat bij geleerd ;)



:thumb:
 
Laatst bewerkt:
Gefeliciteerd: beter een invallende gedachte dan een uitglijdende fiets!
[ot]
Het mooiste vind ik dat je nu in regel 31 geen string meer hoeft op te eten. ;)
[/ot]
[Edit]Ah, kruispost.[/edit]
 
Dat is helemaal waar, het was nog best glad vannochtend. Regel 31 eet tegenwoordig nogsteeds strings hoor, maar dan wel stiekem.

lang leve rare comments in je code!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan