Як перевірити, чи встановлено елемент зберігання?


288

Як я можу перевірити, чи встановлений елемент localStorage? В даний час я використовую

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

2
Здається, у вас виникне проблема без
файлу

Відповіді:


509

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

... Якщо вказаного ключа не існує в списку, пов'язаному з об'єктом, то цей метод повинен повернути нуль. ...

Отже, ви можете:

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

Дивіться це пов'язане питання:


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
Це має бути прийнята відповідь. Прийняте вважатиме збережене "null" значення як не встановлене, що є неправильним.
Флавіен Волкен

9
@FlavienVolken Ти не можеш зберегти nullзначення. Ви можете мати "null", але код там не буде поводитися з ним, тоді як цей не виходить з ладу length.
Каїдо

1
@Kaiido Ви маєте рацію, я мав таку поведінку, тому що я безпосередньо аналізував збережені дані і JSON.parse("null") === JSON.parse(null)внаслідок зіткнення.
Флавіен Волкен

3
Отримав таку помилку ESLint: "Не доступ до методу Object.prototype 'hasOwnProperty' від цільового object.eslint (не-прототип-вбудовані)"
rfdc

Це не працюватиме, якщо foo не встановлено під час завантаження сторінки, і ви хочете зробити щось із foo. Я думаю, що саме до цього ставився запитувач, ви хочете перевірити, чи fooіснує ключ , а не, якщо foo має значення. У мене є така ситуація, коли подія клацання спрацьовує за .setitemдопомогою логіки, заснованої на getItem, але вона не працюватиме, поки я не встановитиItem, і я не можу встановитиItem, поки я не дізнаюся стан foo (value1 або value2). Іншими словами, перевірте вихід foo, а потім встановіть його значення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 - це метод, який повертає null, якщо значення не знайдено.


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
}

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 просто повертає null для ключів, які не існують.
EricLaw

У мене була така ж проблема з IE, і це виправлення, ++
edencorbin

Ви обов'язково повинні try | catchрозбирати елемент.
Абдул Садік Ялцін

0
localStorage['root2']=null;

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

Може, краще зробити сканування плану?

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

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, тому він повертає невизначені тригери умови. після іншого запускається, я встановлюю нову змінну і ще раз перевіряю, чи вона містить дані, щоб вона повертала дані з true у умові if


-2

Спробуйте цей код

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

} else {

}

Робити чи ні. Немає "спробувати". Хороший відповідь завжди буде пояснення того , що було зроблено і чому це було зроблено таким чином, не тільки для OP , але для відвідувачів майбутнього так.
Джей Бланшард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.