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

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

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

person Jiew Meng    schedule 16.07.2010    source источник
comment
похоже, у вас будет проблема без мьютекса хранилища   -  person 4esn0k    schedule 11.07.2013


Ответы (15)


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

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

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

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

См. Этот связанный вопрос:

person Christian C. Salvadó    schedule 16.07.2010
comment
Не могли бы вы добавить в localStorage свой собственный метод для инкапсуляции этого небольшого теста? Например. localStorage.hasItem("infiniteScrollEnabled")? - person Paul D. Waite; 17.07.2010
comment
@Paul: Да, вы можете даже увеличить объект Storage.prototype, но, как правило, я всегда рекомендую не изменять объекты, которыми вы не владеете, особенно объекты размещения. - person Christian C. Salvadó; 17.07.2010
comment
о да, хорошие моменты в этом. Исходя из опыта работы с CSS, идея о том, что я сам могу исправить проблемы с браузером, является захватывающей, но я вижу, как возня с объектами браузера может сбить с толку. - person Paul D. Waite; 19.07.2010
comment
Примечание неверно - в текущей версии интерфейса Storage прямо указано, что значения относятся к типу DOMString. w3.org/TR/webstorage/#the-storage-interface - person Alnitak; 06.06.2015
comment
Да, примечание совершенно неверное. Пожалуйста, удалите его, чтобы избежать путаницы. - person Timothy Zorn; 07.03.2017
comment
Примечание удалено. Спасибо @TimothyZorn и Alnitak - person Christian C. Salvadó; 08.03.2017
comment
Спасибо! Однако, поскольку вопрос пытается установить значение в хранилище на true и проверяет, истинно ли оно, может быть хорошей идеей упомянуть, что ключи и значения могут быть только строками, и все, что вы передаете в качестве значения, неявно преобразуется в строку . - person Timothy Zorn; 08.03.2017

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

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

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

person Stephan Hoyer    schedule 04.01.2017
comment
Это должен быть принятый ответ. Принятый будет считать сохраненное нулевое значение не установленным, что неверно. - person Flavien Volken; 05.06.2018
comment
@FlavienVolken Однако у вас не может быть сохраненного значения null. У вас может быть "null", но код там не будет некорректно работать, в то время как этот код не будет работать при нажатии клавиши length. - person Kaiido; 04.09.2018
comment
@Kaiido, вы правы, у меня было такое поведение, потому что я напрямую разбирал сохраненные данные и, как JSON.parse("null") === JSON.parse(null), у меня произошла коллизия. - person Flavien Volken; 04.09.2018
comment
Получена следующая ошибка ESLint: не обращаться к методу hasOwnProperty Object.prototype из целевого объекта object.eslint (no-prototype-builtins) - person rfdc; 03.01.2019
comment
Это не сработает, если foo не установлен при загрузке страницы, и вы хотите что-то сделать с foo. Я думаю, что это то, что имел в виду спрашивающий, вы хотите проверить, существует ли ключ foo, а не имеет ли foo значение. У меня есть такая ситуация, когда событие щелчка запускается .setitem с логикой, основанной на getItem, но это не сработает, пока я не установлюItem, и я не могу установитьItem, пока не узнаю состояние foo (значение1 или значение2). Другими словами, проверка foo завершается, а затем устанавливает значение value1, если это не происходит без случайной перезаписи value2. - person Rin and Len; 14.02.2020

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

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

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

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

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

person Prime_Coder    schedule 29.02.2016

ИСТИНА

localStorage.infiniteScrollEnabled = 1;

ЗА ЛОЖЬ

localStorage.removeItem("infiniteScrollEnabled")

ПРОВЕРИТЬ НАЛИЧИЕ

if (localStorage[""infiniteScrollEnabled""]) {
  //CODE IF ENABLED
}
person Derin    schedule 22.08.2014

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

<script>
    try{
        localStorage.getItem("username");
    }catch(e){
        alert("we are in catch "+e.print);
    }
