Рука-лицо... Учи матчасть внимательней. Я зачем уроки сюда с FreeCodeCamp импортировал? Устанавливаем новое значение. Восклицательный знак в начале - это отрицание Не. То есть если this.state?.done === true, то Не будет false. Иначе (то есть false, null, undefined, 0, '' и т.п.) будет приведено к логическому true. ?. здесь примеряется для предотвращения ошибки на случай если объект this.state отсутствует. Устанавливаем значение в стейт. А наш вариант это просто сокращенная форма без использования дополнительной переменной newValue.

  1. ?? this.state.done здесь вероятнее всего не имеет никакого смысла, то есть можно безболезненно удалить. Да без него тоже работает. done: !this.state?.done Смысл работы этой конструкции вообще не понимаю, как и почему она работает( И вообще теперь не понимаю почему и эта конструкция работает done: !this.state.done вроде нет никаких условий и все работает прям магия:)

В моем же варианте получается возьми или это или другое , другое или это. Твой вариант - это усложненный мой К тому же, как я и сказал, если не будет объекта this.state, то будет ошибка. А это совсем не исключено, не всегда классовые компоненты объявляют с инициализацией стейта.

Мне кажется самая понятная конструкция получилась. Это самая неправильная конструкция :) Точнее, она будет работать, но: 1. Если не будет объекта this.state, то будет ошибка (вспоминаем про ?.). 2. ?? this.state.done здесь вероятнее всего не имеет никакого смысла, то есть можно безболезненно удалить.

Нет, в первом варианте не в скобках дело, а в раскладке (на цифре 7 висят и & и ?). То есть должно быть не done: !(this.state ?? this.state.done), done: !(this.state && this.state.done)

В первом варианте убрал скобки, со скобками не работает: Получилось так: Мне кажется самая понятная конструкция получилась. Через опциональную цепочку пока не догоняю почему он работает. А в третьем варианте слишком сложная конструкция получается логическое И плюс тернарник. В моем же варианте получается возьми или это или другое , другое или это. Правильно вообще написал и понимаю эту конструкцию?)

Второй вариант не подгрузился. Я даже не знал, что есть такое - Опциональная цепочка '?.' думал странный, какой-то тернарник)

Здесь нет тернарного выражения, то есть это не "если ? то : иначе". Это сокращенная форма записи на случай если нет объекта. То есть если ты запишешь так: this.state.done, а объекта this.state нету, то ты получишь ошибку и твой код развалится. В классическом варианте ты должен записать this.state && this.state.done Здесь же мы указываем знак вопроса, чтобы бабель за нас создал необходимые проверки. То есть мы пишем this.state?.done, указывая, что мы обращаемся к свойству done объекта this.state, но надо проверить если ли этот объект. Подробнее читай здесь: https://learn.javascript.ru/optional-chaining В твоем случае при с классическим синтаксисом пришлось бы писать так: Или так: