Piszę interpreter JavaScriptu dla ekstremalnie ograniczonych zasobów osadzonych urządzeń (http://www.espruino.com) i za każdym razem, gdy myślę, że poprawnie zaimplementowałem trochę JavaScriptu, zdaję sobie sprawę, że jestem w błędzie.Jak działa JavaScript []?
Moje pytanie dotyczy teraz []
. Jak poprawnie zaimplementować jeden z najbardziej podstawowych bitów JavaScript?
Przeglądam specyfikację JavaScript i być może nie znalazłem właściwego bitu, ale nie mogę znaleźć przydatnej odpowiedzi.
Wcześniej zakładałem, że faktycznie masz dwie "mapy" - jedną dla liczb całkowitych i jedną dla łańcuchów. A długość tablicy była wartością najwyższej liczby całkowitej plus jeden. Jednak wydaje się to źle, według jsconsole na chrome:
var a = [];
a[5] = 42;
a["5"]; // 42
a.length; // 6
ale również:
var a = [];
a["5"] = 42;
a[5]; // 42
a.length; // 6
Więc ... wielki - wszystko jest przekształcony w ciąg, a najwyższym ceniony ciąg, który reprezentuje liczbę całkowitą jest używany (plus jeden), aby uzyskać długość? Źle.
var a = [];
a["05"] = 42;
a.length; // 0
"05"
jest prawidłową liczbą całkowitą - nawet w ośmiu. Dlaczego więc nie wpływa na długość?
Czy należy przekonwertować ciąg na liczbę całkowitą, a następnie sprawdzić, czy po konwersji z powrotem na ciąg pasuje?
Czy ktoś ma odniesienie do dokładnego algorytmu używanego do przechowywania i pobierania elementów w tablicy lub obiekcie? Wygląda na to, że powinno być bardzo proste, ale wygląda na to, że tak naprawdę nie jest!
[Standard] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4) mówi: "* Nazwa właściwości' P' (w formie 'ciągu' value) jest indeksem tablicy wtedy i tylko wtedy, gdy 'ToString (ToUint32 (P))' jest równe 'P' i' ToUint32 (P) 'nie jest równe' 2 ** 32-1'. * ". – DCoder
Jeśli piszesz tłumacza, nie należy używać założeń. Powinieneś czytać specyfikację. –
Dlaczego nie używasz istniejących, wydajnych i zgodnych ze standardami implementacji JS, takich jak V8? To, co przeczytałem na http://www.espruino.com/Performance brzmiało okropnie: -/ – Bergi