Глубокое копирование объекта в JavaScript

Sdílet
Vložit
  • čas přidán 26. 08. 2024
  • Копирование объектов в JavaScript может показаться нетривиальной задачкой. Современные версии языка предлагают нам новый подход к этому вопросу и одна функция structuredClone делает то, что раньше было доступно только с использованием внешних библиотек.
    Мои курсы по вебу с купонами:
    ✅ mishanep.com/
    📢 Поддержка канала:
    / mishanep
    www.tinkoff.ru...
    paypal.me/mish...

Komentáře • 105

  • @nikolaysmolov8031
    @nikolaysmolov8031 Před rokem +7

    Здорово! Не знал про этот метод! Спасибо!

  • @MrKirTer
    @MrKirTer Před rokem +9

    Михаил, спасибо. Адекватно, просто, информативно. И так по всему вашему контенту. 🤘

  • @anonlog
    @anonlog Před rokem +6

    Очень полезно, новый метод клонирования, просто агонь))

  • @Mikjagger1
    @Mikjagger1 Před rokem +5

    Как обычно , круто и полезно! Спасибо, надо ещё!

  • @user-yv4ou3jl8y
    @user-yv4ou3jl8y Před rokem +5

    Как всегда коротко и полезно, спасибо)

  • @AntonioBenderas
    @AntonioBenderas Před rokem +5

    Михаил просто чудотворец. Только вчера учил клонирование и не хватало дип клона и тут хоба

    • @workaccount6372
      @workaccount6372 Před rokem +1

      У меня так тоже было, когда нужно было на проекте забрать кастомные скроллы, и видео Михаила вышло на эту тему чуть ли не в тотрже день (видео про либу overlayScrollbars)

  • @ivanfadeev5389
    @ivanfadeev5389 Před rokem +1

    Не знал об этом! Спасибо! 🔥🔥🔥🔥

  • @EuegenTv
    @EuegenTv Před rokem +9

    В целом понятно, что Lodash - наше всё :D

    • @awenn2015
      @awenn2015 Před rokem

      Либа отменная

    • @user-fv4xc4qp2h
      @user-fv4xc4qp2h Před rokem

      Не ставь лодаш полностью. А ставь конкретно утилиту

    • @Kleo_Wyatt
      @Kleo_Wyatt Před rokem

      Вроде как если исходный объект содержит циклические ссылки, то могут быть ошибки при использовании данного метода

  • @vladtkachenko5095
    @vladtkachenko5095 Před rokem +2

    спасибо за видео! очень полезно, как всегда. И своевременно, тоже как всегда )

  • @boycovclub
    @boycovclub Před rokem +2

    Мощный урок, топчик !

  • @vladimirmuratov2220
    @vladimirmuratov2220 Před rokem +1

    Большое спасибо. Как всегда интересно 🙂

  • @user-fn3qz3ny4w
    @user-fn3qz3ny4w Před rokem +2

    Круто!

  • @Mexanikkmm
    @Mexanikkmm Před rokem +3

    Считаю, что нужно осторожно использовать этот метод, поскольку он поддерживается довольно свежими версиями браузеров. Если есть понимание, что этот продукт будут использовать более старые версии, то может быть проблемой

    • @bebeto123g
      @bebeto123g Před rokem +1

      Думаю полифил из того же lodash уже есть)

  • @bagga_lev
    @bagga_lev Před rokem

    Михаил, спасибо за такое познавательное видео !

  • @curillaenator
    @curillaenator Před rokem +1

    Комментарий в поддержу👍

  • @nardo988
    @nardo988 Před rokem

    Большое спасибо за видео. Было очень полезно!

  • @user-yg8hn4it3c
    @user-yg8hn4it3c Před rokem +5

    Очень полезное видео, спасибо! Интересно, почему во всех мануалах в сети приводятся методы с ..., JSON или object.assign, но не этот

    • @asmal832-hi
      @asmal832-hi Před rokem +1

      Это достаточно новый метод в js.

  • @workaccount6372
    @workaccount6372 Před rokem

    Написать рекурсивную функцию глубокого копирования объектов -- и будет вам счастье)) Михаил, спасибо за видео!

  • @uncle_ara
    @uncle_ara Před rokem

    Спасибо за видео!

  • @tukituk2759
    @tukituk2759 Před rokem

    Спасибо большое!

  • @xman5911
    @xman5911 Před 4 měsíci

    респект

  • @exx-ns4tt
    @exx-ns4tt Před rokem

    не знал, благодарю!

  • @iwannabekoshka
    @iwannabekoshka Před rokem

    Балдежное видео, полезное

  • @RamaRama-qv3jo
    @RamaRama-qv3jo Před rokem

    Михаил, вы упомянули про деструктуризацию и спред оператор для копирования , но она пригодна и для глубокого копирования со вложенностями. Раскройте эту тему тоже.

  • @ertar0
    @ertar0 Před rokem

    спасибо!

  • @tnsaturday
    @tnsaturday Před 2 měsíci

    Крепко обрейтузился

  • @7iomka
    @7iomka Před rokem

    deepmerge из npm берём и будет сказка)

  • @lessons3141
    @lessons3141 Před rokem +3

    Михаил, а что за ИДЕ и используете в видео? интересует как логи видно сразу сбоку без браузера консоли. это расширение в иде?

  • @arti8572
    @arti8572 Před rokem +3

    Подскажи, пожалуйста, что за расширение ты используешь не вызывая терминал, а видя результат вывода в консоль по правую сторону. Заранее благодарю)

    • @aleksprimetv
      @aleksprimetv Před rokem +3

      возможно quokka

    • @mishanep
      @mishanep  Před rokem +7

      Это Quokka. У нее есть ограничения в бесплатной версии, но в моем случае ее хватило.

  • @gtaplayer4145
    @gtaplayer4145 Před 10 měsíci

    StructuredClone некоторыми браузерами не поддерживается. И как мне тогда глубоко копировать, и не применять при этом сторонние библиотеки?

  • @some_body_qtyeeuy
    @some_body_qtyeeuy Před rokem +1

    Круто! А как называется расширение, которое выводит логи прямо в редакторе?

  • @snatvb
    @snatvb Před rokem +3

    это не JS метод, а метод в браузере или другом окружении, в частности описан в спецификации HTML

  • @user-eb5yw9ui6o
    @user-eb5yw9ui6o Před rokem

    большое спасибо за видео!
    было очень полезно!

  • @AlexandruBejenari
    @AlexandruBejenari Před rokem

    thx!!!

  • @sober4you1
    @sober4you1 Před rokem

    Может быть видео про immer js?

  • @grantorino3465
    @grantorino3465 Před rokem

    Что за плагин в vscode использовался для отображения результата?

  • @user-nb7cv5px1v
    @user-nb7cv5px1v Před rokem +1

    Спасибо за ролик. Вопрос, почему все так пытаются избегать _. говоря - не тянуть же библиотеку ради одной функции, но на реальном проекте, скорее всего будет потребность не в одной, а в нескольких функциях из _. Может тогда просто смириться с этим?

    • @mishanep
      @mishanep  Před rokem +4

      Здесь возможны разные сценарии. Я работал и на проектах с lodash, и без него, но с Ramda, и без библиотек хэлперов вовсе. Lodash был мегаактуален, когда нативными средствами языка было сложнее что-то сделать. С развитием языка актуальность внешней библиотеки снижается. Это как с jQuery.
      Лично мне больше нравится Ramda за ее функциональный подход. Она, помимо функционала, делает читабельность кода совсем иной. А если мне нужен просто вызов функции с присвоением результата в переменную и я могу обойтись без библиотеки, то скорее всего я так и сделаю.

    • @andTutin
      @andTutin Před rokem +1

      почему бы и нет, весь лодаш не пойдет в бандл

    • @dzmitrysatsukevich805
      @dzmitrysatsukevich805 Před rokem +4

      Ну у нас на проекте отдельно установлен только isEqual из лодаша, потому что только им пользуемся

    • @yuriyula
      @yuriyula Před rokem +3

      Или просто установить через npm i lodash.clonedeep, и тогда вся библиотека и не потянется)

  • @ashimov1970
    @ashimov1970 Před rokem

    Михаил, большое спасибо за информацию. А есть ли встроенная функция у JS для глубокого сравнения объектов?

  • @yushato
    @yushato Před rokem

    Михаил, подскажите, как называется плагин, который сразу подсказывает что выведет ответ? Впервые увидела на видео, тоже хочу 😊

  • @vladimirmuratov2220
    @vladimirmuratov2220 Před rokem

    Михаил, вопрос не по теме: знакомы ли Вы с Flutter? Очень надеюсь что да... ☺

    • @mishanep
      @mishanep  Před rokem

      Здравствуйте, Владимир. Никогда с ним не работал =)

  • @my_zalizniak
    @my_zalizniak Před rokem

    Как называется расширение, чтоб консоль лог результат в редакторе выводил?)

  • @user-artem-busyhin
    @user-artem-busyhin Před rokem

    ❤‍🔥

  • @dosenk109
    @dosenk109 Před rokem

    Good

  • @The14Some1
    @The14Some1 Před rokem

    А что за плагин показывает результат console log без запуска кода на выполнение? Как это вообще работает без запуска кода?

    • @The14Some1
      @The14Some1 Před rokem

      Полистал внизу. Михаил, вам стоит снять про quokka ролик :)

  • @user-es4yg1nj8y
    @user-es4yg1nj8y Před rokem

    Подскажите, пожалуйста, если копия на методы не распространяется то повлияет вызов метода у копии на оригинальный обьект? Если да то можно ли избежать этого?

    • @mishanep
      @mishanep  Před rokem +1

      Копия на методы не распространяется - обычно обозначается, что у копии не будет методов как таковых. Разве что стандартные методы объекта, но без тех, что могли быть добавлены оригиналу.

    • @user-es4yg1nj8y
      @user-es4yg1nj8y Před rokem

      @@mishanep Спасибо

  • @Oevka
    @Oevka Před rokem

    А как тогда скопировать гетеры, методы и т.д.? Просто johnClone extends john?

    • @mishanep
      @mishanep  Před rokem

      Extends это уже про наследование в классах. Это немного о другом, но да - таким образом методы родительского класса, равно как геттеры/сеттеры, будет наследоваться.

    • @Oevka
      @Oevka Před rokem

      спасибо!

  • @AntonioBenderas
    @AntonioBenderas Před rokem

    А как это консоль выводится прямо в коде?

    • @empatij1730
      @empatij1730 Před rokem +1

      автор в паре комментов ответил - quokka

  • @artemnanavov1552
    @artemnanavov1552 Před rokem

    Можно реальный пример на практике, когда нам пригодиться клонировать объект, теория хорошо, но мне интересно, где это вообще применяется в практике?

    • @nade3282
      @nade3282 Před rokem

      у тебя есть большая форма, для нее можно создать 2 переменные, одна будет для заполнения этой формы, вторая пустая, для последующей очистки формы

    • @asmal832-hi
      @asmal832-hi Před rokem

      Есть функция, которая создаёт новый объект из существующего. Если у существующего большой уровень вложенности, то этот приведёт к проблемам. Т. к. все изменения в существующем объекте будут происходить и в новом.

  • @dimasheiko
    @dimasheiko Před rokem

    structuredClone безусловно крутой метод, но у него пока что очень плохая поддержка браузерами? Только относительно самые свежие. Разве не так?

    • @mishanep
      @mishanep  Před rokem +7

      JS доступен не только в браузерах. Плюс для браузеров существуют полифиллы.
      Я считаю, что неплохо как минимум узнавать про новые возможности, даже если мы не можем начать их использовать в своих проектах с сегодняшнего дня.

    • @dimasheiko
      @dimasheiko Před rokem +2

      @@mishanep Безусловно. Спасибо за ответ!

  • @alexalekseichuk5737
    @alexalekseichuk5737 Před rokem

    Misha, Object.create() sozdaet novyi object, no ne kopiruet, a usaet argument kak prototype. assign i spread-operator kopiruiyt. tak?
    A to ty govorish, sho oni vse tri kopiruiyt.

    • @mishanep
      @mishanep  Před rokem

      Формально копирование - это и есть создание чего-то нового на основе чего-то ранее существовавшего. И так оно во всех случаях.

  • @awenn2015
    @awenn2015 Před rokem

    Вообще странно конечно что в js все присваивания по ссылке идут, этот процесс ведь никак не контролируется через всякие & верно?

    • @mishanep
      @mishanep  Před rokem

      Что вы имеете в виду под всякими & ?

    • @awenn2015
      @awenn2015 Před rokem

      @@mishanep во многих яп это символ передачи переменной по ссылке, например в том же php, если тебе нужно работать с переменной например в функции то можно ее передать по ссылке, иначе она просто копируется в новый участок памяти

    • @mishanep
      @mishanep  Před rokem

      @@awenn2015 нет, такой штуки в JS нет.

    • @awenn2015
      @awenn2015 Před rokem

      @@mishanep ну js это js у него много таких приколюх, даже то что в нем все объекты, что функции что массивы )

  • @demimurych1
    @demimurych1 Před 9 měsíci

    Если Вы претендуете на то, чтобы учить чему-то других людей, то в рамках заявленной задачи в условиях языка JavaScript первое о чем следовало бы сказать, так это о том, что если Вам понадобилось глубокое копирование обьектка, то это означает что Вы делаете что-то не так. То есть задача с которой Вы работаете решается иным образом.
    Бывают исключения, которые касаются системного программирования. Но там, работают со структурами, которые лежат не в Object а в Typed Array где есть соотвествующие методы копирования.
    Решитесь взять на себя ответственность, за то чему Вы учите других.
    Тогда и Вы станете как специалист лучше, и Вам не будет стыдно за тех которых Вы чему то учили

  • @dimon7511
    @dimon7511 Před rokem

    А кто нибудь пробовал написать функцию которая копировалабы обьект на любую вложенность с учетом геттеров, сеттеров, символьных полей, скрытых дескриптором полей, копировала методы, и сохранялабы прототипы для всех внутренних копируемых обьектов ? Ну тоесть чтобы прямо вообще делала полную копию.

    • @hola-ig9gb
      @hola-ig9gb Před rokem

      Если такое будет нужно то прийдёться писать,а так ни разу не пригождалось,так то это не очень сложно.

  • @pvinnie3827
    @pvinnie3827 Před rokem

    все хорошо, но звук как из трубы

  • @paulos_swim
    @paulos_swim Před rokem

    Ну в общем, метод для полного копирования объекта в js всё ещё не подвезли.

  • @elfiesbeats
    @elfiesbeats Před rokem

    lodash.

  • @iGotton
    @iGotton Před rokem

    +

  • @andrew2340
    @andrew2340 Před 3 měsíci

    czcams.com/video/LEGg1F9yErI/video.html - так копирование или глубокое копирование или и то и другое. вы уж определитесь

  • @romanmed9035
    @romanmed9035 Před rokem

    все оно не так глубоко и правильно копирует. мне это практически рабочего места стоило. structuredClone так же не идеальный, как показал автор видео. лодаш в помощь.. странно что нет реально полноценного встроенного механизма.

  • @stasostrin47
    @stasostrin47 Před rokem

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

  • @victormog
    @victormog Před rokem +2

    В корне не правильное сравнение объекта и класса - они похожи только синтаксисом.
    Класс же по сути (в JS) - функция

    • @mishanep
      @mishanep  Před rokem +4

      Я не знаю где вы увидели сравнение объекта и класса. Речь шла о копировании объектов. Инстанс класса - есть объект.

    • @victormog
      @victormog Před rokem +3

      @@mishanep
      По большому счёту, в JS всё объекты...

    • @ulietaight
      @ulietaight Před rokem +2

      @@victormog чушь несёшь

    • @victormog
      @victormog Před rokem +1

      @@ulietaight это лучше, чем в чатах срать...

  • @lesters
    @lesters Před rokem

    я так понимаю полноценного варианта скопировать не существует, все какие то на костылях?