 
  
  const arr1 = [[8, 12], [17, 22]];
  const arr2 = [[5, 11], [14, 18], [20, 23]];
  
  const result = arr1.reduce((acc, range1) => {
    arr2.forEach((range2) => {
      const rangeLength1 = range2[1] - range1[0];
      const rangeLength2 = range1[1] - range2[0];
      
      if(rangeLength1 < rangeLength2) {
        if(rangeLength1 < 0) {
          return;
        }
        
        acc.push([range1[0], range2[1]]);
        return;
      }
      
      if(rangeLength2 < 0) {
        return;
      }
      
      acc.push([range2[0], range1[1]]);
    });
    
    return acc;
  }, []); 
  
  const a = [[8, 12], [17, 22]];
const b = [[5, 11], [14, 18], [20, 23]];
const result = a.reduce((acc, rangeA) => {
  
  return b.reduce((list, rangeB) => {
    if (rangeA[0] >= rangeB[1] || rangeA[1] <= rangeB[0]) {
      return list;
    }
    const from = Math.max(rangeA[0], rangeB[0]);
    const to = Math.min(rangeA[1], rangeB[1]);
    return [...list, [from, to]];
  }, acc);
}, []); 
  
  const updateSquares = (axis, step, max) => {
	clearRect();
  
  const minAxis = `min${axis.toUpperCase()}`;
  const maxValue = max - 12;
  
  squares.forEach((square) => {
  	square[minAxis] = (maxValue + square[minAxis] + step) % maxValue;
  });
  updateRect(squares);
}
function moveRect(event) {
    switch (event.keyCode) {
        // left
        case 37:
            updateSquares('x', -25, WIDTH);
            break
        // up
        case 38:
            updateSquares('y', -25, HEIGHT);
            break
        // right
        case 39:
            updateSquares('x', 25, WIDTH);
            break
        // down
        case 40:
            updateSquares('y', 25, HEIGHT);
            break
        default:
            break
    }
} 
  
  .icon {
    margin-bottom: auto;
}class Div extends Component {
  constructor(props) {
    super(props);
    this.props=props;
  }
  showAlert(value) {
      alert(value);
  }
  render() {
      this.showAlert(1);
    return (
      <div>
      </div>
    );
  }
}class Div extends Component {
  constructor(props) {
    super(props);
    this.props=props;
  }
  showEvent(e) {
      alert(e);
  }
  render() {
      this.showAlert(1);
    return (
      <div>
          <button onClick={this.showEvent}></button>
      </div>
    );
  }
}var self = this - сохранение в переменную.apply - вызов метода с явной передачей контекста.bind(some) - привязка контекста. Говорит функции что использовать в качестве контекста, потом изменить контекст нельзя.()=>{} - стрелочная функция, которая в отличие от function(){} - определяет контекст не в момент вызова, а в момент объявления.// вызов
obj.foo();
// и вызов
const bar =  obj.foo;
bar();
// оба вызывают foo, но во втором случае this внутри foo будет привязан не к obj, 
// а к глобальному объекту(true && false) - false, при логическом "и" вернется true, если оба операнда true(true || false) - true, логическое "или" возвращает true, если хотя бы один операнд truetrue && Boolean(0) - false, Boolean(0) вернет false, т.к. в качестве параметра передан 0.!'String' || false - false, непустая строка при приведении к boolean равна true, !true === false