Wie überprüfe ich, ob ein Speicherelement festgelegt ist?

288

Wie kann ich überprüfen, ob ein Artikel eingestellt ist localStorage? Zur Zeit benutze ich

if (!(localStorage.getItem("infiniteScrollEnabled") == true || localStorage.getItem("infiniteScrollEnabled") == false)) {
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}
Jiew Meng
quelle
2
Anscheinend haben Sie ein Problem ohne Speichermutex
4esn0k

Antworten:

506

Die getItemMethode in der WebStorage-Spezifikation gibt explizit zurück, nullwenn das Element nicht vorhanden ist:

... Wenn der angegebene Schlüssel in der dem Objekt zugeordneten Liste nicht vorhanden ist, muss diese Methode null zurückgeben. ...

Also kannst du:

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

Siehe diese verwandte Frage:

CMS
quelle
1
Könnten Sie Ihre eigene Methode hinzufügen localStorage, um diesen kleinen Test zu kapseln? ZB localStorage.hasItem("infiniteScrollEnabled")?
Paul D. Waite
4
@Paul: Ja, Sie könnten das Storage.prototypeObjekt sogar erweitern , aber als Faustregel empfehle ich immer, keine Objekte zu ändern, die Sie nicht besitzen , insbesondere keine Host-Objekte.
CMS
ooh ja, gute Punkte da drin. Aus einem CSS-Hintergrund kommend ist die Idee, dass ich Browserprobleme selbst beheben kann, aufregend, aber ich kann sehen, wie verwirrend es sein kann, mit den Objekten des Browsers herumzuspielen.
Paul D. Waite
5
Der Hinweis ist falsch - die aktuelle Version der StorageSchnittstelle besagt ausdrücklich, dass die Werte vom Typ sind DOMString. w3.org/TR/webstorage/#the-storage-interface
Alnitak
1
Hinweis entfernt. Danke @TimothyZorn und Alnitak
CMS
45

Sie können dies mit der hasOwnPropertyMethode überprüfen

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

Funktioniert in aktuellen Versionen von Chrome (Mac), Firefox (Mac) und Safari.

Stephan Hoyer
quelle
2
Es sollte die akzeptierte Antwort sein. Der Akzeptierte betrachtet einen gespeicherten "Null" -Wert als nicht gesetzt, was falsch ist.
Flavien Volken
9
@FlavienVolken Sie können jedoch keinen nullWert speichern . Sie können haben "null", aber der Code dort wird sich nicht schlecht verhalten, während dieser auf lengthSchlüssel fehlschlagen wird .
Kaiido
1
@Kaiido Sie haben Recht, ich hatte dieses Verhalten, weil ich die gespeicherten Daten direkt analysierte und weil JSON.parse("null") === JSON.parse(null)ich eine Kollision hatte.
Flavien Volken
3
Der folgende ESLint-Fehler wurde angezeigt: "Greifen Sie nicht über die Zielobjekt.eslint (keine Prototyp-Builds) auf die Object.prototype-Methode 'hasOwnProperty' zu"
rfdc
Dies funktioniert nicht, wenn foo beim Laden der Seite nicht eingestellt ist und Sie etwas mit foo tun möchten. Ich denke, das war es, worauf der Fragesteller abzielte. Sie möchten überprüfen, ob der Schlüssel foovorhanden ist, nicht, ob foo einen Wert hat. Ich habe diese Situation, in der ein .setitemKlickereignis mit einer Logik ausgelöst wird, die auf getItem basiert, aber es funktioniert nicht, bis ich setItem gesetzt habe, und ich kann setItem nicht setzen, bis ich den Status von foo (Wert1 oder Wert2) kenne. Mit anderen Worten, überprüfen Sie die foo-Exits und setzen Sie sie auf value1, wenn dies nicht der Fall ist, ohne versehentlich value2 zu überschreiben.
Rin und Len
22

Der kürzeste Weg ist die Verwendung des Standardwerts, wenn sich der Schlüssel nicht im Speicher befindet:

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

Sie können dies auch versuchen, wenn Sie nach undefiniert suchen möchten:

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

getItem ist eine Methode, die null zurückgibt, wenn kein Wert gefunden wird.

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

Oder

var secret =  localStorage.hash || 42;
Deepak Thomas
quelle
JavaScript gibt den ersten Wert ungleich Null oder positiv zurück. Beispiele: [null || "abc"] gibt "abc" [2 || zurück 5] gibt 2 [0 || zurück 5] gibt 5 [1 || zurück 5] gibt 1 usw. zurück. Daher funktioniert der obige Code.
Deepak Thomas
2

Für wahr

localStorage.infiniteScrollEnabled = 1;

FÜR FALSCH

localStorage.removeItem("infiniteScrollEnabled")

EXISTANZ PRÜFEN

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

Sie sollten im localStorage nach dem Typ des Elements suchen

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?
}
Webmaster
quelle
1

Wie kann man die Existenz eines Gegenstandes in testen localStorage? Diese Methode funktioniert im Internet Explorer.

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>
le vantard
quelle
2
Es sollte sicherlich nicht; getItem gibt nur null für Schlüssel zurück, die nicht existieren.
EricLaw
Ich hatte das gleiche Problem mit IE, und dies ist die Lösung dafür, ++
Edencorbin
Sie sollten auf jeden Fall try | catchbeim Parsen des Elements.
Abdul Sadik Yalcin
0
localStorage['root2']=null;

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

Vielleicht ist es besser, den Plan zu scannen?

localStorage['root1']=187;
187
'root1' in localStorage
true
zloctb
quelle
0

Der beste und sicherste Weg, den ich vorschlagen kann, ist dieser:

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

Dies durchläuft die ESLint- no-prototype-builtinsRegel.

Gaurav Gandhi
quelle
0

Ich habe in meinem Projekt verwendet und funktioniert perfekt für mich

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

Einfacher Weg ist

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

Wie es funktioniert

Wenn Sie localStorage.test zum ersten Mal aufrufen, enthält es keinen Speicher im localStorage-Objekt, sodass undefinierte Auslöser für andere Bedingungen zurückgegeben werden. Nachdem sonst ausgelöst wurde, setze ich eine neue Variable und überprüfe erneut, ob sie Daten enthält, damit sie Daten mit true in if-Bedingung zurückgeben

ßãlãjî
quelle
-2

Versuchen Sie diesen Code

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

} else {

}
Daniel Wichers
quelle
Tun oder nicht tun. Es gibt keinen "Versuch". Eine gute Antwort wird immer eine Erklärung darüber enthalten, was getan wurde und warum es so getan wurde, nicht nur für das OP, sondern auch für zukünftige Besucher von SO.
Jay Blanchard