/
регулярным выражением/
\s
, включая перенос строки, +
' '
:const name = "str 1\nstr 2";
console.log(name);
// str 1
// str 2
console.log( name.replace(/\s+/g, ' ') );
// "str 1 str 2"
ключ g
("global") после выражения – чтобы заменить не единственный первый встречный раз, а "глобально", во всём предоставленном тексте. setTimeout()
— сначала зарядится таймер, отработает: отресолвит промис, и после этого уже сработает финальный console.log()
async function monitor() {
await new Promise(resolve => {
setTimeout(() => {
console.log("Прошла секунда");
resolve();
}, 1000);
});
console.log("После Вас!")
}
monitor();
[...defaultDepts]
создаёт новый массив старых объектов. Меняете что-то внутри этих объектов — меняется и внутри defaultDepts.[...this.defaultDepartments].map(item => {...item})
, а нормальная рекурсивная. Ведь ещё и свойство colleagues
, с свою очередь, содержит массив объектов. function spread(arr, src) {
const result = [...arr]; // копия исходного массива
if (src <= 0) return result;
const axis = {}; // value: [ids of bins]
arr.forEach((v, i) => {
if (!axis[v]) axis[v] = [];
axis[v].push(i);
});
const keys = Object.keys(axis).sort((a, b) => a - b);
const bins = [...axis[keys[0]]]; // ids of "bins" we're filling
for (let i = 1; i < keys.length; i++) {
const currentKey = keys[i];
const prevKey = keys[i - 1];
const diff = currentKey - prevKey;
const capacity = bins.length * diff;
if (src < capacity) break;
bins.forEach(key => result[key] += diff);
src -= capacity;
bins.push(...axis[currentKey]);
}
if (src) {
const want = Math.ceil(src / bins.length);
bins.forEach(key => {
const given = Math.min(src, want)
result[key] += given;
src -= given;
});
}
console.log(result);
return result;
}
spread([30, 50, 350], 300); // [ 190, 190, 350 ]
spread([30, 50, 350], 1001); // [ 477, 477, 477 ]
spread([130, 50, 50, 101], 800); // [ 282, 283, 283, 283 ]
document.addEventListener('click', event => {
const { target } = event;
if (target.tagName !== 'DIV'
|| !target.classList.contains('elem')) {
return;
}
console.log(target.dataset.name);
});
7 * 2 = 14
дисплеев 1920 x 1080 каждый.const blockRelocate = () => {
const elSource = document.querySelector('.description-wrapper');
if (!elSource) {
return setTimeout(blockRelocate, 150);
}
const elTarget = document.querySelector('.item-calculator_container');
elTarget.insertAdjacentElement('beforebegin', elSource);
}
blockRelocate();
ffmpeg
– оно выполнилось и вывело версию и кучу всего. ffmpeg \
-ss 12 \
-i video.mp4 \
-t 22 \
audio_12_34.wav
Set
удобен, например, когда нужно оставить из набора данных только уникальные.const data = [ 1, 2, 2, 3, 3, 3 ];
const unique = [...new Set(data)];
unique // [ 1, 2, 3 ]
Map
хорош тем, что ключами в нём могут быть и объекты. Например, HTML-элементы, для которых захочется хранить какие-то данные. И Map запоминает порядок добавления элементов, что может быть полезно при переборе. let value = { name: 'iOne' };
let x = value; // ещё одна "ссылка" на объект
value = null; // или delete value; – то же самое
x // { name: "iOne" }
Разберитесь с основами: Объекты и ссылки на объекты. Т.к. в объекте weakMap есть ссылка от ключа на объект-значение — объект вполне себе сохраняется. Главное, что всё ещё жива ссылка на объект-ключ key
.const weakMap = new WeakMap();
let value = {name: 'Ivan'};
let key = {};
// добавление нового элемента
weakMap.set(key, value);
// обнуление
delete key;
Теперь, хоть объект, на который указывала переменная key
всё ещё используется в качестве ключа в WeakMap, сборщик мусора, при срабатывании, таки удалит его. ffmpeg \
-ss 15 \ # пропустить 15 секунд от начала
-i Source.mp4 \ # имя исходного файла
-t 30 \ # продолжительность 30 сек.
-c copy \ # кодек "копия" - не перекодировать
Result.mp4 # что получится - в этот файл
только удалите все комментарии – после слешей должен сразу быть перенос строки. Этот вариант, пожалуй, самый быстрый из возможных. Вопрос если разница в таких записях?
resolve(script)
передаст дальше по цепочке этот script
(который никому не нужен, похоже).script.onload = resolve
передаст по цепочке объект события (тоже всем по барабану)почему такой ее вызов дает ошибку script.onload = resolve(script);
потому, что нужна функция, которую вызовут позже, а не мгновенный результат её выполнения.