Было полезно) Спасибо за урок) Убедительная просьба Владилен, если будешь продолжать дальше этот плейлист, то приводи примеры, где используется это на практике, а если не приводишь пример в коде, то хотя бы просто словами "Вот он используется в списке, еще там в том то и том то". Так проще это воспринимать, зачем и куда его пихать
Так это-же аналог yield return из шарпа! Владилен, благодаря тебе, штуки, которые казались сложными и непонятными становятся простыми и приятными в понимании! Ты делаешь обалденные ролики! Спасибо, бро!
удобная штука для создания тестовых данных. например этот код создает массив из случайных 10 чисел от 0 до 1000 function* olala(n){ for (let i = 0; i < n ; i++){ yield ~~(1000*Math.random()); } } var a = [...olala(10)]; console.log(a);
Крутые лекции, очень хорошее и понятое изложение, как новичкам, так и практикующим лишним не будет, однозначно! Хочу внести предложение на темы, web worker, buffer, shadow dom, темы классные, но раскрывают как правило не очень, а для пытливых умов, твой стиль изложения самое то!
Спасибо, не знал о таком способе написания функций, в смысле что где gen(n=10) перед этим нет function ввело в ступор малость:) И насколько помню, ключевая разница от обычной функции с return это экономия памяти, хотя чуть медленнее
Здесь также можно было бы рассказать про LexicalEnviroment и [scope], ибо не сразу было понятно откуда у возвращаемой функции next() доступ к i и n переменным. А в остальном все супер конечно!
Тут абсолютно обо всём надо было бы рассказать - почему генераторы, какие задачи решают, асинхронные генераторы (с примером своей имплементации async / await), for await of и делегация (он даже этого не затронул, хотя это основа генераторов). Это бесполезный урок
про замыкания рассказывалось в 3 уроке, так что откуда доступ у next понятно. А вот как работает let of iterator, не вызывая каждый раз next заново, не понятно
Мне кажется, что лучше объяснять от задачи. И поскольку любая задача решается разными способами, показывать, почему конкретная задача решается оптимальнее, к примеру, с помощью генераторов. Но всё равно лайк )
@@TheSmilewind ага, еще бы просто взять итерируемый объект сделать и выйдет тот же генератор. Только полностью ручками написанный. Конечно понятно, что для упрощения ввели в язык, но можно легко без них обойтись
Спасибо! Не знал о таком. Когда пользовался for of, преобразовывал объект с объектами из return функции. Это намного упростит внешний вид, и не выглядит как костыль
const str = 'Hello my friend, how\'re ur doing?' const str2 = [...str] function* name() { for(let i = 0; i < str2.length; i++){ yield str2[i] } } const str3 = name() можно и так
Ну тут суть в том что, вызывающая сторона (та что функцию вызывает) не имеет контроля над функцией и получается так что функция отработала, вернула результат и все. А с помощью генератора та сторона что вызывает его получает полный контроль над функцией, то есть она может контролировать каждый этап выполнения) Ну крутая же штука )
Что заметил. При создании генератора через function* он выводит значение до крайнего, убирая крайнее. Т.е. например: 1, 2, 3 ... 10 и с переходом на следующий цикл, если например наша n = 11, он говорит undefiend, done: true. С самонаписанным генератором ситуация другая. Он выводит список полностью и уже переходе на следующее значение выдает undefiend, done: false.
Не очень понятно, почему пишем [Symbol.iterator](n=10) {...}. Почему он в квадратных скобках в этом примере? Мы же просто хотим определить его для итерации как функцию в этом примере?
Я так понимаю это про closure (замыкание). Функция `gen()` создаёт приватный контекст внутри себя - переменную `i` и возвращает из себя объект, внутри которого есть функция 'next', которая имеет доступ к этому контексту. Причём доступ к `i` имеет только функция `next`. Добраться к `i` по другому никак нельзя. И суть замыкания в том, что мы вызывали `iterator.gen()` - он вернул нам объект, в приватной видимости которого есть переменная `i`. Эта переменная существует ТОЛЬКО для этого объекта (ближайший слабый аналог - это приватное поле в классе). И переменная `i` сохраняется до тех пор, пока существует сам объект. Вот тут круто про замыкания th-cam.com/video/kizGhzeNE64/w-d-xo.html
Можно ли как в Python сгенерировать например двумерный массив? В Py одной строкой: arr = [0 for j in range(3)] for i in range(3)] Много кода получается. function gen() { let arr1 = []; for (let i = 0; i < 3; i++) { let arr2 = []; for (let j = 0; j < 3; j++) { arr2.push(0); } arr1.push(arr2); } return arr1; } const ar = gen(); console.log(ar);
я понял, как можно усложнить цикл for ещё одним способом. не понял зачем. или это только для того, чтоб вернуть набор объектов из функции и работать с ним в for of? пойду погуглю.
Спасибо за крутые уроки. Вождение вопрос по генераторам. Я правильно понимаю, что список значений они генерируют инициализации. Допустим, я хочу получать из базы последовательно некоторые записи, пока они не закончатся. Генератор в этом случае не получится использовать?
Для пользования некоторыми библиотеками. Redux Saga построена на генераторах к примеру. Это промежуточный слой между Iterator и Async/Await. На медиуме есть статья "Зачем они нужны в JavaScript? Symbol, Iterator, Generator" Там на пальцах описано что есть что и для чего.
Ну тут суть в том что, вызывающая сторона (та что функцию вызывает) не имеет контроля над функцией и получается так что функция отработала, вернула результат и все. А с помощью генератора та сторона что вызывает его получает полный контроль над функцией, то есть она может контролировать каждый этап выполнения) Ну крутая же штука )
@@Fakeusert если они не обязательны то нахрена их ставить, в котлине вот умные, сразу избавились от них, они максимум нужны когда код в чистом виде интерпритируеться в сжатом виде, тогда лучше конечно ставить, а то ошибки будут
Было полезно) Спасибо за урок) Убедительная просьба Владилен, если будешь продолжать дальше этот плейлист, то приводи примеры, где используется это на практике, а если не приводишь пример в коде, то хотя бы просто словами "Вот он используется в списке, еще там в том то и том то". Так проще это воспринимать, зачем и куда его пихать
Всеми любимый async…await использует под капотом генераторы.
@@shamilmammadov8246 Спасибо)
Вы просили генераторы
В этом видео разберем, как они работают)
а про регулярные выражения тоже будут?
и про деплой накст приложения в фаербэйс
Так это-же аналог yield return из шарпа! Владилен, благодаря тебе, штуки, которые казались сложными и непонятными становятся простыми и приятными в понимании! Ты делаешь обалденные ролики! Спасибо, бро!
удобная штука для создания тестовых данных. например этот код создает массив из случайных 10 чисел от 0 до 1000
function* olala(n){
for (let i = 0; i < n ; i++){
yield ~~(1000*Math.random());
}
}
var a = [...olala(10)];
console.log(a);
Можно и обычной функцией
function app(n,arr = []){
while(n > 0){
arr.push(Math.round(Math.random() * 1000));
n--;
}
return arr;
}
console.log(app(10));
@@GeorgyDev11111 можно и так, да
@@КиселевСергей-ъ1о Имхо бесполезная функциональность для вебразработки. Такое чувство, что это придумали специально для кодварсов.
круто! осталось найти, где применить)
В redux-saga например
Лайк за работу.
Владилен, Вы один из немногих, кому можно смело ставить лайк до просмотра.
благодаря вашему видео понял наконец принцип работы генератора. Спасибо Вам!
Крутые лекции, очень хорошее и понятое изложение, как новичкам, так и практикующим лишним не будет, однозначно! Хочу внести предложение на темы, web worker, buffer, shadow dom, темы классные, но раскрывают как правило не очень, а для пытливых умов, твой стиль изложения самое то!
В перерыве между серенами учусь. очень круто обьяснил! Спасибо!
теж
@@boyywnkobe Бежать надо было, походу вас там всех до 16 планируют в окопы отправить.
@@podpalmoi проти чуми такої як ти - залюбки!
Спасибо, не знал о таком способе написания функций, в смысле что где gen(n=10) перед этим нет function ввело в ступор малость:)
И насколько помню, ключевая разница от обычной функции с return это экономия памяти, хотя чуть медленнее
Это равносильно записи
const iter = {
gen: function() {}
}
Обычный упрощенный ES6 синтаксис
Timecodes:
0:04 - Generator
11:14 - for...of
12:35 - [Symbol.iterator]
Единственный человек, который не ставит ";" в конце строки
Здесь также можно было бы рассказать про LexicalEnviroment и [scope], ибо не сразу было понятно откуда у возвращаемой функции next() доступ к i и n переменным. А в остальном все супер конечно!
Тут абсолютно обо всём надо было бы рассказать - почему генераторы, какие задачи решают, асинхронные генераторы (с примером своей имплементации async / await), for await of и делегация (он даже этого не затронул, хотя это основа генераторов). Это бесполезный урок
@@volodymyrdoskochynskyi5032 во во, я про генераторы знал но хотел понять для чего они, какое у них практическое применение, так и не увидел
про замыкания рассказывалось в 3 уроке, так что откуда доступ у next понятно. А вот как работает let of iterator, не вызывая каждый раз next заново, не понятно
Мне кажется, что лучше объяснять от задачи. И поскольку любая задача решается разными способами, показывать, почему конкретная задача решается оптимальнее, к примеру, с помощью генераторов. Но всё равно лайк )
Супер объяснение, мое восхищение 👍 также присоединяюсь к комментам выше, хочется понять где лучше использовать на практике
Красота! Можно будет флексануть знаниями, если будут спрашивать на собеседовании
Для собеседования есть отдельный ролик)
@@VladilenMinin благодарю за ваш труд
без реальных примеров, не особо применишь в деле генераторы.
выглядит просто ненужной безделушкой генератор.
Генератор позволяет пройтись по большому списку не загружая весь список сразу, а лишь по одному элементу за раз.
ага... ещё бы придумать такое место, где без генераторов ну прям совсем не обойтись ))
@@TheSmilewind ага, еще бы просто взять итерируемый объект сделать и выйдет тот же генератор. Только полностью ручками написанный. Конечно понятно, что для упрощения ввели в язык, но можно легко без них обойтись
Babel использует для создания классов :) можно глянуть во что превращается транспилированный код.
@@grommaks Речь шла про генераторы как про синтаксический сахар, а не про Babel. Это транспилятор, итак знают
Спасибо! Не знал о таком. Когда пользовался for of, преобразовывал объект с объектами из return функции. Это намного упростит внешний вид, и не выглядит как костыль
Хорошо что есть видеоролики, а то бывает ничего не понимаешь читая lerarnJavaScript. спасибо!
Спасибо, за урок. Не везде эта тема встречается и хорошо объясняется
Огромное спасибо за Ваши уроки, с Наступающим 2022 годом ! ))))))))))
Спасибо за урок!!!
const str = 'Hello my friend, how\'re ur doing?'
const str2 = [...str]
function* name() {
for(let i = 0; i < str2.length; i++){
yield str2[i]
}
}
const str3 = name()
можно и так
Отличный канал.понятный контент!Спасибо!!!
Владилен, спасибо!!!
Приятного обучения)
js не люблю, но послушать было интересно
четко, подробно и по делу рассказано, примеры тоже понравились, спасибо
Спасибо! Клевые у тебя уроки по javascript.
Ну тут суть в том что, вызывающая сторона (та что функцию вызывает) не имеет контроля над функцией и получается так что функция отработала, вернула результат и все. А с помощью генератора та сторона что вызывает его получает полный контроль над функцией, то есть она может контролировать каждый этап выполнения) Ну крутая же штука )
ты в 2 предложения уместил больше смысла, чем автор в своём 20минутном видео )
Пока не понял как использовать на практике 😒
Ну есть мысль что эт можно для анимации какой-то поэтапной юзать
Наверное можно попробовать асинхронность победить - типа next
Круто, спасибо за урок
cпасибо
Спасибо!
Что заметил. При создании генератора через function* он выводит значение до крайнего, убирая крайнее. Т.е. например: 1, 2, 3 ... 10 и с переходом на следующий цикл, если например наша n = 11, он говорит undefiend, done: true. С самонаписанным генератором ситуация другая. Он выводит список полностью и уже переходе на следующее значение выдает undefiend, done: false.
Может трабл в том, как ты прописываешь цикл for?
@@libertariancom вот это вброс через почти 3 года. Я уже не помню. Да и переехал на другой язык
@@cat_ashere Куда переехал?
@@libertariancom Dart + Flutter
Если нужно крайнее, то вместо return надо писать yield. Но тогда done будет false, и только на следующем next получится {value: undefined, done: true}
Комментарий для продвижения видео!!!
Спасибо за урок!
Все очень доходчиво. Спасибо
Все понятно объяснено!
Не очень понятно, почему пишем [Symbol.iterator](n=10) {...}. Почему он в квадратных скобках в этом примере? Мы же просто хотим определить его для итерации как функцию в этом примере?
Полезно, спасибо!
Про методы массива сделай пожалуйста видео.
Max Shmidt хорошо, следующим видео
@@NextgenSocialReptile Thanks a lot!
@@NextgenSocialReptile Жду с нетерпением. Следующего видео.
а где переменная i храниться если ее нет в объекте с методом next 10:36
Я так понимаю это про closure (замыкание). Функция `gen()` создаёт приватный контекст внутри себя - переменную `i` и возвращает из себя объект, внутри которого есть функция 'next', которая имеет доступ к этому контексту. Причём доступ к `i` имеет только функция `next`. Добраться к `i` по другому никак нельзя. И суть замыкания в том, что мы вызывали `iterator.gen()` - он вернул нам объект, в приватной видимости которого есть переменная `i`. Эта переменная существует ТОЛЬКО для этого объекта (ближайший слабый аналог - это приватное поле в классе). И переменная `i` сохраняется до тех пор, пока существует сам объект. Вот тут круто про замыкания th-cam.com/video/kizGhzeNE64/w-d-xo.html
Для чего нужны генераторы? Где это можно использовать?
Можно ли как в Python сгенерировать например двумерный массив? В Py одной строкой:
arr = [0 for j in range(3)] for i in range(3)]
Много кода получается.
function gen() {
let arr1 = [];
for (let i = 0; i < 3; i++) {
let arr2 = [];
for (let j = 0; j < 3; j++) {
arr2.push(0);
}
arr1.push(arr2);
}
return arr1;
}
const ar = gen();
console.log(ar);
const matrix = Array(3).fill([0, 0, 0])
Здравствуйте, что за тема в vs code? разноцветные фигурные скобки - топ! Хочу такие же)
Darkula
Pair bracket colorizer
спасибо большое за полезный контент =)
я понял, как можно усложнить цикл for ещё одним способом. не понял зачем.
или это только для того, чтоб вернуть набор объектов из функции и работать с ним в for of? пойду погуглю.
Супер
Спасибо! Круто :)
Спасибо за урок🙂
Спасибо за крутые уроки. Вождение вопрос по генераторам.
Я правильно понимаю, что список значений они генерируют инициализации. Допустим, я хочу получать из базы последовательно некоторые записи, пока они не закончатся. Генератор в этом случае не получится использовать?
"Ничего не понял, но очень интересно"©, а если серьёзно - так и не понял где и зачем их использовать, ну кроме redux-saga и то только потому что так написано у них в доках =_=
Спасибо, полезно!
Почему в самодельном гинераторе вывод value начинается с 1? а не с нуля как в оригинале?
++I замените на i++, если нужно с 0
Подскажите пожалуйста как вы сделали такую подсветку ? Я про то, что скобки разных функций и блоков отображаются по разному
Глянь на канале курс по vscode
@@VladilenMinin хорошо. спасибо
Привет спасибо за видеоролики. Хотел спросить будет ли видос про декораторы?
Было полезно. Спасибо
нихера не понял, но было интересно
Как же всё в голове ломается после обычных компилируемых ЯП, когда пытаешься вникнуть в JS
Ощущение, будто мозгу наизнанку выворачиваешь
А на практике где используются генераторы?
Как понимаю, Async/await это генераторы+промисы
Для пользования некоторыми библиотеками. Redux Saga построена на генераторах к примеру. Это промежуточный слой между Iterator и Async/Await. На медиуме есть статья "Зачем они нужны в JavaScript? Symbol, Iterator, Generator" Там на пальцах описано что есть что и для чего.
При итерации большого пула.
Кайф.
*Л. а. й. к.*
Не пойму, почему ты объявляешь константу, если переменная динамична ?
Почему называет константу переменной? То-же интересно. Может дело привычки...
на самом деле let - если будет переопределение переменной
const можно менять массив или объект , но не переопределять переменную
Остался только один вопрос: а нафига нужны генераторы? Даже не могу придумать реальный пример для использования.
Ну тут суть в том что, вызывающая сторона (та что функцию вызывает) не имеет контроля над функцией и получается так что функция отработала, вернула результат и все. А с помощью генератора та сторона что вызывает его получает полный контроль над функцией, то есть она может контролировать каждый этап выполнения) Ну крутая же штука )
@@warm3840 да, в ней есть определённый потенциал, осталось найти применение
не раскрыт функционал генератора когда передавая значения в метод next мы можем внутрь генератора пробросить какое то значение
👍👍👍👍😊
еще одна возможность JS которая будет использована мной примерно никогда :D
Итераторы - асинхронность для тех кто не любит себя?)
Интересно, но пока что как-то бесполезно в практике(
думал что тупой но почитал коменты и понял что не я один не понял нахрена это надо....
+
🙏🏻
Точки с запятыми после выражений ставить нужно.
не обязательно... ES6+ поддерживает и такую запись. НО у меня вопрос, почему вы пишите это профессионалу? если это шутка, то прошу прощения. удачи
@@user-lc3gn8qr5t раздражает их отсутствие.
@@Fakeusert раздражает ваш коммент
@@Fakeusert если они не обязательны то нахрена их ставить, в котлине вот умные, сразу избавились от них, они максимум нужны когда код в чистом виде интерпритируеться в сжатом виде, тогда лучше конечно ставить, а то ошибки будут
Можно ДЗ под каждым видео?
Раньше до async await пользовались генератора и, сейчас генераторы могут быть полезны разве что в php ИМХО
К сожалению не понятно
Достали на самом деле с примерами в которых циферки и буковки
10:13
С таким количеством вложенности тебе надо не программирование преподавать, а курьером работать.
Спасибо!
+
+