Mieliśmy więc przypadek, w którym mielibyśmy obiekt, w którym klucz to id (int), a wartość to łańcuch. Ale zauważyliśmy, że w większości przypadków wyszukujemy id na podstawie łańcucha, więc zdecydowaliśmy się go odwrócić i uczynić ciąg kluczem, a wartością jest id. Ponieważ w ten sposób zamiast przechodzić przez każdy element i porównywać wartości, moglibyśmy po prostu zrobić var id = storage[text];
. Poniżej znajdują się przykłady tego, co zrobiliśmy.
Oto przykład starej implementacji:
var storage = {
0 : null,
1 : "Hello",
2 : "world!",
3 : "How are you?"
}
Oto przykład nowej implementacji:
var storage = {
"null" : 0,
"Hello" : 1,
"world!" : 2,
"How are you?" : 3
}
Rozumiem, że teraz ciąg jest kluczem i można uzyskać ten sam identyfikator dla tych samych ciągów. Ale od teraz ciąg może być potencjalnie dość duży (niewielkie szanse, ale prawdopodobnie maksymalnie 1 KB na ciąg), czy istnieje ograniczenie długości, które JS lub Android Webview nakłada na klucze obiektów?
A także, czy ta implementacja ma wady? Jak dotąd nie zauważyłem żadnych problemów, ale nigdy nie wiadomo.
Nie, nie ma ograniczeń co do długości łańcucha (o ile mieści się w pamięci), a twoja implementacja też wydaje się w porządku. Bardzo często zdarza się, że te tablice „odwrócone” zawierają np. Wartości logiczne. A jeśli chodzi o łańcuchy jako klucze: Łańcuchy są niezmiennymi symbolami, które są przechowywane pod określonym adresem, a to, co faktycznie jest używane jako indeks tablicy, to ten adres (znany również jako wskaźnik lub odwołanie), a nie sam łańcuch.
źródło
Wygląda na to, że w przypadku ECMAScript 2016 istnieje teraz ostateczna odpowiedź na to pytanie. Według MDN Web Docs na string.length :
Można to również znaleźć w specyfikacji języka ECMAScript® 2016 :
źródło