Sto scrivendo un interprete JavaScript per dispositivi embedded con risorse limitate (http://www.espruino.com) e ogni volta che penso di aver implementato correttamente un po 'di codice JavaScript mi rendo conto di avere torto.In che modo JavaScript [] funziona davvero?
La mia domanda ora è di circa []
. Come implementeresti correttamente uno dei bit più basilari di JavaScript?
Ho esaminato le specifiche di JavaScript e forse non ho trovato il bit giusto, ma non riesco a trovare una risposta utile.
In precedenza avevo ipotizzato che fossero effettivamente presenti due "mappe", una per i numeri interi e una per le stringhe. E la lunghezza dell'array era il valore del numero intero più alto più uno. Tuttavia, questo sembra sbagliato, secondo JSConsole su bicromato di potassio:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
ma anche:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
Quindi ... grande - tutto viene convertito in una stringa, e il più alto valore di stringa che rappresenta un numero intero è usato (più uno) per ottenere la lunghezza? Sbagliato.
var a = [];
a["05"] = 42;
a.length; // 0
"05"
è un intero valido - anche in ottale. Quindi perché non influisce sulla lunghezza?
Devi convertire la stringa in un numero intero e quindi verificare che, quando viene convertita in una stringa, corrisponda?
Qualcuno ha un riferimento all'algoritmo esatto utilizzato per archiviare e ottenere elementi in un array o in un oggetto? Sembra che dovrebbe essere molto semplice, ma sembra che in realtà non lo sia!
[Lo standard] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4) dice: "* Un nome di proprietà' P' (sotto forma di 'String' value) è un indice di array se e solo se 'ToString (ToUint32 (P))' è uguale a 'P' e' ToUint32 (P) 'non è uguale a' 2 ** 32-1'. * ". – DCoder
Se stai scrivendo un interprete, le ipotesi non dovrebbero essere usate. Dovresti leggere le specifiche. –
Perché non usi implementazioni JS esistenti, potenti e conformi allo standard, come V8? Quello che ho letto su http://www.espruino.com/Performance suonava orribile: -/ – Bergi