Bir Depolama öğesinin ayarlanıp ayarlanmadığı nasıl kontrol edilir?


288

Bir öğenin ayarlanıp ayarlanmadığını nasıl kontrol edebilirim localStorage? Şu anda kullanıyorum

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

2
gibi görünüyor, bir depolama muteks olmadan bir sorun olacak
4esn0k

Yanıtlar:


509

getItemWebStorage şartnamede yöntem, açıkça döner nullöğesi yoksa:

... Verilen anahtar nesne ile ilişkili listede yoksa, bu yöntemin null değerini döndürmesi gerekir. ...

Böylece yapabilirsiniz:

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

Bu ilgili soruya bakın:


1
localStorageBu küçük testi kapsüllemek için kendi yönteminizi ekleyebilir misiniz ? Örneğin localStorage.hasItem("infiniteScrollEnabled")?
Paul D.WaiteTemmuz

4
@Paul: Evet, Storage.prototypenesneyi bile büyütebilirsiniz , ancak genel bir kural olarak, sahip olmadığınız nesneleri , özellikle de barındırılan nesneleri değiştirmemenizi öneririm .
CMS

ooh evet, iyi noktalar var. Bir CSS arka planından geldiğimde, tarayıcı sorunlarını kendim çözebileceğim fikri heyecan verici, ancak tarayıcının nesneleriyle uğraşmanın nasıl kafa karıştırıcı olabileceğini görebiliyorum.
Paul D.WaiteTemmuz

5
Not yanlış - Storagearayüzün geçerli sürümü özellikle değerlerin tür olduğunu söylüyor DOMString. w3.org/TR/webstorage/#the-storage-interface
Alnitak

1
Not kaldırıldı. @TimothyZorn ve Alnitak
CMS

46

Bunu hasOwnPropertykontrol etmek için yöntemi kullanabilirsiniz

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

Chrome (Mac), Firefox (Mac) ve Safari'nin mevcut sürümlerinde çalışır.


2
Kabul edilen cevap olmalı. Kabul edilen değer, saklanmış bir "boş" değeri ayarlanmadı olarak kabul eder, bu yanlıştır.
Flavien Volken

9
@FlavienVolken Kayıtlı bir nulldeğeriniz olamaz . Sahip olabilirsiniz "null", ancak buradaki kod üzerinde yanlış davranmayacak, ancak bu lengthanahtarda başarısız olacaktır .
Kaiido

1
@Kaiido haklısın, bu davranışı yaşadım çünkü saklanan verileri doğrudan ayrıştırıyordum ve JSON.parse("null") === JSON.parse(null)bir çarpışma yaşadım.
Flavien Volken

3
Şu ESLint hatası var: "Hedef object.eslint (no-prototype-builtins) 'den Object.prototype yöntemine' hasOwnProperty 'erişmeyin"
rfdc

Foo sayfa yüklemesinde ayarlanmadıysa ve foo ile bir şeyler yapmak istiyorsanız bu çalışmaz. Ben soru soran bu olduğunu düşünüyorum, sen foofoo bir değeri olup olmadığını değil , anahtar var olup olmadığını kontrol etmek istiyorum . Bir tıklama olay .setitemgetItem dayalı mantık ile tetikler , ancak ben setItem kadar çalışmaz ve foo'nun durumunu (değer1 veya değer2) bilmeden ayarlayamazsınız bu durum var. Başka bir deyişle, foo çıkışlarını kontrol edin ve yanlışlıkla value2 üzerine yazmadan girmezse değer1 olarak ayarlayın.
Rin ve Len

22

Anahtar depoda değilse, en kısa yol varsayılan değeri kullanmaktır:

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

4

Tanımsız olup olmadığını kontrol etmek istiyorsanız bunu da deneyebilirsiniz:

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

getItem, değer bulunmazsa null döndüren bir yöntemdir.


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

Veya

var secret =  localStorage.hash || 42;

JavaScript ilk null olmayan veya pozitif değeri döndürür Örnekler: [null || "abc"] "abc" döndürür [2 || 5] 2 döndürecektir [0 || 5] 5 döndürecektir [1 || 5] 1 döndürecektir. Dolayısıyla yukarıdaki kod çalışır.
Deepak Thomas

2

Doğru için

localStorage.infiniteScrollEnabled = 1;

YANLIŞ İÇİN

localStorage.removeItem("infiniteScrollEnabled")

Varlığı Kontrol Et

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

1

LocalStorage'da öğenin türünü kontrol etmelisiniz

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

Kişi bir öğenin varlığını nasıl test edebilir localStorage? bu yöntem internet explorer'da çalışır.

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

2
Kesinlikle olmamalı; getItem, var olmayan anahtarlar için null değerini döndürür.
EricLaw

IE ile aynı sorunu yaşıyordum, ve bunun için düzeltme, ++
edencorbin

Kesinlikle try | catchöğeyi ayrıştırırken gerekir .
Abdul Sadik Yalcin

0
localStorage['root2']=null;

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

Belki bir plan taraması yapmak daha iyi?

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

0

Önerebileceğim en iyi ve en güvenli yol,

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

Bu ESLint'in no-prototype-builtinskuralından geçer .


0

Projemde kullandım ve benim için mükemmel çalışıyor

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

kolay yol

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

Nasıl çalışır

localStorage.test öğesini ilk çağırdığınızda, localStorage nesnesine herhangi bir mağaza içermediğinden tanımsız başka koşul tetikleyicileri döndürür. başka tetiklendikten sonra yeni bir değişken belirledim ve tekrar veri içeriyorsa kontrol edin.


-2

Bu kodu deneyin

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

} else {

}

Yap ya da yapma. Burada deneme yok". Bir güzel cevap bu OP için ancak bunu gelecek ziyaretçiler için değil, bu şekilde yapıldığını neden hep ne yapıldı bir açıklama elde eder ve bunun.
Jay Blanchard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.