2015-04-08 12 views
7

Ostatni raz sprawdzone następujące dwa wiersze zwrócone true:Dlaczego localStorage ["..."] jest niezdefiniowane, ale localStorage.getItem ("...") ma wartość null?

null == localStorage["foo"]; 
null == localStorage.getItem("foo"); 

samo dotyczy przy wymianie null z undefined. Pierwsze pytanie brzmi: dlaczego istnieją dwa sposoby rozwiązania problemu localStorage? I dlaczego

localStorage["foo"] 

powrót undefined podczas gdy

localStorage.getItem("foo") 

powraca null?

Czy muszę się tym zająć podczas tworzenia JS?

+0

Ah, radości Javascript. –

+1

@RobertHarvey język jest w porządku, to warianty implementacji, które go zabijają :( – Alnitak

+1

Oczywiście, czy zwróci 'undefined' lub' null', nadal będziesz musiał sobie z tym poradzić.Dlaczego nie po prostu sprawdzić dla obu? Zobacz także http://programmers.stackexchange.com/a/268125 –

Odpowiedz

5

The Web Storage Specification requires że .getItem() zwraca dla nieznanego klucza.

jednak pamiętać, że .getItem() i .setItem() są szczegółowo zdefiniowane w IDL jako wyznaczony getter i setter interfejsu Storage i dlatego są one również w pełni obsługiwane sposoby uzyskiwania dostępu do zawartości pamięci.

Jednak składnia jest bardziej zbliżona do normalnego obiektu i/lub obiektu pobierającego tablicę, i podobnie jak te zwraca undefined dla nieznanej nazwy właściwości.

Powodem nie używać [] składnia jest to, że będzie ona działać na właściwości obiektów pierwszy i będzie dość szczęśliwie pozwalają na zastąpienie rzeczywistych właściwości i metod localStorage obiektu CF:

> localStorage['getItem'] = function() { return 0 } 
> localStorage.getItem('getItem') 
0 
+0

Czy nadal obowiązuje ostatnie oświadczenie o nadpisywaniu "prawdziwych" właściwości localStorage? Na dzień dzisiejszy nie mogłem tego odtworzyć (w Firefox Developer Edition). Wykonanie kodu daje mi '" function() {return 0} "'. – jaySon

+0

@jaySon W aktualnym Chrome (51.0.2704.79) nadal zwraca zero. – Alnitak

+0

@jaySon i wciąż tak samo z Chrome 55.0.2883.95 – Alnitak

2

localStorage["..."] jest nieprawidłowe użycie localstorage. Próbujesz uzyskać dostęp do metod obiektu localstorage, zamiast uzyskać dostęp do rzeczywistej bazy danych.

Musisz użyć

localStorage.getItem("...") 

i

localStorage.setItem("...") 

metod, aby uzyskać dostęp do bazy danych do przechowywania.

+0

Ah, racja. To ma sens. –

+1

Ale możesz "krzyżować" obie składnie. Ustawienia czegoś za pomocą 'setItem()' i uzyskanie go za pomocą '[]' działa tak samo dobrze, jak na odwrót. – jaySon

+2

- w moim Chrome (41?) Obecne klucze pojawiają się w "Object.keys (localStorage)". '.getItem' jest zdecydowanie bezpieczniejsze, ale trudno jest twierdzić, że metoda' [] 'jest _invalid_. – Alnitak

1

w JavaScript zawsze dostajesz wartość undefined dla kluczy, które nie istnieją wewnątrz obiektu.

a = {}; //new object 
alert(a["test"]); // you get 'undefined' because "test" keys is not found 

W localStorage .getItem to metoda, która ma klucze wyboru wewnątrz obiektu localStorage i zwraca null jeśli nie znaleziono.

Nie obwiniaj javascript, to tylko zachowanie obiektu localStorage

Powiązane problemy