Jak sprawdzić, czy element pamięci jest ustawiony?


288

Jak mogę sprawdzić, czy element jest ustawiony localStorage? Obecnie używam

if (!(localStorage.getItem("infiniteScrollEnabled") == true || localStorage.getItem("infiniteScrollEnabled") == false)) {
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}

2
wygląda na to, że będziesz mieć problem bez
muteksu

Odpowiedzi:


509

getItemMetoda w specyfikacji WebStorage wyraźnie wraca nulljeżeli rzecz nie istnieje:

... Jeśli dany klucz nie istnieje na liście powiązanej z obiektem, wówczas ta metoda musi zwrócić null. ...

Więc możesz:

if (localStorage.getItem("infiniteScrollEnabled") === null) {
  //...
}

Zobacz to powiązane pytanie:


1
Czy możesz dodać swoją własną metodę, localStorageaby zamknąć ten mały test? Na przykład localStorage.hasItem("infiniteScrollEnabled")?
Paul D. Waite

4
@Paul: Tak, możesz nawet ulepszyć Storage.prototypeobiekt, ale jako ogólną zasadę zawsze zalecam, aby nie modyfikować obiektów, których nie jesteś właścicielem , a zwłaszcza hostować obiekty.
CMS

ooh tak, dobre strony. Pochodzący z CSS pomysł, że mogę samodzielnie rozwiązać problemy z przeglądarką, jest ekscytujący, ale widzę, jak poruszanie się po obiektach przeglądarki może być mylące.
Paul D. Waite

5
Uwaga jest niepoprawna - bieżąca wersja Storageinterfejsu wyraźnie mówi, że wartości są typu DOMString. w3.org/TR/webstorage/#the-storage-interface
Alnitak

1
Uwaga usunięta. Dzięki @TimothyZorn i Alnitak
CMS

46

Możesz użyć hasOwnPropertymetody, aby to sprawdzić

> localStorage.setItem('foo', 123)
undefined
> localStorage.hasOwnProperty('foo')
true
> localStorage.hasOwnProperty('bar')
false

Działa w aktualnych wersjach Chrome (Mac), Firefox (Mac) i Safari.


2
To powinna być zaakceptowana odpowiedź. Zaakceptowany uzna zapisaną wartość „null” za nie ustawioną, co jest błędne.
Flavien Volken

9
@FlavienVolken Nie możesz jednak mieć zapisanej nullwartości. Możesz mieć "null", ale kod nie będzie się na nim źle zachowywał, podczas gdy ten zawiedzie na lengthkluczu.
Kaiido,

1
@Kaiido masz rację, miałem takie zachowanie, ponieważ bezpośrednio analizowałem przechowywane dane i JSON.parse("null") === JSON.parse(null)miałem kolizję.
Flavien Volken

3
Wystąpił następujący błąd ESLint: „Nie uzyskuj dostępu do metody Object.prototype„ hasOwnProperty ”z obiektu docelowego object.eslint (bez wbudowanych prototypów)”
rfdc

To nie zadziała, jeśli foo nie jest ustawione przy ładowaniu strony i chcesz coś zrobić z foo. Myślę, że o to właśnie pytał pytający. Chcesz sprawdzić, czy klucz fooistnieje, a nie czy foo ma wartość. Mam taką sytuację, w której zdarzenie kliknięcia uruchamia się .setitemz logiką opartą na getItem, ale nie zadziała, dopóki nie ustawię elementu i nie mogę ustawić elementu, dopóki nie poznam stanu foo (wartość1 lub wartość2). Innymi słowy, sprawdź wyjścia foo, a następnie ustaw wartość 1, jeśli nie obejdzie się bez przypadkowego zastąpienia wartości 2.
Rin i Len

22

Najkrótszym sposobem jest użycie wartości domyślnej, jeśli klucza nie ma w pamięci:

var sValue = localStorage['my.token'] || ''; /* for strings */
var iValue = localStorage['my.token'] || 0; /* for integers */

4

Możesz także spróbować tego, jeśli chcesz sprawdzić, czy nie jest zdefiniowany:

if (localStorage.user === undefined) {
    localStorage.user = "username";
}

getItem to metoda, która zwraca null, jeśli wartość nie zostanie znaleziona.


3
if(!localStorage.hash) localStorage.hash = "thinkdj";

Lub

var secret =  localStorage.hash || 42;

JavaScript zwraca pierwszą wartość inną niż zero lub dodatnią. Przykłady: [null || „abc”] zwróci „abc” [2 || 5] zwróci 2 [0 || 5] zwróci 5 [1 || 5] zwróci 1 itd. Stąd powyższy kod działa.
Deepak Thomas

2

Naprawdę

localStorage.infiniteScrollEnabled = 1;

NA FAŁSZ

localStorage.removeItem("infiniteScrollEnabled")

SPRAWDŹ ISTNIENIE

if (localStorage[""infiniteScrollEnabled""]) {
  //CODE IF ENABLED
}

1

Należy sprawdzić typ elementu w localStorage

if(localStorage.token !== null) {
   // this will only work if the token is set in the localStorage
}

if(typeof localStorage.token !== 'undefined') {
  // do something with token
}

if(typeof localStorage.token === 'undefined') {
  // token doesn't exist in the localStorage, maybe set it?
}

1

Jak można przetestować istnienie przedmiotu localStorage? ta metoda działa w przeglądarce Internet Explorer.

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>

2
Z pewnością nie powinno; getItem po prostu zwraca null dla kluczy, które nie istnieją.
EricLaw

Miałem ten sam problem z IE, i to jest poprawka, ++
edencorbin

Zdecydowanie powinieneś try | catchparsować element.
Abdul Sadik Yalcin

0
localStorage['root2']=null;

localStorage.getItem("root2") === null //false

Może lepiej zrobić skan planu?

localStorage['root1']=187;
187
'root1' in localStorage
true

0

Najlepszy i najbezpieczniejszy sposób, jaki mogę zasugerować, to:

if(Object.prototype.hasOwnProperty.call(localStorage, 'infiniteScrollEnabled')){
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}

To przechodzi zasadę ESLint no-prototype-builtins.


0

Użyłem w swoim projekcie i działa dla mnie idealnie

var returnObjName= JSON.parse(localStorage.getItem('ObjName'));
if(returnObjName && Object.keys(returnObjName).length > 0){
   //Exist data in local storage
}else{
  //Non Exist data block
}

0

najprościej jest

if(localStorage.test){
console.log("now defined");
}
else{
console.log("undefined");
localStorage.test="defined;"
}

Jak to działa

przy pierwszym wywołaniu localStorage.test nie zawiera on żadnego obiektu w obiekcie localStorage, więc zwraca niezdefiniowane wyzwalacze warunku. po innym uruchomieniu ustawiłem nową zmienną i ponownie sprawdziłem, czy zawiera dane, aby zwróciła dane z wartością true w warunku if


-2

Wypróbuj ten kod

if (localStorage.getItem("infiniteScrollEnabled") === null) {

} else {

}

Rób albo nie rób. Nie ma „spróbuj”. Dobra odpowiedź zawsze będzie wyjaśnienie, co się stało i dlaczego to było zrobione w taki sposób, nie tylko dla PO, ale dla przyszłych turystów do tego.
Jay Blanchard
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.