Как проверить, установлен ли элемент хранилища?

289

Как я могу проверить, установлен ли элемент localStorage? В настоящее время я использую

if (!(localStorage.getItem("infiniteScrollEnabled") == true || localStorage.getItem("infiniteScrollEnabled") == false)) {
    // init variable/set default variable for item
    localStorage.setItem("infiniteScrollEnabled", true);
}
Jiew Meng
источник
2
Кажется, у вас возникнет проблема без мьютекса хранения
4esn0k

Ответы:

510

getItemМетод в спецификации Webstorage, явно возвращается , nullесли элемент не существует:

... Если данный ключ не существует в списке, связанном с объектом, тогда этот метод должен возвратить нуль. ...

Так что вы можете:

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

Смотрите этот связанный вопрос:

CMS
источник
1
Не могли бы вы добавить свой собственный метод localStorageдля инкапсуляции этого маленького теста? Например localStorage.hasItem("infiniteScrollEnabled")?
Пол Д. Уэйт
4
@Paul: Да, вы могли бы даже расширить Storage.prototypeобъект, но, как правило, я всегда рекомендую не изменять объекты, которыми вы не владеете , особенно объекты-хозяева.
CMS
о, да, хорошие моменты там. Исходя из CSS-фона, идея о том, что я могу самостоятельно устранять проблемы с браузером, интересна, но я вижу, как путаница с объектами браузера может сбить с толку.
Пол Д. Уэйт
5
Примечание неверно - текущая версия Storageинтерфейса специально говорит, что значения имеют тип DOMString. w3.org/TR/webstorage/#the-storage-interface
Альнитак
1
Примечание удалено. Спасибо @TimothyZorn и Alnitak
CMS
46

Вы можете использовать hasOwnPropertyметод, чтобы проверить это

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

Работает в текущих версиях Chrome (Mac), Firefox (Mac) и Safari.

Стефан Хойер
источник
2
Это должен быть принятый ответ. Принятый будет считать сохраненное «нулевое» значение не установленным, что неверно.
Флавиен Волкен
9
@FlavienVolken Вы не можете иметь сохраненное nullзначение, хотя. Вы можете иметь "null", но код там не будет плохо себя вести, в то время как этот не будет работать на lengthключе.
Кайидо
1
@ Кайидо, вы правы, у меня было такое поведение, потому что я непосредственно анализировал сохраненные данные и, как JSON.parse("null") === JSON.parse(null)я столкнулся.
Флавиен Волкен,
3
Получена следующая ошибка ESLint: «Не обращаться к методу Object.prototype 'hasOwnProperty' из целевого объекта.eslint (no-prototype-builtins)"
rfdc
Это не будет работать, если foo не установлен при загрузке страницы, и вы хотите что-то сделать с foo. Я думаю, что это то, к чему обращался спрашивающий, вы хотите проверить, существует ли ключ foo, а не имеет ли значение foo. У меня есть такая ситуация, когда событие click срабатывает .setitemс логикой, основанной на getItem, но оно не будет работать, пока я не установлю setItem, и я не могу установить setItem, пока не узнаю состояние foo (value1 или value2). Другими словами, проверьте foo exits, затем установите его в значение1, если это не происходит без случайной перезаписи значения2.
Рин и Лен
22

Самый короткий путь - использовать значение по умолчанию, если ключ не находится в хранилище:

var sValue = localStorage['my.token'] || ''; /* for strings */
var iValue = localStorage['my.token'] || 0; /* for integers */
Владислав
источник
4

Вы также можете попробовать это, если хотите проверить неопределенность:

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

getItem - это метод, который возвращает ноль, если значение не найдено.

Prime_Coder
источник
3
if(!localStorage.hash) localStorage.hash = "thinkdj";

Или

var secret =  localStorage.hash || 42;
Дипак Томас
источник
JavaScript возвращает первое ненулевое или положительное значение. Примеры: [null || «abc»] вернет «abc» [2 || 5] вернет 2 [0 || 5] вернет 5 [1 || 5] вернет 1 и т. Д. Следовательно, приведенный выше код работает.
Дипак Томас
2

ИСТИННО

localStorage.infiniteScrollEnabled = 1;

НА ЛОЖЬ

localStorage.removeItem("infiniteScrollEnabled")

ПРОВЕРЬТЕ СУЩЕСТВОВАНИЕ

if (localStorage[""infiniteScrollEnabled""]) {
  //CODE IF ENABLED
}
Derin
источник
1

Вы должны проверить тип элемента в 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

Как можно проверить наличие предмета в localStorage? этот метод работает в Internet Explorer.

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>
Ле Вантар
источник
2
Это конечно не должно; getItem просто возвращает ноль для ключей, которые не существуют.
EricLaw
У меня была та же проблема с IE, и это исправление, ++
edencorbin
Вы должны определенно try | catchпри разборе элемента.
Абдул Садик Ялчин
0
localStorage['root2']=null;

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

Может быть, лучше сделать сканирование плана?

localStorage['root1']=187;
187
'root1' in localStorage
true
zloctb
источник
0

Лучший и самый безопасный способ, который я могу предложить, это,

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

Это проходит через no-prototype-builtinsправило ESLint .

Гаурав Ганди
источник
0

Я использовал в своем проекте и отлично работает для меня

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

Пасхальный путь

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

Как это устроено

когда вы вызываете localStorage.test в первый раз, он не содержит никакого хранилища в объекте localStorage, поэтому он возвращает неопределенные триггеры условия else. после того как еще сработало, я установил новую переменную и снова проверил, что она содержит данные, чтобы они возвращали данные с истинным в условии if

ßãlãjî
источник
-2

Попробуйте этот код

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

} else {

}
Даниэль Уичерс
источник
Делай или не делай. Там нет "попробовать". Хороший ответ всегда будет объяснение того , что было сделано и почему это было сделано таким образом, не только для OP , но для посетителей будущего так.
Джей Бланшар