Immutable. Неизменяемость данных JavaScript

Поделиться
HTML-код
  • Опубликовано: 1 окт 2024
  • Широко применяется во frontend разработке в том или ином виде. Концепция настолько сильна, что просочилась в angular через NGRX. Этот менеджер хранилища часто используется в приложениях с большим количеством данных и сложной логикой обработки этих данных.
    Основной принцип, если нужно что то добавить в объект или массив, то копируй с добавлением. После чего копию нельзя будет изменять.
    В уроке я показал как копировать массив или объект согласно принципу неизменяемости данных.
    презентация docs.google.co...
    JavaScript

Комментарии • 39

  • @ReginaScer
    @ReginaScer 9 месяцев назад +1

    Спасибо, в конце для меня была новая информация. Никогда об этом не задумывалась. Действительно лучше вернуть сразу то, что покороче

  • @VasyaFF
    @VasyaFF Год назад +1

    В коде более разумным кажется был бы метод some, а не filter

    • @grommaks
      @grommaks  Год назад +1

      Использовал фильтр как типичное решение, вариантов больше чем один, спасибо за дополнение

  • @VasyaFF
    @VasyaFF Год назад +1

    Реальный случай, который был у меня. На проекте был (и есть) словарь. Реализован он в translate-сервисе. Есть там список стран: { ru: [ name: 'Россия', description: 'Российская Федерация' ], ...другие страны }
    И вот надо из определённого дропбокса/списка убрать одну из стран. Ну я её убираю от туда. А сам файл-словарь - он же для всего приложения один! И, получилось, что во всём приложении из словаря пропала эта страна. Очень непросто было: 1) выявить эту ошибку; 2) понять + вспомнить как я убирал одну из стран.
    Короче, потом когда удалял или добавлял что-то в словаре, то всего копировал изначальный объект.

    • @grommaks
      @grommaks  Год назад +1

      Такие файлы должны быть под git и тогда видно какие изменения были сделаны
      Без git жизнь гораздо труднее

    • @VasyaFF
      @VasyaFF Год назад +1

      @@grommaks Весь проект естественно в гите. Я говорил о том, что я удалил поле из словаря, который находится в памяти браузера.

    • @grommaks
      @grommaks  Год назад

      @@VasyaFF не правильно сначала понял, хороший пример ошибки с мутацией данных 👍

  • @user_with_params1286
    @user_with_params1286 2 года назад +1

    Может быть я чего-то не понял. Но что это за if (array === newArray) это где так массивы сравнивают?

    • @grommaks
      @grommaks  2 года назад +1

      Массив это объект, так сравнивают ссылки на объекты
      В иммутабельном коде так сравнивают, мемоизированные функции, такие как селекторы в redux / ngrx не пересчитываются если массив остался старым, даже если он мутировал

    • @user_with_params1286
      @user_with_params1286 2 года назад +1

      Спасибо, Максим, за оперативность) Это я так невнимательно смотрю)) действительно, там же ссылка будет идти на один и тот же объект при сравнении.

  • @JustImbaChannel
    @JustImbaChannel 4 года назад +3

    Привет! Расскажи, пожалуйста, о фул стек разработке. То есть стоит ли из фронта переходить в фул стек. Просто я думаю, что происходит распыление. Человек не становится экспертом в какой-то то области, а делает всю работу на "хорошо", а не "отлично". В чем плюшки?)

    • @grommaks
      @grommaks  4 года назад +1

      Интересная тема :) расскажу)

  • @demoncfh
    @demoncfh 10 месяцев назад +1

    я может где-то что-то не понял, но почему a === [...a] выдает false, в чем разница с вашим описанием работы в ролике?

    • @grommaks
      @grommaks  10 месяцев назад

      На какой минуте у меня?
      По описанию должно быть false, так как новый массив создан

    • @demoncfh
      @demoncfh 10 месяцев назад +1

      9-00 , либо я что-то не допонял) @@grommaks

    • @grommaks
      @grommaks  10 месяцев назад

      Там иф, если не нужно добавлять то вернется a без копирования

  • @Eugemka
    @Eugemka 4 года назад +2

    Макс, спасибо. Очень интересно объяснил

  • @askerkotsev363
    @askerkotsev363 4 месяца назад

    structuredClone()

  • @vitaliiiashchuk1534
    @vitaliiiashchuk1534 4 года назад +2

    Я думаю, в проверке на существование элемента логичнее было использовать метод "find" вместо "filter + getLength".

    • @grommaks
      @grommaks  4 года назад

      Совершенно верно :)
      Но стоит помнить, если нет вебпака, то метод find не поддерживается на IE11...это все вордпрес, опенкард и мадженто проекты 😁

    • @RK-gm4pd
      @RK-gm4pd 4 года назад

      @@grommaks тоже не видел ничего подобного
      или фильтр присвоить в переменную, или if внутри фильтр
      смотрится не очень

  • @romanryaboshtan9270
    @romanryaboshtan9270 2 года назад +1

    2:48 Не факт, что мы съедим всю память браузера, там есть сборщик мусора. Immutability используется в основном для безопасного программирования, чтобы другие части проекта не заафектили состояние и это не привело к последствиям

    • @grommaks
      @grommaks  2 года назад

      Если будут 1000 елементов и все будут числа или строки...и мы будем копировать их несколько раз по цепочке, то мы создадим N массивов с этими данными. Сборщик мусора соберет их если ссылка убита, тут да...

  • @Xudojnik_NAG
    @Xudojnik_NAG 10 месяцев назад

    Ничего не понял но очень интересно

  • @dmitriy9152
    @dmitriy9152 2 года назад +1

    Насколько я помню, оператор {...} не делает глубокого копирования, поэтому будет ли так, что свойства emails будут у них одинаковые, у старого и нового объектов?

    • @grommaks
      @grommaks  2 года назад +1

      Спред оператор не делает глубокое копирование, при иммутабельном подходе это именно то что нам нужно, если email не мутирует то мы можем его переиспользовать во всех копиях где email не должен меняться

    • @dmitriy9152
      @dmitriy9152 2 года назад +1

      @@grommaks спасибо! Отличные видео на канале!

  • @russianstan
    @russianstan 4 года назад +1

    Здорово, очень понравилось! Автору большое спасибо) Хотелось бы побольше подобных тем относительно оптимизации и лучших практик

    • @grommaks
      @grommaks  4 года назад +1

      Спасибо за обратную связь 😎 такие тематики мне тоже нравятся, буду чаще такое делать 😁