</script>
person le vantard    schedule 08.10.2015
comment
Конечно, не должно; getItem просто возвращает null для ключей, которых не существует. - person EricLaw; 30.03.2016
comment
У меня была такая же проблема с IE, и это исправление, ++ - person edencorbin; 07.06.2016
comment
Вы обязательно должны try | catch разобрать элемент. - person Abdul Sadik Yalcin; 09.11.2017

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

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

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

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

person Gaurav Gandhi    schedule 06.08.2019

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

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

localStorage['root2']=null;

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

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

localStorage['root1']=187;
187
'root1' in localStorage
true
person zloctb    schedule 26.06.2014

есть несколько способов проверить, я добавляю их сюда

Способ 1

if("infiniteScrollEnabled" in localStorage){
     console.log("Item exists in localstorage");
}else{
    console.log("Item does not exist in localstoarge";
}

Способ 2

if(localStorage.getItem("infiniteScrollEnabled") === null){
    console.log("Item does not exist in localstoarge";
}else{
   console.log("Item exists in localstorage");
}

Способ 3

if(typeof localStorage["cart"] === "undefined"){
    console.log("Item does not exist in localstoarge";
}else{
   console.log("Item exists in localstorage");
}

Метод 4

if(localStorage.hasOwnProperty("infiniteScrollEnabled")){
     console.log("Item exists in localstorage");
 }else{
    console.log("Item does not exist in localstoarge";
 }
person Vikas Kandari    schedule 31.03.2021

Я опаздываю на эту вечеринку, но проверка localStorage на наличие ключей (или наличие значений ключей) легко выполняется с помощью localDataStorage, созданную мной удобную оболочку утилит.

После создания экземпляра оболочки с чем-то вроде

myLDS = localDataStorage( 'segmentedStorageHere' );

вы можете установить ключи

myLDS.set( 'infiniteScrollEnabled', true );

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

let scrollingState = myLDS.get( 'infiniteScrollEnabled' );

а scrollingState будет содержать возвращаемое логическое значение. Оболочка отслеживает для вас собственный тип данных JavaScript (массив, логическое значение, дата, число, объект и т. Д.). Больше не нужно преобразовывать / анализировать JSON в вашем коде.

Теперь, когда нам нужно узнать, есть ли ключ в магазине, мы можем проверить его так:

if( myLDS.haskey( 'infiniteScrollEnabled' ) ) {
    console.log( "It's been set!" ); 
} else {
    console.log( "The key is not set." ); 
}

Вы также можете проверить, присутствует ли конкретное значение. Например

myLDS.set( 'myNumber', 1234.5678 );
console.log( myLDS.hasval( 1234.5678 ) );    --> true
person Mac    schedule 01.04.2021

простой способ

1. Вы можете напрямую вызвать localStorage.key_name, он возвращает undefined, потому что localStorage.test не имеет значения

2.localStorage.test = value, он возвращает строку, поэтому возвращает true

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

}

Логический Или возвращает строку, если localStorage.test не определен

var default=localStorage.test||'this is default value';

console.log(default)

оператор сравнения

if (localStorage.test=== undefined) {
    localStorage.test= "valueseted";
}

hasOwnProperty

if(!localStorage.hasOwnProperty('test'))
{
localStorage.test= "valueseted";
}

localStorage getItem / setItem

if(!localStorage.getItem('test'))
 {
    localStorage.test= "valueseted";
 }
person ßãlãjî    schedule 17.04.2020

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

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

} else {

}
person Daniel Wichers    schedule 27.04.2020
comment
Делай или не делай. Нет попытки. хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO. - person Jay Blanchard; 27.04.2020

person    schedule
comment
JavaScript возвращает первое ненулевое или положительное значение. Примеры: [null || abc] вернет abc [2 || 5] вернет 2 [0 || 5] вернет 5 [1 || 5] вернет 1 и т. Д. Следовательно, приведенный выше код работает. - person Deepak Thomas; 21.05.2018