Niedawno zadałem pytanie o LocalStorage . Używanie JSON.parse(localStorage.item)
i JSON.parse(localStorage['item'])
nie działało, aby powrócić, NULL
gdy element nie został jeszcze ustawiony.
Jednak JSON.parse(localStorage.getItem('item')
zadziałało. Okazuje się, że JSON.parse(localStorage.testObject || null)
też działa.
Jeden z komentarzy zasadniczo to powiedział localStorage.getItem()
i localStorage.setItem()
zawsze powinien być preferowany:
Metody pobierające i ustawiające zapewniają spójny, ustandaryzowany i kompatybilny z różnymi przeglądarkami sposób pracy z interfejsem API LS i zawsze powinny być preferowane w stosunku do innych sposobów. - Christoph
Polubiłem używanie skróconych notacji z kropkami i nawiasami dla localStorage, ale jestem ciekawy, jak inni o tym myślą. Czy localStorage.getItem ('item') jest lepszy niż localStorage.item lub localStorage ['item'] LUB, o ile działają, czy zapisy skrótowe są w porządku?
źródło
getItem
isetItem
są znormalizowanym sposobem działania.getItem
/setItem
metod. Później ponownie przeczytam specyfikację, ale jedynym niezawodnym sposobem udzielenia odpowiedzi na pytanie jest wykonanie testów na wszystkich głównych przeglądarkach.localStorage.item
standaryzowanych?getItem
/,setItem
ponieważ te metody nie powodują konfliktu z istniejącymi właściwościamilocalStorage
obiektu. Przykład:localStorage.setItem('getItem', 'blah'); console.log(localStorage.getItem('getItem'));
działa, whilelocalStorage.getItem = 'blah';
nadpiszegetItem
metodę localStorage . jsfiddle.net/DrquYOdpowiedzi:
Zarówno bezpośredni dostęp do właściwości (
localStorage.item
lublocalStorage['item']
), jak i użycie interfejsu funkcjonalnego (localStorage.getItem('item')
) działają dobrze. Oba są standardowe i kompatybilne z różnymi przeglądarkami. * Zgodnie ze specyfikacją :Po prostu zachowują się inaczej, gdy żadna para klucz / wartość nie zostanie znaleziona z żądaną nazwą. Na przykład, jeśli klucz
'item'
nie istnieje,var a = localStorage.item;
spowoduje toa
istnienieundefined
, a whilevar a = localStorage.getItem('item');
będzie skutkowaća
posiadaniem wartościnull
. Jak odkryłeś ,undefined
inull
nie są wymienne w JavaScript / EcmaScript. :)EDYCJA: Jak wskazuje Christoph w swojej odpowiedzi , interfejs funkcjonalny jest jedynym sposobem niezawodnego przechowywania i pobierania wartości pod kluczami równymi wstępnie zdefiniowanym właściwościom
localStorage
. (Istnieje sześć z nich:length
,key
,setItem
,getItem
,removeItem
, iclear
.) Tak więc, na przykład, co następuje zawsze będzie działać:localStorage.setItem('length', 2); console.log(localStorage.getItem('length'));
Zwróć uwagę w szczególności, że pierwsza instrukcja nie wpłynie na właściwość
localStorage.length
(z wyjątkiem być może jej zwiększenia, jeśli nie ma'length'
już kluczalocalStorage
). Pod tym względem specyfikacja wydaje się być wewnętrznie niespójna.Jednak następujące elementy prawdopodobnie nie zrobią tego, co chcesz:
localStorage.length = 2; console.log(localStorage.length);
Co ciekawe, pierwszy nie działa w Chrome, ale jest synonimem wywołania funkcjonalnego w Firefoksie. Drugi zawsze rejestruje liczbę obecnych kluczy
localStorage
.* Dotyczy to przede wszystkim przeglądarek obsługujących przechowywanie danych w Internecie. (Dotyczy to prawie wszystkich nowoczesnych przeglądarek na komputery stacjonarne i urządzenia mobilne). W przypadku środowisk symulujących przechowywanie lokalne przy użyciu plików cookie lub innych technik zachowanie zależy od zastosowanej podkładki. Kilka polyfillów
localStorage
można znaleźć tutaj .źródło
Pytanie jest już dość stare, ale skoro zostałem w nim zacytowany, myślę, że powinienem powiedzieć dwa słowa o moim stwierdzeniu.
Obiekt Storage jest raczej szczególny, jest to obiekt, który zapewnia dostęp do listy par klucz / wartość. Dlatego nie jest to zwykły obiekt ani tablica.
Na przykład ma atrybut length, który w przeciwieństwie do atrybutu długości tablicy jest tylko do odczytu i zwraca liczbę kluczy w pamięci.
Za pomocą tablicy możesz:
var a = [1,2,3,4]; a.length // => 4 a.length = 2; a // => [1,2]
Tutaj mamy pierwszy powód, aby używać metod pobierających / ustawiających. Co jeśli chcesz ustawić element o nazwie
length
?localStorage.length = "foo"; localStorage.length // => 0 localStorage.setItem("length","foo"); // the "length" key is now only accessable via the getter method: localStorage.length // => 1 localStorage.getItem("length") // => "foo"
W przypadku innych elementów obiektu Storage jest to jeszcze bardziej krytyczne, ponieważ są one zapisywalne i możesz przypadkowo nadpisać metody, takie jak
getItem
. Korzystanie z metod API zapobiega którymkolwiek z tych możliwych problemów i zapewnia spójny interfejs.Ciekawym punktem jest również następujący akapit w specyfikacji (podkreślony przeze mnie):
Teoretycznie nie powinno być różnicy między pobierającymi / ustawiającymi wartościami a
[]
dostępem, ale nigdy nie wiadomo ...źródło
length
Nieruchomość nie zmieni się (przynajmniej w Chrome i Firefox [*]), jeśli zadzwoniszlocalStorage.setItem("length", something);
, ale można pobraćsomething
zlocalStorage.getItem("length");
. Co ciekawe, przypisanielocalStorage.length = something;
w Chrome nie jest opcją, ale w Firefoksie będzie przechowywanesomething
pod kluczem"length"
(który możesz wtedy pobrać tylko za pomocą funkcjonalnego interfejsu). [*] Właściwie w przeglądarce Firefoxlength
właściwość ulegnie zmianie, jeśli klucza"length"
nie malocalStorage
.localStorage
ma sześć predefiniowanych właściwości:length
,key
,getItem
,setItem
,removeItem
, iclear
.Wiem, że to stary post, ale ponieważ nikt tak naprawdę nie wspomniał o wydajności, skonfigurowałem kilka testów JsPerf, aby go porównać, a także będąc spójnym interfejsem,
getItem
asetItem
także konsekwentnie szybszym niż używanie notacji kropkowej lub nawiasów, a także znacznie łatwiejszym do odczytania.Oto moje testy na JsPerf
źródło
getItem
isetItem
były najwolniejsze w każdej kategorii, przy czym kropka była najszybsza w przeglądarce Chrome, a nawias najszybszy w przeglądarce Firefox. Myślę też, że „bycie znacznie łatwiejszym do odczytania” jest całkowicie subiektywne ... tak, określa funkcję, którą wykonuje, ale każdy, kto kiedykolwiek pracował ze zmiennymi obiektowymi lub tablicowymi, wiedziałby w pół sekundy, co się dzieje z kropką / nawiasem.Jak już wspomniano, nie ma prawie żadnej różnicy poza nieistniejącym kluczem. Różnica w wydajności różni się w zależności od przeglądarki / OS używasz. Ale tak naprawdę nie jest tak inaczej.
Sugeruję użycie standardowego interfejsu tylko dlatego, że jest to zalecany sposób korzystania z niego.
źródło