Помогите разобраться с решением задачи
Условие задачи: В localStorage по ключу "counters" находится JSON c объектом, полями которого являются имена счётчиков, а значениями - числовое значение счётчика.
Напишите функцию incrementCounter, которой на вход первым параметром передаётся counterName - имя счётчика.
Задача функции - увеличить значение счётчика counterName на 1 и обновить данные в localStorage.
В localStorage может находится не валидный JSON, чтение которого может привести к ошибке, в этом случае функция должна записывать новые данные, где у указанного счетчика будет значение 1.
В конце функция должна возвращать значение счетчика после инкремента.
Пример использования:
// в localStorage 1 счетчик: bannerClick = 5
incrementCounter('bannerClick'); // 6
incrementCounter('bannerClose'); // 1
// в localStorage 2 счетчика: bannerClick = 6, bannerClose = 1
Вот само решение:
function incrementCounter(counterName){
let counters;
try {
counters = JSON.parse(localStorage.getItem("counters"));
} catch (er) {
counters = {};
}
if(typeof counters[counterName] !== 'number'){
counters[counterName] = 0;
}
counters[counterName]++;
localStorage.setItem("counters", JSON.stringify(counters));
return counters[counterName];
}
Первое меня интересует блоки try/catch. В try мы в новоиспеченную переменную заносим значения ключа counters из localStorage, сразу же запарсивая. А что происходит в блоке catch? Почему там написано
counters = {}?Почему в условии пишут
counters[counterName]? Это обращение к значению счетчика, находящегося в localStorage? И почему, если типcounters[counterName]НЕ number, то ему присваивается значение 0? Это для случая, если будут записываться новые данные?В предпоследней строчке в localStorage заносится
counters, а почему неcounters[counterName]?
Ответы (1 шт):
Почему там написано counters = {}?
Изначальноcountersне присваивается никакого значение, так что если происходит ошибка и получить данные из localStorage не получится, дальнейший код выдаст ошибку. Чтобы этого избежатьcountersприсваивается пустой объект.Почему в условии пишут counters[counterName]
Обычная скобочная нотация - обращение к полю объекта.Почему, если тип counters[counterName] НЕ number, то ему присваивается значение 0?
По названию очевидно, чтоcounter- счётчик, он должен быть числом, а если он им не является, то ему присваивается значение 0.В предпоследней строчке в localStorage заносится counters, а почему не counters[counterName]?
А почему должно?counters[counterName]- одно значение из объекта,counters- все значения. Вам же надо сохранить все значения, а не только то которое вы изменили.