0.3 - 0.1 // 0.19999999999999998
x = new Decimal(0.3)
x.minus(0.1) // '0.2'
$('#datePicker').datepicker();
$('#datePicker').datepicker({
dateFormat: "dd.mm.yyyy"
});
const hasCommon = (a, b) => undefined !== a.find(v => b.includes(v))
const tests = [
[[1,11,111], [2,3], false],
[[1,11,111,4,5], [2,3,4], true],
[[2,3,4], [1,11,111,4,5], true],
[[1,11,111,'A',{a:'aaa'}], [2,3,'a',{}], false],
[[1,11,111,undefined], [2,3,undefined], false],
[[1,11,111,2,undefined], [2,3,undefined], true],
];
tests.forEach(t => console.log(t[2] === hasCommon(...t)?'OK':'FAIL', JSON.stringify(t)))
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 } */
.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;
}