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

  Рет қаралды 22,478

Михаил Непомнящий

Михаил Непомнящий

Күн бұрын

Копирование объектов в JavaScript может показаться нетривиальной задачкой. Современные версии языка предлагают нам новый подход к этому вопросу и одна функция structuredClone делает то, что раньше было доступно только с использованием внешних библиотек.
Мои курсы по вебу с купонами:
✅ mishanep.com/
📢 Поддержка канала:
/ mishanep
www.tinkoff.ru...
paypal.me/mish...

Пікірлер: 105
@MrKirTer
@MrKirTer 2 жыл бұрын
Михаил, спасибо. Адекватно, просто, информативно. И так по всему вашему контенту. 🤘
@nikolaysmolov8031
@nikolaysmolov8031 2 жыл бұрын
Здорово! Не знал про этот метод! Спасибо!
@ДроновАлександр-г3б
@ДроновАлександр-г3б 2 жыл бұрын
😀
@Mikjagger1
@Mikjagger1 2 жыл бұрын
Как обычно , круто и полезно! Спасибо, надо ещё!
@anonlog
@anonlog 2 жыл бұрын
Очень полезно, новый метод клонирования, просто агонь))
@АлексейФиленко-ф4к
@АлексейФиленко-ф4к 2 жыл бұрын
Как всегда коротко и полезно, спасибо)
@ivanfadeev5389
@ivanfadeev5389 2 жыл бұрын
Не знал об этом! Спасибо! 🔥🔥🔥🔥
@vladimirmuratov2220
@vladimirmuratov2220 2 жыл бұрын
Большое спасибо. Как всегда интересно 🙂
@vladtkachenko5095
@vladtkachenko5095 2 жыл бұрын
спасибо за видео! очень полезно, как всегда. И своевременно, тоже как всегда )
@bagga_lev
@bagga_lev 2 жыл бұрын
Михаил, спасибо за такое познавательное видео !
@curillaenator
@curillaenator 2 жыл бұрын
Комментарий в поддержу👍
@nardo988
@nardo988 2 жыл бұрын
Большое спасибо за видео. Было очень полезно!
@uncle_ara
@uncle_ara Жыл бұрын
Спасибо за видео!
@ДроновАлександр-г3б
@ДроновАлександр-г3б 2 жыл бұрын
Круто!
@AntonioBenderas
@AntonioBenderas 2 жыл бұрын
Михаил просто чудотворец. Только вчера учил клонирование и не хватало дип клона и тут хоба
@workaccount6372
@workaccount6372 2 жыл бұрын
У меня так тоже было, когда нужно было на проекте забрать кастомные скроллы, и видео Михаила вышло на эту тему чуть ли не в тотрже день (видео про либу overlayScrollbars)
@tukituk2759
@tukituk2759 Жыл бұрын
Спасибо большое!
@iwannabekoshka
@iwannabekoshka 2 жыл бұрын
Балдежное видео, полезное
@exx-ns4tt
@exx-ns4tt 2 жыл бұрын
не знал, благодарю!
@workaccount6372
@workaccount6372 2 жыл бұрын
Написать рекурсивную функцию глубокого копирования объектов -- и будет вам счастье)) Михаил, спасибо за видео!
@EuegenTv
@EuegenTv 2 жыл бұрын
В целом понятно, что Lodash - наше всё :D
@awenn2015
@awenn2015 2 жыл бұрын
Либа отменная
@КириллМохначевский-о3ю
@КириллМохначевский-о3ю 2 жыл бұрын
Не ставь лодаш полностью. А ставь конкретно утилиту
@Kleo_Wyatt
@Kleo_Wyatt Жыл бұрын
Вроде как если исходный объект содержит циклические ссылки, то могут быть ошибки при использовании данного метода
@ertar0
@ertar0 2 жыл бұрын
спасибо!
@ВладиславСвидерский-г6й
@ВладиславСвидерский-г6й 2 жыл бұрын
большое спасибо за видео! было очень полезно!
@xman5911
@xman5911 9 ай бұрын
респект
@Mexanikkmm
@Mexanikkmm 2 жыл бұрын
Считаю, что нужно осторожно использовать этот метод, поскольку он поддерживается довольно свежими версиями браузеров. Если есть понимание, что этот продукт будут использовать более старые версии, то может быть проблемой
@bebeto123g
@bebeto123g 2 жыл бұрын
Думаю полифил из того же lodash уже есть)
@tnsaturday
@tnsaturday 8 ай бұрын
Крепко обрейтузился
@kot-duott
@kot-duott 2 жыл бұрын
Очень полезное видео, спасибо! Интересно, почему во всех мануалах в сети приводятся методы с ..., JSON или object.assign, но не этот
@asmal832-hi
@asmal832-hi Жыл бұрын
Это достаточно новый метод в js.
@7iomka
@7iomka 2 жыл бұрын
deepmerge из npm берём и будет сказка)
@RamaRama-qv3jo
@RamaRama-qv3jo 2 жыл бұрын
Михаил, вы упомянули про деструктуризацию и спред оператор для копирования , но она пригодна и для глубокого копирования со вложенностями. Раскройте эту тему тоже.
@lessons3141
@lessons3141 2 жыл бұрын
Михаил, а что за ИДЕ и используете в видео? интересует как логи видно сразу сбоку без браузера консоли. это расширение в иде?
@nikitazharinov2329
@nikitazharinov2329 2 жыл бұрын
Quokka расширение для vs code
@philipryazankin1073
@philipryazankin1073 2 жыл бұрын
Думаю это quokka c подпиской
@mishanep
@mishanep 2 жыл бұрын
Это Quokka без всяких подписок =)
@AlexandruBejenari
@AlexandruBejenari 2 жыл бұрын
thx!!!
@ashimov1970
@ashimov1970 Жыл бұрын
Михаил, большое спасибо за информацию. А есть ли встроенная функция у JS для глубокого сравнения объектов?
@mishanep
@mishanep Жыл бұрын
Не встречал.
@some_body_qtyeeuy
@some_body_qtyeeuy 2 жыл бұрын
Круто! А как называется расширение, которое выводит логи прямо в редакторе?
@andreynasuto9734
@andreynasuto9734 2 жыл бұрын
quokka
@sober4you1
@sober4you1 2 жыл бұрын
Может быть видео про immer js?
@arti8572
@arti8572 2 жыл бұрын
Подскажи, пожалуйста, что за расширение ты используешь не вызывая терминал, а видя результат вывода в консоль по правую сторону. Заранее благодарю)
@aleksprimetv
@aleksprimetv 2 жыл бұрын
возможно quokka
@mishanep
@mishanep 2 жыл бұрын
Это Quokka. У нее есть ограничения в бесплатной версии, но в моем случае ее хватило.
@user-artem-busyhin
@user-artem-busyhin 2 жыл бұрын
❤‍🔥
@yushato
@yushato Жыл бұрын
Михаил, подскажите, как называется плагин, который сразу подсказывает что выведет ответ? Впервые увидела на видео, тоже хочу 😊
@mishanep
@mishanep Жыл бұрын
Это quokka
@grantorino3465
@grantorino3465 2 жыл бұрын
Что за плагин в vscode использовался для отображения результата?
@gtaplayer379
@gtaplayer379 Жыл бұрын
StructuredClone некоторыми браузерами не поддерживается. И как мне тогда глубоко копировать, и не применять при этом сторонние библиотеки?
@АндрейПоляков-е5н
@АндрейПоляков-е5н 2 жыл бұрын
Спасибо за ролик. Вопрос, почему все так пытаются избегать _. говоря - не тянуть же библиотеку ради одной функции, но на реальном проекте, скорее всего будет потребность не в одной, а в нескольких функциях из _. Может тогда просто смириться с этим?
@mishanep
@mishanep 2 жыл бұрын
Здесь возможны разные сценарии. Я работал и на проектах с lodash, и без него, но с Ramda, и без библиотек хэлперов вовсе. Lodash был мегаактуален, когда нативными средствами языка было сложнее что-то сделать. С развитием языка актуальность внешней библиотеки снижается. Это как с jQuery. Лично мне больше нравится Ramda за ее функциональный подход. Она, помимо функционала, делает читабельность кода совсем иной. А если мне нужен просто вызов функции с присвоением результата в переменную и я могу обойтись без библиотеки, то скорее всего я так и сделаю.
@andTutin
@andTutin 2 жыл бұрын
почему бы и нет, весь лодаш не пойдет в бандл
@dzmitrysatsukevich805
@dzmitrysatsukevich805 2 жыл бұрын
Ну у нас на проекте отдельно установлен только isEqual из лодаша, потому что только им пользуемся
@yuriyula
@yuriyula 2 жыл бұрын
Или просто установить через npm i lodash.clonedeep, и тогда вся библиотека и не потянется)
@IQ-120
@IQ-120 4 ай бұрын
Ну, окей! А в каких случаях требуется копирование экземпляра? Чтобы так пыжить...? Вот, там была шняга с блобом и чем-то... Нафига ее копировать? Может по старинке - вспомнить про конструктор? Я на с# пишу.. там рефлекшен есть :) а это, прям извращения над функцией...
@vladimirmuratov2220
@vladimirmuratov2220 2 жыл бұрын
Михаил, вопрос не по теме: знакомы ли Вы с Flutter? Очень надеюсь что да... ☺
@mishanep
@mishanep 2 жыл бұрын
Здравствуйте, Владимир. Никогда с ним не работал =)
@ДмитрийРева-щ3ф
@ДмитрийРева-щ3ф Жыл бұрын
Подскажите, пожалуйста, если копия на методы не распространяется то повлияет вызов метода у копии на оригинальный обьект? Если да то можно ли избежать этого?
@mishanep
@mishanep Жыл бұрын
Копия на методы не распространяется - обычно обозначается, что у копии не будет методов как таковых. Разве что стандартные методы объекта, но без тех, что могли быть добавлены оригиналу.
@ДмитрийРева-щ3ф
@ДмитрийРева-щ3ф Жыл бұрын
@@mishanep Спасибо
@dosenk109
@dosenk109 2 жыл бұрын
Good
@my_zalizniak
@my_zalizniak 2 жыл бұрын
Как называется расширение, чтоб консоль лог результат в редакторе выводил?)
@yuriyula
@yuriyula 2 жыл бұрын
quokka
@awenn2015
@awenn2015 2 жыл бұрын
Вообще странно конечно что в js все присваивания по ссылке идут, этот процесс ведь никак не контролируется через всякие & верно?
@mishanep
@mishanep 2 жыл бұрын
Что вы имеете в виду под всякими & ?
@awenn2015
@awenn2015 2 жыл бұрын
@@mishanep во многих яп это символ передачи переменной по ссылке, например в том же php, если тебе нужно работать с переменной например в функции то можно ее передать по ссылке, иначе она просто копируется в новый участок памяти
@mishanep
@mishanep 2 жыл бұрын
@@awenn2015 нет, такой штуки в JS нет.
@awenn2015
@awenn2015 2 жыл бұрын
@@mishanep ну js это js у него много таких приколюх, даже то что в нем все объекты, что функции что массивы )
@hhhhferttuhyrgsa
@hhhhferttuhyrgsa 2 жыл бұрын
Можно реальный пример на практике, когда нам пригодиться клонировать объект, теория хорошо, но мне интересно, где это вообще применяется в практике?
@nade3282
@nade3282 2 жыл бұрын
у тебя есть большая форма, для нее можно создать 2 переменные, одна будет для заполнения этой формы, вторая пустая, для последующей очистки формы
@asmal832-hi
@asmal832-hi Жыл бұрын
Есть функция, которая создаёт новый объект из существующего. Если у существующего большой уровень вложенности, то этот приведёт к проблемам. Т. к. все изменения в существующем объекте будут происходить и в новом.
@dimasheiko
@dimasheiko 2 жыл бұрын
structuredClone безусловно крутой метод, но у него пока что очень плохая поддержка браузерами? Только относительно самые свежие. Разве не так?
@mishanep
@mishanep 2 жыл бұрын
JS доступен не только в браузерах. Плюс для браузеров существуют полифиллы. Я считаю, что неплохо как минимум узнавать про новые возможности, даже если мы не можем начать их использовать в своих проектах с сегодняшнего дня.
@dimasheiko
@dimasheiko 2 жыл бұрын
@@mishanep Безусловно. Спасибо за ответ!
@Oevka
@Oevka 2 жыл бұрын
А как тогда скопировать гетеры, методы и т.д.? Просто johnClone extends john?
@mishanep
@mishanep 2 жыл бұрын
Extends это уже про наследование в классах. Это немного о другом, но да - таким образом методы родительского класса, равно как геттеры/сеттеры, будет наследоваться.
@Oevka
@Oevka 2 жыл бұрын
спасибо!
@alexalekseichuk5737
@alexalekseichuk5737 2 жыл бұрын
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 2 жыл бұрын
Формально копирование - это и есть создание чего-то нового на основе чего-то ранее существовавшего. И так оно во всех случаях.
@The14Some1
@The14Some1 2 жыл бұрын
А что за плагин показывает результат console log без запуска кода на выполнение? Как это вообще работает без запуска кода?
@The14Some1
@The14Some1 2 жыл бұрын
Полистал внизу. Михаил, вам стоит снять про quokka ролик :)
@pvinnie3827
@pvinnie3827 2 жыл бұрын
все хорошо, но звук как из трубы
@asmal832-hi
@asmal832-hi 4 ай бұрын
Забыли сказать, что метод, который клонирует все - очень медленный.
@snatvb
@snatvb 2 жыл бұрын
это не JS метод, а метод в браузере или другом окружении, в частности описан в спецификации HTML
@dimon7511
@dimon7511 2 жыл бұрын
А кто нибудь пробовал написать функцию которая копировалабы обьект на любую вложенность с учетом геттеров, сеттеров, символьных полей, скрытых дескриптором полей, копировала методы, и сохранялабы прототипы для всех внутренних копируемых обьектов ? Ну тоесть чтобы прямо вообще делала полную копию.
@hola-ig9gb
@hola-ig9gb 2 жыл бұрын
Если такое будет нужно то прийдёться писать,а так ни разу не пригождалось,так то это не очень сложно.
@AntonioBenderas
@AntonioBenderas 2 жыл бұрын
А как это консоль выводится прямо в коде?
@empatij1730
@empatij1730 2 жыл бұрын
автор в паре комментов ответил - quokka
@paulos_swim
@paulos_swim 2 жыл бұрын
Ну в общем, метод для полного копирования объекта в js всё ещё не подвезли.
@romanmed9035
@romanmed9035 2 жыл бұрын
все оно не так глубоко и правильно копирует. мне это практически рабочего места стоило. structuredClone так же не идеальный, как показал автор видео. лодаш в помощь.. странно что нет реально полноценного встроенного механизма.
@stasostrin47
@stasostrin47 2 жыл бұрын
Есть полезное, а есть и из разряда - мы не сможем какать через рот, потому что рот не предназначен для того что бы какать... Если надо клонировать класс - у класса должен быть такой метод
@demimurych1
@demimurych1 Жыл бұрын
Если Вы претендуете на то, чтобы учить чему-то других людей, то в рамках заявленной задачи в условиях языка JavaScript первое о чем следовало бы сказать, так это о том, что если Вам понадобилось глубокое копирование обьектка, то это означает что Вы делаете что-то не так. То есть задача с которой Вы работаете решается иным образом. Бывают исключения, которые касаются системного программирования. Но там, работают со структурами, которые лежат не в Object а в Typed Array где есть соотвествующие методы копирования. Решитесь взять на себя ответственность, за то чему Вы учите других. Тогда и Вы станете как специалист лучше, и Вам не будет стыдно за тех которых Вы чему то учили
@andrew2340
@andrew2340 8 ай бұрын
kzbin.info/www/bejne/gnaqmGR8bt54qKs - так копирование или глубокое копирование или и то и другое. вы уж определитесь
@iGotton
@iGotton 2 жыл бұрын
+
@victormog
@victormog 2 жыл бұрын
В корне не правильное сравнение объекта и класса - они похожи только синтаксисом. Класс же по сути (в JS) - функция
@mishanep
@mishanep 2 жыл бұрын
Я не знаю где вы увидели сравнение объекта и класса. Речь шла о копировании объектов. Инстанс класса - есть объект.
@victormog
@victormog 2 жыл бұрын
@@mishanep По большому счёту, в JS всё объекты...
@ulietaight
@ulietaight 2 жыл бұрын
@@victormog чушь несёшь
@victormog
@victormog 2 жыл бұрын
@@ulietaight это лучше, чем в чатах срать...
@lesters
@lesters Жыл бұрын
я так понимаю полноценного варианта скопировать не существует, все какие то на костылях?
Геолокация в браузере для JavaScript приложений
9:59
Михаил Непомнящий
Рет қаралды 5 М.
Как ловить ошибки в JavaScript коде
14:24
Михаил Непомнящий
Рет қаралды 12 М.
Support each other🤝
00:31
ISSEI / いっせい
Рет қаралды 81 МЛН
Quando eu quero Sushi (sem desperdiçar) 🍣
00:26
Los Wagners
Рет қаралды 15 МЛН
How Strong Is Tape?
00:24
Stokes Twins
Рет қаралды 96 МЛН
Чем заменить Axios в 2023-м
17:12
Михаил Непомнящий
Рет қаралды 34 М.
Как скопировать объект в JavaScript? / Поверхностное и глубокое копирование
39:31
Игорь Антонов — про JavaScript и разработку
Рет қаралды 4,2 М.
Расчет временной дистанции в JavaScript
13:58
Михаил Непомнящий
Рет қаралды 8 М.
Что такое рекурсия. Фундаментальный JavaScript
20:32
Михаил Непомнящий
Рет қаралды 25 М.
React Query. Быстрый старт
30:09
Михаил Непомнящий
Рет қаралды 52 М.
Урок 6. JavaScript. Объекты с Object.create. Что такое getters, setters
14:34
Support each other🤝
00:31
ISSEI / いっせい
Рет қаралды 81 МЛН