const key = 'length';
localStorage[key] = 100;
console.log(localStorage[key]); // 0
console.log(localStorage.getItem(key)); // null
const key = 'length';
localStorage.setItem(key, 100);
console.log(localStorage[key]); // 1
console.log(localStorage.getItem(key)); // 100 (строкой)
if (window.userInfo && !window.userInfo.isInAccount) { // или window.userInfo.isInAccount === false
// Как-то так
}
reduce
обрабатывает массив (почти как map
), причем, вторым аргументов передается аккумулятор (acc
), или то, куда будем складывать. Итак: на каждой итерации у нас есть индекс текущего элемента, и количество частей. Благодаря mod
оператору (i % chunks
), мы получаем индекс «части». Далее, (acc[i % chunks] = acc[i % chunks] || [])
эта часть позволяет создавать пустой массив, если по текущей «части» ничего нет. А если не понятно, почему стоит , acc
, то можно функцию представить в другом виде: arr.reduce((acc, n, i) => {
(acc[i % chunks] = acc[i % chunks] || []).push(n);
/* Или
if (!acc[i % chunks]) {
acc[i % chunks] = [];
}
acc[i % chunks].push(n);
*/
return acc;
}, []);
window.addEventListener('resize', function () {
if (window.innerWidth <= 768) {
// 0...768
element.classList.add('class-name');
} else {
// 769...Inf
element.classList.remove('class-name');
}
});
const createCycle = (...callbacks) => {
const generator = (function* () {
let index = 0;
while (true) {
yield callbacks[index++];
index %= callbacks.length;
}
})();
return generator;
};
const cycledCallbacks = createCycle(
(name) => console.log(`Hello, ${name}`),
(name) => console.log(`Bye, ${name}`)
);
const button = document.querySelector('button');
button.addEventListener('click', event => {
event.preventDefault();
const { value: callback } = cycledCallbacks.next();
callback('John');
});
const
, то всегда let
. Потому как let
используется в уникальном scope
. А вообще неплохо рассказано тут (в новой редакции).var
:{
var value = 1;
}
console.log(value); // 1
let
(const
):{
let value = 1;
}
console.log(value); // ReferenceError: value is not defined
const numbers = [2, 5, 3, 5];
let countOfIterations = 0;
const average = array => array.reduce((accumulator, value) => (accumulator += value)) / array.length;
while (true) {
const averageNumber = average(numbers);
if (averageNumber < 4.9) {
countOfIterations++;
numbers.push(5);
} else {
break;
}
}
console.log('Среднее значение:', average(numbers));
console.log('Количество итераций:', countOfIterations);
/*
Среднее значение: 4.9
Количество итераций: 46
*/
returnValue
, иначе Хром просто проигнорирует сообщение.[{ id: 8 }, { id: 3 }, { id: 2 }].sort((a, b) => (a.id - b.id));
[{ id: 2 }, { id: 3 }, { id: 8 }].sort((a, b) => (b.id - a.id));
const sortBy = (array, key, ascending = true) => array.sort((a, b) => (ascending ? (a[key] - b[key]) : (b[key] - a[key])));
document.getElementByID is not a function
. Если так, то правильно document.getElementById(...);
. audio
, Web Audio API, Media Session API. alert
? Тем более на форме, можно что-нибудь всплывающее или рядом с формой показывать.