let $some_elem = $('.some_elem'); // 1
$some_elem.addClass('some_class'); // 2
setTimeout(() => alert("Созрели!"), 1000); // 3 отложили
$('.some_class').remove(); // 4
// этот код выполнился до конца и, казалось бы, делать больше нечего.
// ...через секунду сработал alert
setTimeout()
отрабатывает мгновенно-синхронно - его функция отложить личинку на через-секунду. Представьте, что setTimeout пушит функцию и её время в некий невидимый служебный массив движка JS. А движок заглядывает в этот массив по 100 раз в секунду, когда свободен, не занят выполнением кода, и смотрит, «есть чё?», что пора выполнить?setTimeout()
(но никакого alert ещё не случилось) выполняется следующая строка $('.some_class').remove();
let user = { name: "Джон" };
let admin = { name: "Админ" };
function sayHi() {
alert( this.name );
}
// используем одну и ту же функцию в двух объектах
user.f = sayHi;
admin.f = sayHi;
// вызовы функции, приведённые ниже, имеют разное значение this
// "this" внутри функции является ссылкой на объект, который указан "перед точкой"
user.f(); // Джон (this == user)
admin.f(); // Админ (this == admin)
admin['f'](); // Админ (неважен способ доступа к методу - через точку или квадратные скобки)
window
и не покидает его. const gotTime = (dateStr, days) => {
const che = new Date(dateStr); // дата события
che.setDate(che.getDate() - days); // N дней до события
return che - new Date() > 0; // ещё не наступила граница N-дней-до-события
}
gotTime('2019-11-14T09:07:02.376+00:00', 3); // true
// сегодня 2019-10-15
gotTime('2019-10-19T09:07:02.376+00:00', 3); // true
gotTime('2019-10-18T09:07:02.376+00:00', 3); // false
gotTime('2019-10-17T09:07:02.376+00:00', 3); // false
(123.4567).toExponential() // "1.234567e+2"
[1, 10)
, после запятой и степень.[1, 234567, 2]
>=
, <=
const fuzzy = {
split: n => {
const parts = n.toExponential().split('e')
.map((p, i) => i ? parseInt(p) : p.split('.').map(x => parseInt(x)));
if (parts[0].length < 2) parts[0].push(0);
return [parts[0][0], parts[0][1], parts[1]];
},
eq: (a, b) => {
a = fuzzy.split(a);
b = fuzzy.split(b);
if (a[2] !== b[2]) return false;
const diff = Math.abs(a[1] - b[1]);
if (diff === 0) return Math.abs(a[0] - b[0]) <= 1;
if (a[0][0] !== b[0][0]) return false;
return (diff <= 1);
}
}
fuzzy.eq( 12.1234, 12.1233) // true
const tests = [
[1, 1, true],
[111, 112, true],
[0.001, .002, true],
[0.001, .0025, false],
[0.001, .003, false],
[12.345, 1.2345, false],
[123.88, 123.870, true],
[-1.11111111, 1.11111110, false],
[-1.11111111, -1.11111112, true],
[2.000000001, 2, true],
[4.9999999998, 4.9999999999, true],
[7.9, 8.02, false],
[7.99, 7.98, true],
[7.99, 7.99, true],
[7.99, 8.00, true], // НЕ ПРОХОДИТ! Надо этот случай предусмотреть, но я ушёл спать.
];
let allok = true;
tests.forEach(test => {
if (fuzzy.eq(...test) !== test[2]) {
console.log("FAIL:", test);
allok = false;
} else {
console.log("OK:", test);
}
});
console.log(allok ? 'All OK!' : "Some tests FAILED");
const getById = id => data.filter(s => s.structureId === id)[0] || false;
const getChild = me => data.filter(s => s.parentId === me.structureId)[0] || false;
const getMyParent = me => getById(me.parentId);
const getParentsChain = me => {
const chain = [];
let parent = getMyParent(me);
while(parent) {
chain.unshift(parent);
parent = getMyParent(parent);
}
return chain;
}
const getChildrenChain = me => {
const chain = [];
let child = getChild(me);
while(child) {
chain.push(child);
child = getChild(child);
}
return chain;
}
// test
const me = getById(3);
console.log([...getParentsChain(me), me, ...getChildrenChain(me)]); /*
0: Object { name: "Дирекция юкрк", parentId: null, structureId: 1 }
1: Object { name: "Южно-Курильск", parentId: 1, structureId: 2 }
2: Object { name: "Служба главного инженера", parentId: 2, structureId: 3 }
3: Object { name: "Мехцех", parentId: 3, structureId: 4 } */
ffmpeg -ss 16:27.600 -i movie.mp4 -t 5:55 audio.wav
ffmpeg -hide_banner -i movie.mkv
-map
:ffmpeg -ss 16:27.600 -i movie.mp4 -map 2:a -t 5:55 audio.wav
[avi @ 000000000043f780] non-interleaved AVI
означает, что в AVI файле отдельно записано всё видео одним куском, потом отдельным сплошным куском всё аудио. А задумаывалось, чтобы они часто чередовались, и плеер считав в буфер кусок, мог проиграть видео и соответствующее ему аудио сразу.ffmpeg -i 01.avi -c:v libx264 -c:a aac 01_youtube.mp4
.nextSibling
вернёт Node типа TEXT_NODE
(3). document.getElementById('aa').nextSibling.textContent // "222"
data
- в наследство от CharacterData;e.delegateTarget
по идее содержит элемент, на котором висит слушатель.function getUniqueNum(offset = 0) {
const now = new Date();
noise.seed(0xCEED);
let num = 0;
let hours = now.getHours() + offset;
while(hours-- >= 0) num += Math.round((1 + noise.perlin2(hours / (24 + offset), now.getDate() / 32)) * 100);
return num;
}