Чередование атрибутов без значений

Пусть дан заблокированный инпут и кнопка:

html<input id="elem" disabled>
<input id="button" type="submit">

Давайте сделаем так, чтобы каждое нажатие на кнопку приводило к смене состояния инпута - с заблокированного на разблокированное и наоборот. Для начала получим ссылки на наши элементы в переменные:

javascriptlet elem   = document.querySelector('#elem');
let button = document.querySelector('#button');

А теперь реализуем задуманное:

javascriptbutton.addEventListener('click', function() {
  if (elem.disabled) {
    elem.disabled = false;
  } else {
    elem.disabled = true;
  }
});

Задачу, однако, можно решить меньшим количеством кода:

javascriptbutton.addEventListener('click', function() {
  elem.disabled = !elem.disabled;
});
Задание 1

Объясните, как работает приведенный код.

Задание 2

Дан чекбокс и кнопка. Сделайте так, чтобы каждый клик по кнопке приводил к смене состояния чекбокса.