Comment vérifier si un élément de stockage est défini?

288

Comment puis-je vérifier si un élément est installé localStorage? Actuellement j'utilise

if (!(localStorage.getItem("infiniteScrollEnabled") == true || localStorage.getItem("infiniteScrollEnabled") == false)) {
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}
Jiew Meng
la source
2
semble, vous aurez un problème sans mutex de stockage
4esn0k

Réponses:

509

La getItemméthode de la spécification WebStorage renvoie explicitement nullsi l'élément n'existe pas:

... Si la clé donnée n'existe pas dans la liste associée à l'objet alors cette méthode doit retourner null. ...

Afin que vous puissiez:

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

Voir cette question connexe:

CMS
la source
1
Pourriez-vous ajouter votre propre méthode localStoragepour encapsuler ce petit test? Par exemple localStorage.hasItem("infiniteScrollEnabled")?
Paul D. Waite
4
@ Paul: Oui, vous pouvez même augmenter l' Storage.prototypeobjet, mais en règle générale, je recommande toujours de ne pas modifier les objets que vous ne possédez pas , en particulier les objets hôtes.
CMS
ooh ouais, de bons points là-dedans. Venant d'un arrière-plan CSS, l'idée que je peux résoudre les problèmes de navigateur moi-même est passionnante, mais je peux voir comment le détournement avec les objets du navigateur peut prêter à confusion.
Paul D. Waite
5
La note est incorrecte - la version actuelle de l' Storageinterface indique spécifiquement que les valeurs sont de type DOMString. w3.org/TR/webstorage/#the-storage-interface
Alnitak
1
Remarque supprimée. Merci @TimothyZorn et Alnitak
CMS
45

Vous pouvez utiliser une hasOwnPropertyméthode pour vérifier cela

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

Fonctionne dans les versions actuelles de Chrome (Mac), Firefox (Mac) et Safari.

Stephan Hoyer
la source
2
Ce devrait être la réponse acceptée. Celui qui est accepté considérera une valeur "nulle" stockée comme non définie, ce qui est faux.
Flavien Volken
9
@FlavienVolken Vous ne pouvez cependant pas avoir de nullvaleur stockée . Vous pouvez en avoir "null", mais le code ne s'y comportera pas mal, tandis que celui-ci échouera sur la lengthclé.
Kaiido
1
@Kaiido vous avez raison, j'ai eu ce comportement parce que j'analysais directement les données stockées et que JSON.parse("null") === JSON.parse(null)j'ai eu une collision.
Flavien Volken
3
Vous obtenez l'erreur ESLint suivante: "N'accédez pas à la méthode Object.prototype 'hasOwnProperty' depuis la cible object.eslint (sans prototype-builtins)"
rfdc
Cela ne fonctionnera pas si foo n'est pas défini au chargement de la page et que vous souhaitez faire quelque chose avec foo. Je pense que c'est ce que l'interrogateur voulait dire, vous voulez vérifier si la clé fooexiste, pas si foo a une valeur. J'ai cette situation, où un événement de clic se déclenche .setitemavec une logique basée sur getItem, mais cela ne fonctionnera pas tant que je n'aurai pas setItem, et je ne pourrai pas setItem avant de connaître l'état de foo (valeur1 ou valeur2). En d'autres termes, cochez foo exits puis réglez-le sur value1 s'il ne le fait pas sans écraser accidentellement value2.
Rin and Len
22

Le moyen le plus court consiste à utiliser la valeur par défaut, si la clé n'est pas dans le stockage:

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

Vous pouvez également essayer ceci si vous souhaitez vérifier si non défini:

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

getItem est une méthode qui renvoie null si aucune valeur n'est trouvée.

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

Ou

var secret =  localStorage.hash || 42;
Deepak Thomas
la source
JavaScript renvoie la première valeur non nulle ou positive Exemples: [null || "abc"] renverra "abc" [2 || 5] renverra 2 [0 || 5] renverra 5 [1 || 5] renverra 1 etc. Par conséquent, le code ci-dessus fonctionne.
Deepak Thomas
2

Pour de vrai

localStorage.infiniteScrollEnabled = 1;

POUR LES FAUX

localStorage.removeItem("infiniteScrollEnabled")

VERIFIER L'EXISTANCE

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

Vous devez vérifier le type de l'élément dans le 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?
}
webmaster
la source
1

Comment peut-on tester l'existence d'un article dans localStorage? cette méthode fonctionne dans Internet Explorer.

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>
le vantard
la source
2
Cela ne devrait certainement pas; getItem renvoie simplement null pour les clés qui n'existent pas.
EricLaw
J'avais le même problème avec IE, et c'est la solution pour cela, ++
edencorbin
Vous devriez certainement try | catchlors de l'analyse de l'élément.
Abdul Sadik Yalcin
0
localStorage['root2']=null;

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

Peut-être mieux de faire un scan du plan?

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

La meilleure et la plus sûre façon que je puisse suggérer est la suivante,

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

Cela passe par la no-prototype-builtinsrègle d'ESLint .

Gaurav Gandhi
la source
0

J'ai utilisé dans mon projet et fonctionne parfaitement pour moi

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
la source
0

est plus facile

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

Comment ça fonctionne

lorsque vous appelez localStorage.test la première fois, il ne contient aucun magasin dans l'objet localStorage, il renvoie donc des déclencheurs de condition else non définis. après le déclenchement, j'ai défini une nouvelle variable et vérifié à nouveau qu'elle contient des données afin qu'elle renvoie les données avec la condition true in if

ßãlãjî
la source
-2

Essayez ce code

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

} else {

}
Daniel Wichers
la source
Faites ou ne faites pas. Il n'y a pas d'essai". Une bonne réponse aura toujours une explication de ce qui a été fait et pourquoi cela a été fait de cette manière, non seulement pour le PO mais pour les futurs visiteurs de SO.
Jay Blanchard