Есть некоторые неточности и замечания по курсу, а некоторые вещи можно ещё проще рассказать. `` - вот такие обратные кавычки это не просто "литерал", а это "литерал шаблонной строки" или просто "шаблонный литерал", так же как [] - литерал массива (new Array), или {} - литерал объекта (new Object), или /something/ - литерал регулярного выражения (new RegExp('something')) и т.п. Кстати, двойные и ординарные кавычки (вместе со всем что внутри них находится) - это тоже литерал... литерал строки или "строковый литерал". Типы бывают двух основных видов: примитивы (простые типы: строки, числа и т.п.) и комплексные (не простые: объекты, массивы, инстансы классов и т.п.). Примитивы делятся ещё на 2 категории: примитивы, которые ведут себя как объекты (number, string) и самые настоящие простые типы (null, boolean). Про "плюс" и "минус" тоже как-то сложно. Просто плюс может использоваться как арифметический оператор, так и не арифметический (конкатенация), а какое поведение будет выбрано - зависит от типов членов выражения. Объяснение проще: конкатенация строк (не арифметическая операция) может быть выполнена при помощи "плюса", если в выражении есть член с типом String, то будет выполнена конкатенация (в случае если тип не String и не Numer, то будет выполнена опять таки конкатенация, но с предварительной сериализацией значения - записи значения в виде строки). Во всех остальных случаях (деление, вычитание, умножение - чисто арифметические операции) будет выполнена попытка привести к типу Number все члены выражения. Про сравнение с объектом такая же история, как и описана выше - при неявном сравнении со строкой другие значения с типом не String сериализцются. Просто пустой массив сериализуется в пустую строку, а "пустой" объект сериализуется в строку со значением '[object Object]'. Для нагляндости можно поиграться с: String({}) String([]) String([1]) String([1, 2, 3]) Насчёт сравнения a===b, a===c: не совсем, там ничего при приведении не несовпадает. При использовании строгого сравнения (при сравнении двух значений с комплексными типами) сравниваются идентификаторы ссылок. Если идентификаторы совпадают, то true, если не совпадают, то false. При сравнении двух комплексных типов срваниваются не их значения, а ссылки (а точнее идентификаторы ссылок). Можно ощутить разницу поигравшись с: const o = {} o == '[object Object]' // = true // т.к. одно из значений String, то другое, не строковое значение сериализуется o === '[object Object]' // = false // а тут сериализация не происходит, т.к. сравнение строгое [1, 2, 3] === [1, 2, 3] // = false // тут сравниваются 2 разных объекта (мы их создали "на лету") '1,2,3' == [1, 2, 3] // = true // тут происходит сериализация значния справа {} === {} // = false // тут 2 разных объекта, хоть они и имеют одинаковое содержимое o === o // = true // тут сравнение объекта с самим собой Некоторые вещи становятся проще, если их называть на родном для вас языке. Дело в том, что для англоговорящих людей это именно так и происходит, чаще всего они понимают суть какого-то определения/процесса из его названия. Новичкам надо объяснять именно так, как мне кажется, оно так интуитивно понятнее. Например, Скоуп (scope) - область видимости (намного больше объясняет, чем "скоуп"). Хойстинг (hoising) - подъём, а в русском языке это принято называть "всплывание" или "всплытие". Так же намного понятнее, чем "хойстинг", вся суть в названии. Переассаин (reassigning) - переопределение или переназначение. Можно ещё посвятить новичка в разницу между isNaN и Number.isNaN :)
Спасибо! Не совсем, впрочем, понятно тогда такое поведение: {} == {} // = false То есть не происходит сериализации {} в '[object Object]', а сравнение происходит по идентификаторам ссылок?
Спасибо, думал все эти недочеты Владилена вручную искать, так как видео и объяснение крайне скупое, а самое главное не объясняет почему так происходит (а это спрашивают на собесах), типа просто запомните
Ловите таймкоды: 1. Типы данных в JavaScript 04:25 2. Значения и ссылки 25:32 3. Как работает Scope 29:38 4. Что такое Hoisting 33:45 5. Переменные Let const 39:30 6. Замыкания 47:09 7. Что такое IIFE 59:33 8. Контекст 1:03:53 9. Как работает new 1:17:17 10. Как работают прототипы 1:21:25 11. Асинхронность 1:34:38
в асинхронности не хватает несколько важных вещей: таски и микротаски, эвентлуп подробнее, туда же можно промисы, async-await, очень важно для понимания псевдоасихнронности js (что на клиенте, что в nodejs). Очень много ошибок с этим у ребят связано.
Владилен Минин одно другому не мешает, тут же «полное пособие». Понимание работы эвентлупа и асинхронности очень важный аспект js, поэтому и не хватает именно в этом видео. То что отдельно есть - отлично
Ничего нового не узнал, но для повторения это идеально! Всё в одном месте собрано. Круто. А для тех кто только начинает изучать - это видео просто находка!
При приведении типов во время сравнения через == важно помнить 2 вещи которые помогут предсказать результат 1. Представьте что вы приводите все к Number, типа Number(a) == Number(b) 2. Помните что undefined, null, {} и Symbol - это не значения - это типы. По сути по значению тут вообще нечего сравнивать так как значений нет. Вот почему []==false => true Number([]) - 0, Number(false) - 0 Но {}==false => false {} - это тип, тут нет значени, null==false => false null - это тип, тут нет значени, Я не уверне в том насколько это близко к правде, но это помогает запомнить все эти задачи с сравнением
@@nickstojanovic9663 в нормальных конторах прежде идет собеседование, потом уже тестовое. В очень нормальных конторах идет сначала собеседование, потом тестовое, а потом второе собеседование.
@@austinpowers7030 в нормальные конторы должно висеть по 300 апликантов и с каждым из них никто проводить собеседование не будет, первым всегда должен идти тест если контора действительно нормальная
Владилен, считаю, что при объяснении setTimeout в цикле нужно было бы также упомянуть, что при использовании let на каждую итерацию создается абсолютно новая переменная, в то время как переменная, объявленная через var, -- одна на весь цикл, и при каждой итерации изменяется только ее значение, в чем, собственно, и кроется фишка этого примера. А так все очень круто и доступно, спасибо!
9:48 Добавлю от себя об одном очень важном аспекте разницы между null и undefined: в случае, если у функции есть параметр по умолчанию, и вызвать эту функцию, передав значение данного параметра undefined, то будет использован параметр по умолчанию, а если null - тогда null. Например: const fn = (value = 5) => value; console.log(fn(), fn(undefined), fn(null)); // 5 5 null
Владилен, если Вы читаете это - моя огромная благодарность! Я успешно прошёл своё первое техинтервью и получил свою первую работу, главным образом - благодаря урокам из Вашего плейлиста "Сложный JavaScript простым языком". Данное видео также очень помогло повторить изученное.
Контент ОГОНЬ!! Как раз для тех (как я ), кто думал, что изучил JS и пошел на собесы, и его там резко опускают на землю, а этот ролик проясняет очень многие из заданных там вопросов. Автору огромная благодарность!!!
Спасибо огромное! Ваш труд очень помогает! Замечательная подача, нет "воды". Отличное пособие чтобы повторять язык JS в дороге или на выходных в свободные часы.
NaN это действительно number, number не обязан представлять только цифры. NaN это представитель чисел с плавающей запятой, поддерживается на аппаратном уровне, в компьютерах есть специальные процессоры для чисел float и NaN один из возможных его результатов.
Смотрел твой курс по Vue/Nuxt, где ты периодически тихонько матерился в микрофон, когда что-то не получалось. Было ощущение, что просто забыл вырезать)) Всё ждал, будет ли здесь такое)) А в целом - огромное спасибо, отличная подборка!
Спасибо большое, за доступное разъяснение JS!!! Только что RUclips предложил ваши видео, теперь смогу точно разобраться в JS!!! Спасибо большое ещё раз, вы супер!
Как всегда ,Владилен лучший. Очень понятно объясняет, всё по полочкам. Единственное как мне кажется не хватает одной главы про промисы и может быть ещё одной главы про работу с сервером(GET,POST,PUT,DELETE), но это моё субъективное мнение. Спасибо ещё раз за твой контент!
(27:55) ... неточность: в переменной 'b' хранится ссылка на переменную 'a'. Это не совсем верно, что легко проверить, если зададим: 'a = undefined'. Тогда увидим, что: 'a -- undefined' ...... (переменная 'a' утратила ссылку на массив) 'b = [1, 2, 3, 4] ...... (переменная 'b' сохранила ссылку на массив) То есть, обе переменные ссылались на один участок памяти: 'a' --> 'memory_area', 'b' --> 'memory_area'. поэтому, когда переменная 'a' потеряла ссылку на участок памяти ('a = undefined'), переменная 'b' продолжила ссылаться на тот же самый участок памяти независимо от состояния ссылки от переменной 'a'.
Спасибо за уроки. На русском ютубе можно сказать уникальный контент делаешь! Очень надеюсь что не забросишь канал и будет ещё больше роликов. В том числе очень буду ждать по vue 3. Скоро кстати релиз)
на 1:34:05 присваивается переменной proto новое значение. Со старым объектом ничего не происходит (операция присвоения). Чтобы поменять свойство year в proto, надо обновить свойство в объекте на который ссылается переменная proto, а не переопределить значение переменной, т.е. , например, proto.year = 999;
Владилен, спасибо большое за видеоролик. Вчера был на собеседовании, и меня спрашивали буквально по каждой теме из этого ролика. Твой ролик очень мне помог. Очень хороший материал для подготовки к собесу. Обращаюсь к тем, кто будет проходить собесы, помимо этих тем повторите темы с промисами, а также подробнее рассмотрите концепт работы Event Loop
Не соглашусь. Короткие ролики очень удобно воспринимать как раз потому что есть быстрая завершённость. Далеко не всегда хочется иметь дело с длинным потоком новых данных.
@@mikeistp5736 это дело вкуса. Всегда будут те, кому нравится и те кому нет. Много людей записывают короткие ролики, а длинные - нет, поэтому автора видео хочется отдельно поблагодарить. Да и тема же - прохождение интервью, это не подразумевает изучить что-то с нуля, а скорее просто освежить память
Супер, как раз смотрел твои уроки по Ангуляру, дай думаю на ютубе чет гляну, а тут вот на это видео наткнулся да еще и материал интересный и застрял))), спасибо)
Хороший контент, по нему готовлюсь к собесу, в принципе многое знаешь, но иногда не всегда помнишь, что то забывается, что то на автомате делается - важно напомнить себе и проверить свои знания. Большое спасибо тебе
Спасибо за полезный материал, как и во всех ваших видео - четкий, доступный материал, без воды в приятной манере изложения материала, которую легко воспринимать на слух.
Может кому понадобиться. Использование двойных кавычек и одинарных все же отличаются, их можно писать друг в друге, пример: "Java 'Script' ", если использовать одинаковые кавычки, то будет ошибка.
У тебя супер полезный контент и просто талант объяснять всё доходчиво! Я про все концепции, о которых идёт речь в видео, знала, но с удовольствием посмотрела для закрепления и выяснения нюансов. Огромное спасибо за этот труд, ты -- алмаз :)
На счет const не согласен их нельзя изменять в JS, просто когда записать в константу объект или массив там хранится не объект а ссылка на ячейку в памяти которая не меняется, а сам объект мы можем изменять;) В общем видео отличное чтоб быстро вспомнить все перед собеседованием)
Пустой массив при попытке приведения к примитиву конвертируется в строку, с помощью join, по умолчанию там разделитель запятая, но так как массив пустой, то и получаем пустую строку, а пустая строка может преобразоваться к 0
хоть три года работаю на js но всё же полезно иногда "пройтись по корням" :D вспомнил даже несоклько вещей, которые позабыл (т.к. адекватные программисты всегда обходят в своём коде эти джаваскриптовые грабли), но всё же знать о них нужно так что спасибо! ;)
29я минута когда вы объявляете: conat a = [1, 2, 3]; const b = a; то у вас не "два массива", а один. Две переменные хранят в себе одну и туже ссылку в памяти. Ваш ответ бы вызвал доп. вопросы ан любом приличном собеседовании
Какой же Вы крутой, Владилен! Спасибо огромное! После 4 месяцев первой работы как фулстак хочу перейти только на JS(React) и сейчас собираюсь готовиться к собеседованиям, поэтому Ваш урок оч оч оч полезен
Что касается примера let proto = {year: 2019} const myYear = Object.create(proto) proto = { year: 999} myYear.year // 2019 тут все верно, потому что proto после присваивания указывает на {year: 999}, а myYear.__proto__ по-прежнему на {year: 2019}
Ты хотел сказать что мы изменили ссылку на другой объект, но прототипом по прежнему остался объект в памяти до переприсваивания. Возможно раньше был баг и пофиксили.
@@ohhisdudeness на самом деле нет. даже на стронг джуна нужно знать shadow dom, промисы(а мидл должен уметь реализовать), get/set, написать свой bind и так далее. Говорю как человек который прошел 20+ собесов. Меня как джуна очень редко гоняли только по типам данных и var/let/const
@@faust2134 через пару часов собес, смотрю видео и читаю твой комментарий, знаю все, причем на практике, кроме написания своего bind'a (кто в здравом уме, а главное зачем будет этим заниматься?), но загуглил, понял что ничего особо сложного нет, я что уже мидл выходит?)
на 1:34:29 не меняется значение потому что ты создаешь объект myYear на основе старого объекта proto. чтобы заработало нужно перенести создание объекта myYear после переопределения объекта proto
Ну тут немножко неясность по поводу null и undefined... Как мы все знаем undefined в JS используется везде по умолчанию - все что не имеет значения есть undefined. null по сути, означает тоже самое, но если мы попытаемся получить доступ к переменной которая есть где-то там в глубинах кода и которую грязные рученки джуна еще не пытались крутить на кукане с говнокода, то мы получим undefined и будем знать, что эта переменная еще девственная и кроме самого интерпритатора JS ее никто не трогал. Если она вернет null, то мы должны понимать, что кто-то спецом присвоил ей null и менял этот код. Хотя по факту смысл во всем этом один и тот же. Раньше null использовался для обозначения обьектов, которые имеют null-ссылку или присвоения такого значения обьектам (да и сейчас в принципе не плохая практика). Легко проверить - попробуйте взять с DOM несуществующий элемент. Когда мы присваиваем обьекту null,то это означает, что мы приносим в жертву этот обьект, и когда из "преисподней" вылезет GC, он его скушает. Кароч - undefined это тип для самой JS, бобры-программисты всегда используют null везде...
к теме замыканий и использовании let в цикле for (тайминг - 54:30)- посмотрела, как бабель преобразует эту функцию, он вынес setTimeout в функцию loop и в цикле вызывает loop), так что можно и с использованием let починить
Владилен не объяснил (по крайней мере для меня) до конца почему пустой массив равен false. Гугл помог: Когда вы проверяете массив в условном операторе, он возвратит true if([ ]) console.log('true') // true Потому что он приводит объект к boolean: Boolean([]) => true Но! Когда вы сравниваете его с false, то интерпретатор сначала приводит массив к строке, а затем уже к boolean То есть: if([ ] == false) console.log('true?') // true перед тем как сравнить пустом массив с false он сначала преобразуется в строку, которая в свою очередь преобразуется в false [ ] => [ ].toString() // ' ' ' ' => false false === false Надеюсь я правильно все понял и кому то помог)
Отлично раскидал работу оператора new! Прям по пунктам. Только я бы дополнил, что по спецификации new возвращает инициализированный объект только в том случае, если функция вернёт что-то, отличное от объекта. Всё, что кроме - игнорится. Поэтому в этом полифиле лучше сохранить вызов конструктора и проверить его значение перед возвратом. const instance = constructor.apply(obj, args); return (instance && typeof instance === 'object') ? instance : obj;
null возвращает object не потому что это неточность оператора. Это признано багом, который пока что не будут исправлять, так как имеется много зависимостей от этой "фичи"
Эксклюзивный контент на моем Boosty: boosty.to/vladilen
Исходники тут: t.me/js_by_vladilen/131
Есть некоторые неточности и замечания по курсу, а некоторые вещи можно ещё проще рассказать.
`` - вот такие обратные кавычки это не просто "литерал", а это "литерал шаблонной строки" или просто "шаблонный литерал", так же как [] - литерал массива (new Array), или {} - литерал объекта (new Object), или /something/ - литерал регулярного выражения (new RegExp('something')) и т.п.
Кстати, двойные и ординарные кавычки (вместе со всем что внутри них находится) - это тоже литерал... литерал строки или "строковый литерал".
Типы бывают двух основных видов: примитивы (простые типы: строки, числа и т.п.) и комплексные (не простые: объекты, массивы, инстансы классов и т.п.). Примитивы делятся ещё на 2 категории: примитивы, которые ведут себя как объекты (number, string) и самые настоящие простые типы (null, boolean).
Про "плюс" и "минус" тоже как-то сложно. Просто плюс может использоваться как арифметический оператор, так и не арифметический (конкатенация), а какое поведение будет выбрано - зависит от типов членов выражения. Объяснение проще: конкатенация строк (не арифметическая операция) может быть выполнена при помощи "плюса", если в выражении есть член с типом String, то будет выполнена конкатенация (в случае если тип не String и не Numer, то будет выполнена опять таки конкатенация, но с предварительной сериализацией значения - записи значения в виде строки). Во всех остальных случаях (деление, вычитание, умножение - чисто арифметические операции) будет выполнена попытка привести к типу Number все члены выражения.
Про сравнение с объектом такая же история, как и описана выше - при неявном сравнении со строкой другие значения с типом не String сериализцются. Просто пустой массив сериализуется в пустую строку, а "пустой" объект сериализуется в строку со значением '[object Object]'. Для нагляндости можно поиграться с:
String({})
String([])
String([1])
String([1, 2, 3])
Насчёт сравнения a===b, a===c: не совсем, там ничего при приведении не несовпадает. При использовании строгого сравнения (при сравнении двух значений с комплексными типами) сравниваются идентификаторы ссылок. Если идентификаторы совпадают, то true, если не совпадают, то false. При сравнении двух комплексных типов срваниваются не их значения, а ссылки (а точнее идентификаторы ссылок).
Можно ощутить разницу поигравшись с:
const o = {}
o == '[object Object]'
// = true // т.к. одно из значений String, то другое, не строковое значение сериализуется
o === '[object Object]' // = false // а тут сериализация не происходит, т.к. сравнение строгое
[1, 2, 3] === [1, 2, 3] // = false // тут сравниваются 2 разных объекта (мы их создали "на лету")
'1,2,3' == [1, 2, 3] // = true // тут происходит сериализация значния справа
{} === {} // = false // тут 2 разных объекта, хоть они и имеют одинаковое содержимое
o === o // = true // тут сравнение объекта с самим собой
Некоторые вещи становятся проще, если их называть на родном для вас языке. Дело в том, что для англоговорящих людей это именно так и происходит, чаще всего они понимают суть какого-то определения/процесса из его названия. Новичкам надо объяснять именно так, как мне кажется, оно так интуитивно понятнее. Например,
Скоуп (scope) - область видимости (намного больше объясняет, чем "скоуп").
Хойстинг (hoising) - подъём, а в русском языке это принято называть "всплывание" или "всплытие". Так же намного понятнее, чем "хойстинг", вся суть в названии.
Переассаин (reassigning) - переопределение или переназначение.
Можно ещё посвятить новичка в разницу между isNaN и Number.isNaN :)
Дай Б-г тебе здоровья, добрый человек.
Спасибо! Не совсем, впрочем, понятно тогда такое поведение:
{} == {} // = false
То есть не происходит сериализации {} в '[object Object]', а сравнение происходит по идентификаторам ссылок?
@@xxxxrat конечно
Кто ты воин?) У вас есть статьи или что нибудь? С удовольствием бы почитал.
Спасибо, думал все эти недочеты Владилена вручную искать, так как видео и объяснение крайне скупое, а самое главное не объясняет почему так происходит (а это спрашивают на собесах), типа просто запомните
Спустя уже почти 4 года видео все еще актуально и все еще проясняет очень многое. Спасибо огромное Владилен, за ваши старания в нашу пользу.
Но актуальность стоит проверять перед собесом, например типов уже 8, bigInt не хватает
2:35 Типи
10:30 Приведение типов
25:28 Значения
29:40 Область видимости
33:42 Поднятие
37:24 Объявление функций
39:28 let и const
47:10 Замыкание
59:39 IIFE
1:03:54 Контекст
1:17:16 New
1:21:30 Прототипы
1:34:38 Асинхронность
Ловите таймкоды:
1. Типы данных в JavaScript 04:25
2. Значения и ссылки 25:32
3. Как работает Scope 29:38
4. Что такое Hoisting 33:45
5. Переменные Let const 39:30
6. Замыкания 47:09
7. Что такое IIFE 59:33
8. Контекст 1:03:53
9. Как работает new 1:17:17
10. Как работают прототипы 1:21:25
11. Асинхронность 1:34:38
Владилен расскажи по NodЕ req/res и т.д. нигде толком ничего нет
У меня на канале есть нода за час. Там и проясняю
в асинхронности не хватает несколько важных вещей: таски и микротаски, эвентлуп подробнее, туда же можно промисы, async-await, очень важно для понимания псевдоасихнронности js (что на клиенте, что в nodejs). Очень много ошибок с этим у ребят связано.
@@inemiro На канале есть более подробные видео по этим темам
Владилен Минин одно другому не мешает, тут же «полное пособие». Понимание работы эвентлупа и асинхронности очень важный аспект js, поэтому и не хватает именно в этом видео. То что отдельно есть - отлично
Ничего нового не узнал, но для повторения это идеально! Всё в одном месте собрано. Круто. А для тех кто только начинает изучать - это видео просто находка!
При приведении типов во время сравнения через == важно помнить 2 вещи которые помогут предсказать результат
1. Представьте что вы приводите все к Number, типа Number(a) == Number(b)
2. Помните что undefined, null, {} и Symbol - это не значения - это типы. По сути по значению тут вообще нечего сравнивать так как значений нет.
Вот почему
[]==false => true Number([]) - 0, Number(false) - 0
Но
{}==false => false {} - это тип, тут нет значени,
null==false => false null - это тип, тут нет значени,
Я не уверне в том насколько это близко к правде, но это помогает запомнить все эти задачи с сравнением
Ты в моём личном топе, напару с диманом из ИТ камасутры. Респект вам за годный контент.
@Metal Head Откуда такая агрессия? Тебя недолюбили?
@@MakcoH1998 скорее перелюбили, во все щели
Вот прям +
Сенсея называть бы с большой буквы)
+++
"Js за час" здорового человека)
Этого не хватит
@@ЕвгенийПанкратов-г5ь Если ты сделал тестовое задание хорошо, то 70 процентов вопросов на собеседовании скорее всего отвалятся
@@nickstojanovic9663 в нормальных конторах прежде идет собеседование, потом уже тестовое. В очень нормальных конторах идет сначала собеседование, потом тестовое, а потом второе собеседование.
@@austinpowers7030 я говорил о собственном опыте, рассматривая исключительно удаленку. Но спасибо за дополнение.
@@austinpowers7030 в нормальные конторы должно висеть по 300 апликантов и с каждым из них никто проводить собеседование не будет, первым всегда должен идти тест если контора действительно нормальная
Владилен, считаю, что при объяснении setTimeout в цикле нужно было бы также упомянуть, что при использовании let на каждую итерацию создается абсолютно новая переменная, в то время как переменная, объявленная через var, -- одна на весь цикл, и при каждой итерации изменяется только ее значение, в чем, собственно, и кроется фишка этого примера. А так все очень круто и доступно, спасибо!
Автору видео желаю удачу и чтоб у него все исполнялось, ведь просто так выпускать видео и такие хорошие не все могут
как же приятно слушать) Все ясно, просто, хорошие примеры, без воды, в комфортном темпе. Спасибо за уроки!
Вот только varyable произносится немного по другому
Чувак, ты находка в русском ютубе
9:48 Добавлю от себя об одном очень важном аспекте разницы между null и undefined: в случае, если у функции есть параметр по умолчанию, и вызвать эту функцию, передав значение данного параметра undefined, то будет использован параметр по умолчанию, а если null - тогда null. Например:
const fn = (value = 5) => value;
console.log(fn(), fn(undefined), fn(null)); // 5 5 null
1:04:04 Что такое контекст? "Я в уме - ну это тоже самое что и scope".
Владилен: Зачастую контекст часто путают с таким понятием как scope..
лол))
аналогично
Привет, сделай список топовых вопросов на собеседовании, а также ответов на них. Это будет очень круто.
Владилен, если Вы читаете это - моя огромная благодарность! Я успешно прошёл своё первое техинтервью и получил свою первую работу, главным образом - благодаря урокам из Вашего плейлиста "Сложный JavaScript простым языком". Данное видео также очень помогло повторить изученное.
Привет) Поздарвяю тебя, так держать!) Если не секрет, сколько у тебя заняло обучение, и насколько трудные были вопросы на интервью?
Контент ОГОНЬ!! Как раз для тех (как я ), кто думал, что изучил JS и пошел на собесы, и его там резко опускают на землю, а этот ролик проясняет очень многие из заданных там вопросов. Автору огромная благодарность!!!
Я очень сильно тебя благодарю за такую возможность подойти ближе к собеседованию!))
В JavaScript есть 8 основных типов данных.
null,
undifined,
boolean,
number,
string,
symbol
object
bigint. ( для целых чисел произвольной длины. )
На вопрос:
Какие типы данных существуют в js (Стандарт языка ES6)
Мне чатгпт ответил:
boolean, string, number, undefined, null, symbol😅
Супер подача. Без воды, кратко, хорошие примеры. Спасибо за ваши уроки и курсы!
Спасибо огромное! Ваш труд очень помогает! Замечательная подача, нет "воды". Отличное пособие чтобы повторять язык JS в дороге или на выходных в свободные часы.
NaN это действительно number, number не обязан представлять только цифры. NaN это представитель чисел с плавающей запятой, поддерживается на аппаратном уровне, в компьютерах есть специальные процессоры для чисел float и NaN один из возможных его результатов.
С вами я сильно продвинул свой скилл по js . Большое вам спасибо за столь полезный контент.
Смотрел твой курс по Vue/Nuxt, где ты периодически тихонько матерился в микрофон, когда что-то не получалось. Было ощущение, что просто забыл вырезать)) Всё ждал, будет ли здесь такое)) А в целом - огромное спасибо, отличная подборка!
Спасибо большое! Один из лучших русскоязычных каналов по теме на ютубе
очень познавательный канал и автор объясняет все очень простыми и понятными словами. Даже на 1.5х все очень понятно
Владилен, всё с толком объясняет. Понятно и доходчего. Спасибо за нелёгкий труд. 💪
Спасибо большое, за доступное разъяснение JS!!! Только что RUclips предложил ваши видео, теперь смогу точно разобраться в JS!!! Спасибо большое ещё раз, вы супер!
Прошла уже собес?
Как всегда ,Владилен лучший. Очень понятно объясняет, всё по полочкам. Единственное как мне кажется не хватает одной главы про промисы и может быть ещё одной главы про работу с сервером(GET,POST,PUT,DELETE), но это моё субъективное мнение. Спасибо ещё раз за твой контент!
Очередное собеседование и я здесь) Спасибо, Владилен!
Прекрасная подача материала! Получил большое удовольствие от просмотра. Благодарю. :)
01:34:23 всё логично - здесь Вы меняете значение локальной ссылки на прототип, а не сам прототип.
Владилен, спасибо огромное за твой труд.
Да прибудет с тобой сила Владилен)Спасибо)
(27:55) ... неточность:
в переменной 'b' хранится ссылка на переменную 'a'.
Это не совсем верно, что легко проверить, если зададим:
'a = undefined'.
Тогда увидим, что:
'a -- undefined' ...... (переменная 'a' утратила ссылку на массив)
'b = [1, 2, 3, 4] ...... (переменная 'b' сохранила ссылку на массив)
То есть, обе переменные ссылались на один участок памяти:
'a' --> 'memory_area',
'b' --> 'memory_area'.
поэтому, когда переменная 'a' потеряла ссылку на участок памяти ('a = undefined'), переменная 'b' продолжила ссылаться на тот же самый участок памяти независимо от состояния ссылки от переменной 'a'.
Спасибо за уроки. На русском ютубе можно сказать уникальный контент делаешь! Очень надеюсь что не забросишь канал и будет ещё больше роликов. В том числе очень буду ждать по vue 3. Скоро кстати релиз)
Не забросил)
Большое спасибо за краткий и практически полезный разбор JS на примерах. Случайно к Вам попал, но это именно то, что надо :)
Очень полезно,чтобы освежить знания и что-то вспомнить.Спасибо,Владилен!
Отличное объяснение тем. Особенно понравилось объяснение замыкания, c этим всегда были проблемы. Большое спасибо за труд.
Владлен! Спасибо за твой труд! То, что ты делаешь мне очень нравится и помогает!
на 1:34:05 присваивается переменной proto новое значение. Со старым объектом ничего не происходит (операция присвоения). Чтобы поменять свойство year в proto, надо обновить свойство в объекте на который ссылается переменная proto, а не переопределить значение переменной, т.е. , например, proto.year = 999;
Вселенское Вам спасибо! Очень все чётко изложено )
Я нубас полнейший!) Как же черт возьми круто! Владилен, огромное человеческое спасибо! Топ контент!
Владилен, спасибо большое за видеоролик. Вчера был на собеседовании, и меня спрашивали буквально по каждой теме из этого ролика. Твой ролик очень мне помог. Очень хороший материал для подготовки к собесу. Обращаюсь к тем, кто будет проходить собесы, помимо этих тем повторите темы с промисами, а также подробнее рассмотрите концепт работы Event Loop
Про ивентлуп на канале отдельный ролик
Спасибо, что делаешь длинные ролики, а не огромное кол-во 5/10-минутных. Проще посмотреть 1 видео, чем 10 :) и тема очень актуальная
Не соглашусь. Короткие ролики очень удобно воспринимать как раз потому что есть быстрая завершённость. Далеко не всегда хочется иметь дело с длинным потоком новых данных.
@@mikeistp5736 это дело вкуса. Всегда будут те, кому нравится и те кому нет. Много людей записывают короткие ролики, а длинные - нет, поэтому автора видео хочется отдельно поблагодарить. Да и тема же - прохождение интервью, это не подразумевает изучить что-то с нуля, а скорее просто освежить память
@@mikeistp5736 Я пояснял в телеграм почему буду стараться делать ролики длинными на ютубе. Все из-за его алгоритмов
Спасибо, Владилен! Очень много классного контента на твоем канале. Простыми словами о сложном!!!
Спасибо большое за крутую собранную информацию, дай бог пройду успешно свое собеседование после данного ролика
Один из сильнейших веб-прогеров на ютубе на сегодняшний день. Спасибо за изобтлие годноты!
Супер, как раз смотрел твои уроки по Ангуляру, дай думаю на ютубе чет гляну, а тут вот на это видео наткнулся да еще и материал интересный и застрял))), спасибо)
Хороший контент, по нему готовлюсь к собесу, в принципе многое знаешь, но иногда не всегда помнишь, что то забывается, что то на автомате делается - важно напомнить себе и проверить свои знания. Большое спасибо тебе
Сколько же раз нужно нажать 'run' из контекстного меню шторма, чтобы запомнить уже хоткей))
Все четко, по факту, проффесионально, без воды, смотрел не отрываясь!
Большое спасибо за такие уроки, все понятно и становится по своим полочкам в голове.
Супер видео! Низкий поклон и поддержка!
Спасибо! Как всегда кратко и по сути. Ждем еще
Владилен ты красавчик, такой крутой и длинный ролик снял. :)
Спасибо, все это очень полезно, освежил знания по Js за полтора часа!
Мужик, добра тебе, очень информативно и понятно)
Спасибо за видос, что-то освежил в памяти, что-то узнал новое.
Спасибо за полезный материал, как и во всех ваших видео - четкий, доступный материал, без воды в приятной манере изложения материала, которую легко воспринимать на слух.
Спасибо большое за полезную видео, ждем новых!
Блен, какой же офигенно качественный материал на твоем канале :)
Благодарю, стараюсь)
Может кому понадобиться.
Использование двойных кавычек и одинарных все же отличаются, их можно писать друг в друге, пример: "Java 'Script' ", если использовать одинаковые кавычки, то будет ошибка.
У тебя супер полезный контент и просто талант объяснять всё доходчиво!
Я про все концепции, о которых идёт речь в видео, знала, но с удовольствием посмотрела для закрепления и выяснения нюансов.
Огромное спасибо за этот труд, ты -- алмаз :)
А ты изумруд))!!
Владилен, очень помогло твое видео при подготовке к собеседованию. Спасибо :)
На счет const не согласен их нельзя изменять в JS, просто когда записать в константу объект или массив там хранится не объект а ссылка на ячейку в памяти которая не меняется, а сам объект мы можем изменять;)
В общем видео отличное чтоб быстро вспомнить все перед собеседованием)
Про типы данных не хватает объяснения, почему так странно работает сравнение с пустым массивом или объектом.
Пустой массив при попытке приведения к примитиву конвертируется в строку, с помощью join, по умолчанию там разделитель запятая, но так как массив пустой, то и получаем пустую строку, а пустая строка может преобразоваться к 0
Спасибо огромное! Очень, очень вовремя:)
Крут! Учусь сейчас на курсах и нам дали тестовые вопросы для тестового собеса - ты осветил процентов 80!
Спасибо, все очень понятно. Хорошо посмотреть, что бы все вспомнить
четкое видео ! я пришел с java/c# в js и как раз данное видео именно то, что нужно чтобы войти в курс дела
величезна подяка за інформативність! 🐱👤🙌
Спасибо то что делитесь знаниями.
Очень много полезного материала, спасибо!
хоть три года работаю на js но всё же полезно иногда "пройтись по корням" :D вспомнил даже несоклько вещей, которые позабыл (т.к. адекватные программисты всегда обходят в своём коде эти джаваскриптовые грабли), но всё же знать о них нужно
так что спасибо! ;)
Шикарное объяснение замыканий. Спасибо
Спасибо большое за столь полезный контент!
29я минута когда вы объявляете:
conat a = [1, 2, 3];
const b = a;
то у вас не "два массива", а один. Две переменные хранят в себе одну и туже ссылку в памяти. Ваш ответ бы вызвал доп. вопросы ан любом приличном собеседовании
sposibo ogromnoe ! kupil vash kurs po Excel ochen nravitsya no i slojno esli chestno !!
Какой же Вы крутой, Владилен! Спасибо огромное! После 4 месяцев первой работы как фулстак хочу перейти только на JS(React) и сейчас собираюсь готовиться к собеседованиям, поэтому Ваш урок оч оч оч полезен
А на бэке какой язык был?
Круто! Очень круто! Можно еще добавить про методы массивов, это частенько спрашивают на собесах
Спасибо большое, Каждое видео в котором есть польза я награждаю лайком, Твои видео все полезные)
Стал уже разработчиком?
Спасибо, полезно повторить концептуальную информацию!!
Что касается примера
let proto = {year: 2019}
const myYear = Object.create(proto)
proto = { year: 999}
myYear.year // 2019
тут все верно, потому что proto после присваивания указывает на {year: 999}, а myYear.__proto__ по-прежнему на {year: 2019}
Да, согласен, но на сколько я помню в ранних версиях JS было иначе
@@VladilenMinin в ранних версиях js и индексы у объекта были
Ты хотел сказать что мы изменили ссылку на другой объект, но прототипом по прежнему остался объект в памяти до переприсваивания. Возможно раньше был баг и пофиксили.
Владилен, ты - боженька!:)
лучший видос для подготовки к собесу! спасибо!
Нужно видео по более сложным собеседованиям на уровень middle/senior
Вопросы одни и те же чаще всего
@@ohhisdudeness на самом деле нет. даже на стронг джуна нужно знать shadow dom, промисы(а мидл должен уметь реализовать), get/set, написать свой bind и так далее. Говорю как человек который прошел 20+ собесов. Меня как джуна очень редко гоняли только по типам данных и var/let/const
@@faust2134 через пару часов собес, смотрю видео и читаю твой комментарий, знаю все, причем на практике, кроме написания своего bind'a (кто в здравом уме, а главное зачем будет этим заниматься?), но загуглил, понял что ничего особо сложного нет, я что уже мидл выходит?)
@@austinpowers7030 нет
@@faust2134 так после скольких собесов устроился?)
отлично расписано, всё чётко, всё необходимое
Отличный урок, никакой воды! Спасибо!
Спасибо автор! Держи подписку) Все в понятной и доступной форме
Спасибо, Владилен! Очень познавательно и не нужно тратить время на книгу.
Спасибо Владилен! Можно в следующих выпусках масштабировать экран покрупнее, пожалуйста!
на 1:34:29 не меняется значение потому что ты создаешь объект myYear на основе старого объекта proto. чтобы заработало нужно перенести создание объекта myYear после переопределения объекта proto
Ну тут немножко неясность по поводу null и undefined... Как мы все знаем undefined в JS используется везде по умолчанию - все что не имеет значения есть undefined. null по сути, означает тоже самое, но если мы попытаемся получить доступ к переменной которая есть где-то там в глубинах кода и которую грязные рученки джуна еще не пытались крутить на кукане с говнокода, то мы получим undefined и будем знать, что эта переменная еще девственная и кроме самого интерпритатора JS ее никто не трогал. Если она вернет null, то мы должны понимать, что кто-то спецом присвоил ей null и менял этот код. Хотя по факту смысл во всем этом один и тот же. Раньше null использовался для обозначения обьектов, которые имеют null-ссылку или присвоения такого значения обьектам (да и сейчас в принципе не плохая практика). Легко проверить - попробуйте взять с DOM несуществующий элемент. Когда мы присваиваем обьекту null,то это означает, что мы приносим в жертву этот обьект, и когда из "преисподней" вылезет GC, он его скушает. Кароч - undefined это тип для самой JS, бобры-программисты всегда используют null везде...
к теме замыканий и использовании let в цикле for (тайминг - 54:30)- посмотрела, как бабель преобразует эту функцию, он вынес setTimeout в функцию loop и в цикле вызывает loop), так что можно и с использованием let починить
Реально самый крутой гайдер по программированию, и слушать приятно
Владилен не объяснил (по крайней мере для меня) до конца почему пустой массив равен false. Гугл помог:
Когда вы проверяете массив в условном операторе, он возвратит true
if([ ]) console.log('true') // true
Потому что он приводит объект к boolean: Boolean([]) => true
Но! Когда вы сравниваете его с false, то интерпретатор сначала приводит массив к строке, а затем уже к boolean
То есть:
if([ ] == false) console.log('true?') // true
перед тем как сравнить пустом массив с false он сначала преобразуется в строку, которая в свою очередь преобразуется в false
[ ] => [ ].toString() // ' '
' ' => false
false === false
Надеюсь я правильно все понял и кому то помог)
Отлично раскидал работу оператора new! Прям по пунктам. Только я бы дополнил, что по спецификации new возвращает инициализированный объект только в том случае, если функция вернёт что-то, отличное от объекта. Всё, что кроме - игнорится. Поэтому в этом полифиле лучше сохранить вызов конструктора и проверить его значение перед возвратом.
const instance = constructor.apply(obj, args);
return (instance && typeof instance === 'object') ? instance : obj;
null возвращает object не потому что это неточность оператора. Это признано багом, который пока что не будут исправлять, так как имеется много зависимостей от этой "фичи"