Come verificare se è stato impostato un elemento di archiviazione?


288

Come posso verificare se un articolo è impostato localStorage? Attualmente sto usando

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

2
sembra, avrai un problema senza un mutex di archiviazione
4esn0k

Risposte:


509

Il getItemmetodo nella specifica WebStorage restituisce esplicitamente nullse l'articolo non esiste:

... Se la chiave fornita non esiste nell'elenco associato all'oggetto, questo metodo deve restituire null. ...

Così puoi:

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

Vedi questa domanda correlata:


1
Potresti aggiungere il tuo metodo localStorageper incapsulare questo piccolo test? Ad esempio localStorage.hasItem("infiniteScrollEnabled")?
Paul D. Waite,

4
@Paul: Sì, potresti persino aumentare l' Storage.prototypeoggetto, ma come regola generale consiglio sempre di non modificare gli oggetti che non possiedi , specialmente gli oggetti host.
CMS,

ooh sì, buoni punti lì dentro. Proveniente da un background CSS, l'idea che posso risolvere personalmente i problemi del browser è entusiasmante, ma posso vedere come confondersi con gli oggetti del browser potrebbe creare confusione.
Paul D. Waite,

5
La nota non è corretta: la versione corrente Storagedell'interfaccia dice specificamente che i valori sono di tipo DOMString. w3.org/TR/webstorage/#the-storage-interface
Alnitak

1
Nota rimossa. Grazie @TimothyZorn e Alnitak
CMS

46

È possibile utilizzare il hasOwnPropertymetodo per verificare questo

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

Funziona con le versioni correnti di Chrome (Mac), Firefox (Mac) e Safari.


2
Dovrebbe essere la risposta accettata. Quello accettato considererà un valore "null" memorizzato come non impostato, il che è sbagliato.
Flavien Volken,

9
@FlavienVolken Tuttavia non è possibile avere un nullvalore memorizzato . Puoi avere "null", ma il codice non si comporterà in modo errato, mentre questo non funzionerà sulla lengthchiave.
Kaiido,

1
@Kaiido hai ragione, ho avuto questo comportamento perché stavo analizzando direttamente i dati memorizzati e come JSON.parse("null") === JSON.parse(null)ho avuto una collisione.
Flavien Volken,

3
Ottenuto il seguente errore ESLint: "Non accedere al metodo Object.prototype 'hasOwnProperty' dal target object.eslint (no-prototype-builtins)"
rfdc,

Questo non funzionerà se foo non è impostato sul caricamento della pagina e vuoi fare qualcosa con foo. Penso che sia quello a cui stava arrivando l'interrogante, vuoi verificare se la chiave fooesiste, non se foo ha un valore. Ho questa situazione, in cui un evento click si innesca .setitemcon la logica basata su getItem, ma non funzionerà fino a quando setItem, e non posso impostareItem fino a quando non conosco lo stato di foo (valore1 o valore2). In altre parole, controlla che foo esca, quindi impostalo su value1 se non lo fa senza sovrascrivere accidentalmente value2.
Rin e Len,

22

Il modo più breve è utilizzare il valore predefinito, se la chiave non è in memoria:

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

4

Puoi anche provare questo se vuoi controllare se non definito:

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

getItem è un metodo che restituisce null se il valore non viene trovato.


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

O

var secret =  localStorage.hash || 42;

JavaScript restituisce il primo valore non nullo o positivo Esempi: [null || "abc"] restituirà "abc" [2 || 5] restituirà 2 [0 || 5] restituirà 5 [1 || 5] restituirà 1 ecc. Quindi il codice sopra funziona.
Deepak Thomas,

2

Per VERO

localStorage.infiniteScrollEnabled = 1;

PER FALSO

localStorage.removeItem("infiniteScrollEnabled")

VERIFICA ESISTENZA

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

1

È necessario verificare il tipo di articolo nel 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

Come si può verificare l'esistenza di un articolo localStorage? questo metodo funziona in Internet Explorer.

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

2
Certamente non dovrebbe; getItem restituisce null per le chiavi che non esistono.
EricLaw,

Stavo avendo lo stesso problema con IE, e questa è la soluzione, ++
edencorbin

Dovresti assolutamente try | catchanalizzare il prodotto.
Abdul Sadik Yalcin,

0
localStorage['root2']=null;

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

Forse è meglio fare una scansione del piano?

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

0

Il modo migliore e più sicuro che posso suggerire è questo,

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

Questo passa attraverso la no-prototype-builtinsregola di ESLint .


0

Ho usato nel mio progetto e funziona perfettamente per me

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

il modo più semplice è

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

Come funziona

quando si chiama localStorage.test per la prima volta, esso non contiene alcun archivio nell'oggetto localStorage, quindi restituisce trigger di condizione altrimenti indefiniti. dopo l'attivazione, ho impostato una nuova variabile e ricontrollare che contenga dati in modo che restituisca i dati con true in if condition


-2

Prova questo codice

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

} else {

}

Fare o no. Non c'è una prova". Una buona risposta avrà sempre una spiegazione di ciò che è stato fatto e del perché è stato fatto in questo modo, non solo per l'OP ma anche per i futuri visitatori di SO.
Jay Blanchard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.