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
// этот код выполнился до конца и, казалось бы, делать больше нечего.
// ...через секунду сработал alertsetTimeout() отрабатывает мгновенно-синхронно - его функция отложить личинку на через-секунду. Представьте, что 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) // trueconst 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;
}