Блин, соер, брат, ты крут. Как же я рад что давно наткнулся на тебя. Очень радуюсь каждому новому видосу так как знаю что контент всегда топовый. Спасибище тебе за работу
Чтобы говорить про полиморфизм в JavaScript нужно обязательно вспомнить про скрытые классы и форму объектов. По дженерикам - нужно бы копнуть обобщенное программирование и работы Степанова (автора STL)
@@S0ERDEVS ну потому, что на вход в функцию могут приходить утино-типизированные объекты, разной формы, но реализующие один и тот же интерфейс. Если форма одна - то код мономорфный, в байткоде не нужно проверять типы и делать условное приведение к нужным типам, если форм до 4 то создаются скрытые функции-дженерики, т.е. код один, а байткода несколько вариантов в зависимости от формы входных объектов, ну и если больше, то мегаморфная реализация, см. статьи Вячеслава Егорова (на хабре даже есть перевод одной из них про мономорфизм вот прямо).
А обобщенное программирование - это нечто большее, все же, чем просто синтаксис дженериков, это идея полиморфного кода, одинакового с точностью до типов. Для JS это более чем актуально.
@Timur Shemsedinov что-то тебя не туда понесло. Ты сейчас говоришь про оптимизацию производительности JS с использование мономорфного, полиморфного и мегаморфного кэша. Причем для этого используется понятие "формы", которая по сути является слепком данных, а не типом. И это не "утино-типизированные объекты", это любые объекты с разной реализацией, которые могут принадлежать к одному и тому же типу (классу). В данном случае понятие формы вообще никак не связано с полиморфным поведением кода. А связано с моноформами, т.е. с объектами с одинаковым составом полей и их значениями. Ну и в контексте JS фраза "одинакового с точностью до типов" бессмысленна, ты же сам сослался на то, что данные в JS определяются формами, а не типами. А форма - это не тип, это конкретная реализация типа с конкретными значениями. Это как раз поведение на основе реализации.
В JS можно реализовать функцию, которая не будет требовать приведения типов аргументов и будет всегда возвращать результат одного типа function(...args) { return [...args]; } Означает ли это, что параметрический полиморфизм в JS таки есть?
Темплейты C++ это чистый параметрический полиморфизм? Насколько я понимаю, то там на моменте компиляции создаются разные функции под разные типы и подменяются на конкретные внутри кода. И как дела обстоят у generic-ов в Rust-е? Там вроде алгебраичная система, то есть должно быть все "ровно", но на практике не уверен
для выведения типов, это один из мощнейших способов достижения типобезопасности и по сути "бесплатная верификация". В JS программист должен взять на себя обязанность по контролю типов (интерфейсов) чтобы программа не падала в рантайме. На практике понимание полиморфизма помогает правильно сделать утиную типизацию.
А можно ссылки на материалы на счет того, почему дженерики это не параметрический полиморфизм, хочу понять в чем разница. Спасибо! Я так понимаю, для поддержки честного параметрического полиморфизма нужны классы типов (не помню точно как называется) как в хаскеле?
А прототипное наследование, где можно переопределять методы потомков в цепочке прототипов и если функция будет принимать разные объекты и дёргать у них например метод, то будет вызываться либо переопределённый метод, либо браться выше в цепочке прототипов, это разве не полиморфизм подтипов?
*Servant573* Согласен с предыдущим оратором. Если Вы посмотрели это видео тогда уже ничего не поделаешь Вам придется с этим как-то жить. Обычно для большего количества просмотров авторы забывают сказать для кого предназначено их видео, или думают зачем говорить и так всё понятно. 🙂 В итоге начинающие и не очень начинающие разработчики прочли в названии javascript, подумали о тайные знания javascript-а можно постичь, а нет посмотрев видео подумали хрень какая-то. И правильно подумали. Это видео не про javascript, это видео о том как написать язык типа JS. Если Вы хотите написать интерпретатор тогда да Вам нужно знать какой полиморфизм бывает. А если Вы хотите писать на JS frontend or backend и не дай бог ещё используя фреймворк какой-то. Тогда данные знания для Вас избыточны и даже вредные. К примеру вам дали лопату выкопать яму но прежде сказали необходимо пройти курсы как образовался черенок в процессе эволюции и как зародились металлы, а также откуда взялась планета земля. И главное, что-бы яма была готова в кротчайшие сроки еще при вашей жизни.🤓 Если какой-то малоумный "гений" на собеседовании в компанию которая анимашки для кнопок производит спросит Вас какой полиморфизм в JS используется. Бегите оттуда там неадекваты они и съесть Вас могут, от таких чего угодно можно ожидать. 🏃♂️
Будет что нибудь по с++? Уже было видео про подробный процесс компиляции программы И круто было бы в продолжение рассказать про one definition rule, что такое единица трансляции, как программа превращается в слабые / сильные слова и т. д Не видел такого контента на ютьюбе, а было бы интересно
@@S0ERDEVS получается, что если развита система типов (частный случай - включение), то - можно получить "честный" параметрический (частный случай которого - ad-hoc), который, в свою очередь представляет из себя перегрузку и принудительное приведение. Верно ли, что деление на универсальный и ad-hoc можно свести к иерархии как частные случаи полиморфизма одного из другого?
вопрос того, что ad-hoc - частный случай универсального не решен однозначно, поэтому трудно дать однозначный ответ. На данный момент я все же склоняюсь к мысли, что ad-hoc не связан с параметрическим полиморфизмом.
Вот я только только понял как работает полиморфизм в C++ и C#, вижу этот ролик, и думаю, ну сейчас я еще и в js разберусь. А тут фиг мне. Your level is too low. Come back later. В C++ и C# с помощью апкаста и виртуальных методов можно под один интерфейс клепать дочерки, меняя им метод на подходящий этой конкретной дочерке. Смотрел на extremecode и на канале одного чела, который показывает как делать разные простые игры на C++ и разное другое. И вот как такое в js реализовать? И вообще оно нужно в js или есть решение попроще? А тут SOER как завалил информацией, так у меня голова опять поломалась на середине ролика в попытке осознать о чем речь))
А почему только 4 примитива в JS? Оператор typeof для значения null возвращает object, но это известная ошибка работы оператора typeof. null - это отдельный тип данных. Символ тоже к сложным типам данных не принадлежит. Это примитив.
1. ситуация с typeof - это очень характерно для JS, сама философия языка такова, что типам в ней уделяется минимальное внимание. Я формально подошел к этому вопросу. 2. Я руководствуюсь двумя правилами при определении примитивов: - примитив может быть представлен значением (литералом) - литерал должен быть равен сам себе. Если считать примитивами все базовые типы, то тогда все перечисленное в видео - это примитивы. Очевидно, что тогда лучше говорить "базовый тип/класс". Символ не ведет себя как примитив, он не может быть использован в большинстве операций, которые приняты над примитивами в JS, обладает своим собственным поведением. Интересно по каким принципам его можно отнести к примитивами?
@S0ER интересно было вдуматься в Ваш ответ. В этом есть логика. Считаю, что это тот самый момент, когда можно по-разному дать определение примитиву, и все они могут быть аргументировано правильными. Например, на MDN говорится, что примитив - тип данных, который не может быть изменен (3-й абзац). По такому определению, действительно, все укладывается в популярное суждение о 7. В любом случае, это не так важно для меня) Не хочу ворошить тему, кто как представляет определение и какое истино. Мне больше интересно узнать в ознакомительных целях: 1. как Вы пришли к данному определению примитива ? 2. почему, если над примитивом нельзя выполнять большинство операций над примитивами, то он не является примитивом ? Возьмем string и num или num и boolean. Очевидно, что есть операции, которые возможны для одного типа, и невозможны для другого (деление с остатком). Получается, чем больше примитивных типов, тем больше расхождений в общих операциях над примитивами. Да и закономерности не видно. Как одно на другое влияет? 3. если int - примитив, bigint - расширенная в диапозоне (кол-ве выделяемой памяти)версия int, то почему он уже не примитив? Заранее предупреждаю, что я не читал никакой профессиональной литературы, касающейся именно типов в ЯП. Не судите строго😁 Буду рад замечаниям
На MDN пишут, что это примитивный тип, потому что в спецификации сказано, что этот тип "примитивный", тогда непонятно почему "Each Symbol value immutably holds an associated value called [[Description]] that is either undefined or a String value." Впервые слышу о примитивных типах, которые хранят значения других примитивных типов кроме собственного значения. Так что я могу лишь вернуться к тезису "сама философия языка такова, что типам в ней уделяется минимальное внимание"
@@S0ERDEVSc typeof вообще непонятная история. Он для функции возвращает тип 'function', хотя в любой литературе о функциях как о типе не говорят, относя функции к объектам. Ведь для тех же массивов, множеств и мап typeof возвращает 'object'. По поводу определения примитивов. NaN - примитив. Но он не равен сам себе. Это правило равенства примитивных литералов в JS не работает. Хотя, возможно, исключение лишь подтверждает правило. Возможность создания примитива только с помощью вызова функции выглядит странно. Хранение дополнительных свойств в символе ещё больше вносит сумбур в попытку разобраться в сути вопроса. Для того, чтобы высказать свою точку зрения, для начала мне нужно уточнить определение понятия "Сложный тип". В большинстве литературы, когда речь идёт о сложном типе в JS, говорится об объекте. Всё, что не является объектом, считается примитивом. Я в своём видении ситуации буду руководствоваться этим утверждением. "В JS - всё есть объект" - также одна из самых популярных фраз в книгах о JS. Если обратить внимание на определение понятия в MDN "Объект - это набор свойств, и каждое свойство состоит из имени и значения, ассоциированного с этим именем", то можно смело говорить о том, что таки не всё в JS является объектами. Попытка задать свойство undefined вызовет исключение. Остальным примитивам можно задать свойство, но оно не будет сохранено, так как для примитивов используется оборачивание в объект, который благополучно удалится после проведения операции присваивания. Получается, что примитивы точно не являются объектами. Да, ими можно манипулировать как объектами, но объектами они не являются. С символом такая же ситуация. В него нельзя записать свойство, которое будет сохранено. То есть символ не является объектом в понимании JS. А то, что не объект, в JS считается примитивом. P.S. Поддержу вопрос, оставленный выше. Что по поводу bigint? Литерал есть, два литеральных значения равны друг другу. Почему этот тип в Вашем понимании является сложным, если он попадает под Ваши правила определения примитивов?
@@cheenanai3672 определение примитива на MDN действительно вносит ясность в вопрос. Но как быть с Object.freeze? Я не думаю, что объектный тип станет примитивом после того, как его нельзя будет изменить.
Я тут натыкал: Полиморфизм произошёл от Греческого поли - много, морф - форма, суффикс -ик - сделан из. Polymorphic - сделан из многих форм. Monomorphic - сделан из одной формы.
*Abstract* Я не очень понимаю, каким образом можно рассуждать о реализации той или иной концепции в языке, при этом не ориентируясь в фундаментальных основах самого языка. Ниже, я хочу продемонстрировать, что автор видео, возможно делая верные выводы о заявленной теме, демонстрирует это на совершенно неверной машинерии языка. Но более этого мне не вполне понятно, зачем вообще концептуально сравнивать что-то, чему дай бог чтобы было 30 лет отроду, с тем, что строится на принципах которым было уже около 20 лет на момент рождении, а сейчас уже почти 60 лет. Иными словами полиморфизм, как концепция, с точки зрения программирования в его академическом смысле, является ущербным направлением в любых его проявлениях. И совершенно неважно какого сорта этот самый полиморфизм. Потому как если в бидон варенья, добавить всего маленькую чайную ложечку го@#на,, то мы получим целый бидон того самого полиморфизма. Оно то может быть и очень любопытно, что и как куда полиморфирует, вот только варенья от этого у нас стало гораздо меньше. А именно на целый бидон.
6:40 *тип symbol* Этот тип существует под капотом языка с бог знает каких времен. С ним все сталкивались постоянно, облизывались и требовали. Сейчас потребности пользователей языка достигли уровня, когда ему дали интерфейс.
7:03 *Смотрим как это делается на уровне* У меня для Вашего видео плохие новости: typeof, не смотря на свое название, не возвращает тип идентификатора. И никогда не возвращал. Все идентификаторы в JS одного типа, потому они и идентификаторы. typeof это унарный оператор возвращающий строковые значения в соответствии с: A) предорпеделенной таблицей условий в случае родных обьектов, Б) что угодно что захотел разработчик в случае неродных обьектов. Это поведение закреплено спецификацией с момента ее, спецификации появления. *Игого* К сожалению у меня нет сил и времени дальше разбирать то что вы нагородили. Потому сразу ИГОГО В JavaScript полиморфизма нет вообще. И никогда не было. Как нет и никогда не было примитивных типов. В JavaScript все - это объекты. Боже Вас упаси думать о них как о обьектах в класс ориентированно стиле. В JavaScript никогда классов не было и нет сейчас. Не смотря на присуствия солва Class которое является почти синтаксическим сахаром к прототипной модели. Идентификаторы это ссылки на эти объекты. Исключением можно назвать целые числа укладываемые в пределах 31 бита. Да и то, они существуют только потому что V8 хотели сделать очень быстрым. Ну и на закуску, есть еще типизированные массивы. Которые должны были дать понять, что весь поток сознания из видео вообще яйца выеденного не стоит. Даже не зная что делает typeof
"Оператор typeof возвращает строку, указывающую тип операнда." developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/typeof Не надо делать таких долгих вступлений, это называется бульверизм и считается мувитоном. Про typeof я знаю о чем вы говорите, но в контексте данного видео это вообще не существенно. UPD. по поводу примтивных типов - developer.mozilla.org/ru/docs/Web/JavaScript/Data_structures Если что-то хотите сказать по делу, давайте лучше ссылку на доку, я не могу дешифровать ваши мысли. Какой-то сбой в терминологическом аппарате, Вы самоучка что-ли?
@@S0ERDEVS Вот мы и дожили до момента, когда программисту, который настаивает на своей компетентности, нужно давать ссылку на официальную спецификацию языка. Судя по тому, что вы даете ссылку на mdn, спецификацию Вы в глаза никогда не видели. Мне не трудно вам подсказать. Есть такая организация - ecma. Она занимается спецификацией всех частей языка и публикует ее официально. А с 2009 года, если не ошибаюсь, хранит архивы. Так вот если Вы сподобитесь найти ее сайт, а на нем ту самую официальную спецификацию то в первую очередь рекомендую прочитать: Главу 4.4. *Terms and Definitions* а именно главу 4.4.5 *primitive value*. Сразу обозначу, что спецификация практически любого языка программирования содержит подобное описание. И коль Вы уж с ним не знакомы, я рискну предположить что Вы вообще никогда ни одной спецификации не читали. Что для программиста отрицательное качество. Будете спорить? Далее, Вам следует прочитать всю главу 6 *ECMAScript Data Types and Values*. Обратить особое внимание на раздел о идентификаторах. Ну и на закуску главу 13 *ECMAScript Language*, если быть точнее ее часть о унарном операторе typeof. Ну и в целом, очень рекомендую прочитать ее всю. Потому как Вам крайне будет полезно для своего развития, узнать, что в JavaScript все данные имутабельны. То есть и речи быть не может о полиморфизме. Хуже воинствующего невежества, может быть только невежество водрузившее себя на трибуну. Научитесь признавать свои ошибки. И тогда, возможно, из вас получиться специалист.
@Околовсяческий JavaScript с DemiMurych - ем Судя по положению звезд на небе у вас что-то не то с головой ) Вижу что вам интересно обсасывать мою личность, а не обсуждать технические моменты. По опыту знаю, что разговор ничего не даст, поэтому всего хорошего.
@@S0ERDEVS Вам не откажешь в трезвомыслии. Действительно на месте человека у которого нет возможности полагаться на свою экспертизу, самым правильным является апеллировать к невменяемости оппонента. Ни у кого не было сомнений, что это аутодафе вам не по зубам. Были надежды, что Вас волнует что-то кроме собственного лица. Всего наилучшего.
если сможете обобщенно описать тип результата функции (a,b) => a+b, то будет параметрическим, но в JS этого сделать нельзя, так как "+" реализован через ad-hoc и может вести себя как угодно, начиная от выбрасывания исключений, заканчивая выдачей произвольного типа.
@@S0ERDEVS Спасибо! Получается, полиморфизм рассматривается "под капотом" в исходниках языка? Вероятно, я путаю с "полиморфизмом", который реализует программист в рамках самого ЯП с его возможностями и ограничениями.
@S0ER функция (a, b) => a+b не может обработать любые типы a, b поэтому это не параметрический полиморфизм. А чтобы разобраться почему не может, нужно уже копать "под капотом".
Полиморфизм переоценен, ваш код никогда не будет переиспользован, и не должен быть. Смиритесь и пишите конкретную реализацию, так хотя бы код будет понятнее.
Это не дырка в экране, это курсор мыши черный.
Черный треугольник с палкой ...
Курсор, который видно сквозь дырку в экране.
I guess it is kinda randomly asking but does anybody know of a good website to watch newly released tv shows online ?
@Atticus Brentley lately I have been using flixzone. Just search on google for it =)
@Leonard Harlan definitely, I've been using Flixzone for years myself :)
Интересно увидеть разбор TypeScript и твоё мнение об этом суперсете JavaScript.
Блин, соер, брат, ты крут. Как же я рад что давно наткнулся на тебя. Очень радуюсь каждому новому видосу так как знаю что контент всегда топовый. Спасибище тебе за работу
Чтобы говорить про полиморфизм в JavaScript нужно обязательно вспомнить про скрытые классы и форму объектов. По дженерикам - нужно бы копнуть обобщенное программирование и работы Степанова (автора STL)
Почему?
@@S0ERDEVS ну потому, что на вход в функцию могут приходить утино-типизированные объекты, разной формы, но реализующие один и тот же интерфейс. Если форма одна - то код мономорфный, в байткоде не нужно проверять типы и делать условное приведение к нужным типам, если форм до 4 то создаются скрытые функции-дженерики, т.е. код один, а байткода несколько вариантов в зависимости от формы входных объектов, ну и если больше, то мегаморфная реализация, см. статьи Вячеслава Егорова (на хабре даже есть перевод одной из них про мономорфизм вот прямо).
А обобщенное программирование - это нечто большее, все же, чем просто синтаксис дженериков, это идея полиморфного кода, одинакового с точностью до типов. Для JS это более чем актуально.
@Timur Shemsedinov что-то тебя не туда понесло. Ты сейчас говоришь про оптимизацию производительности JS с использование мономорфного, полиморфного и мегаморфного кэша. Причем для этого используется понятие "формы", которая по сути является слепком данных, а не типом. И это не "утино-типизированные объекты", это любые объекты с разной реализацией, которые могут принадлежать к одному и тому же типу (классу). В данном случае понятие формы вообще никак не связано с полиморфным поведением кода. А связано с моноформами, т.е. с объектами с одинаковым составом полей и их значениями.
Ну и в контексте JS фраза "одинакового с точностью до типов" бессмысленна, ты же сам сослался на то, что данные в JS определяются формами, а не типами. А форма - это не тип, это конкретная реализация типа с конкретными значениями. Это как раз поведение на основе реализации.
Очень интересно было бы послушать объяснения про конкурентность, параллелизм, асинхронность и многопоточность и как они друг с другом связаны.
я устал убирать курсор, а потом как понял.....
что курсор имеет полиморфизм аналогичный JavaScript
Это не первое видео такое)
В JS можно реализовать функцию, которая не будет требовать приведения типов аргументов и будет всегда возвращать результат одного типа
function(...args) {
return [...args];
}
Означает ли это, что параметрический полиморфизм в JS таки есть?
Нет конечно
@@programmer403 ответ лаконичный, но ясности не вносит.
Замечательный ролик. Кстати, в с++ и в scal‘е насколько мне видится, параметрический пол-зм реализован?..
Темплейты C++ это чистый параметрический полиморфизм?
Насколько я понимаю, то там на моменте компиляции создаются разные функции под разные типы и подменяются на конкретные внутри кода.
И как дела обстоят у generic-ов в Rust-е? Там вроде алгебраичная система, то есть должно быть все "ровно", но на практике не уверен
Полиморфизм - способность функции обрабатывать данные разных типов, наконец то понял как это на примере)
Спасибо! В каких случаях может понадобится знания видов полиморфизма?
Когда нужно блеснуть перед коллегами)
На собеседовании, например
для выведения типов, это один из мощнейших способов достижения типобезопасности и по сути "бесплатная верификация". В JS программист должен взять на себя обязанность по контролю типов (интерфейсов) чтобы программа не падала в рантайме.
На практике понимание полиморфизма помогает правильно сделать утиную типизацию.
А можно ссылки на материалы на счет того, почему дженерики это не параметрический полиморфизм, хочу понять в чем разница. Спасибо!
Я так понимаю, для поддержки честного параметрического полиморфизма нужны классы типов (не помню точно как называется) как в хаскеле?
Смотрел на телефоне, и сначала подумал что на нем грязь, а это курсор)
А прототипное наследование, где можно переопределять методы потомков в цепочке прототипов и если функция будет принимать разные объекты и дёргать у них например метод, то будет вызываться либо переопределённый метод, либо браться выше в цепочке прототипов, это разве не полиморфизм подтипов?
я назвал бы это перегрузкой, что опять указывает на ad-hoc. однако, после видео надо поднять конспекты и обновить информацию.
Хотел то же самое спросить! Prototype и цепочка потомков - по сути, подтипы и реализация иерархии. Значит, полиморфизм подтипов?
тогда возникает вопрос как определить принадлежность к супертипу без статической типизации? возвращаемся к adhoc?
@@oleh914 Ну в джаве или шарпе используется таблица виртуальных методов, где ищется реализация, суть тот же поиск реализации в цепочке прототипов
Попробуйте убавить голос на пару dB Low-Shelf'ом на 300-500 герцах. Так будет звучать чище и слушать будет приятней
- Какой полиморфизм в JS?
- А шиш его знает. Если так посмотреть, то такой, с другой стороны вот такой. Но мне кажется, что всё-таки вот такой
Так и что мне делать с этой информацией теперь?
Жить с этим
*Servant573*
Согласен с предыдущим оратором. Если Вы посмотрели это видео тогда уже ничего не поделаешь Вам придется с этим как-то жить. Обычно для большего количества просмотров авторы забывают сказать для кого предназначено их видео, или думают зачем говорить и так всё понятно. 🙂 В итоге начинающие и не очень начинающие разработчики прочли в названии javascript, подумали о тайные знания javascript-а можно постичь, а нет посмотрев видео подумали хрень какая-то. И правильно подумали. Это видео не про javascript, это видео о том как написать язык типа JS. Если Вы хотите написать интерпретатор тогда да Вам нужно знать какой полиморфизм бывает. А если Вы хотите писать на JS frontend or backend и не дай бог ещё используя фреймворк какой-то. Тогда данные знания для Вас избыточны и даже вредные. К примеру вам дали лопату выкопать яму но прежде сказали необходимо пройти курсы как образовался черенок в процессе эволюции и как зародились металлы, а также откуда взялась планета земля. И главное, что-бы яма была готова в кротчайшие сроки еще при вашей жизни.🤓 Если какой-то малоумный "гений" на собеседовании в компанию которая анимашки для кнопок производит спросит Вас какой полиморфизм в JS используется. Бегите оттуда там неадекваты они и съесть Вас могут, от таких чего угодно можно ожидать. 🏃♂️
При написании кода на тайпскрипте, нативный полимарфизм яваскрипта утрачивается?
То чувство, когда несколько раз протёр экран, а это не экран
Будет что нибудь по с++?
Уже было видео про подробный процесс компиляции программы
И круто было бы в продолжение рассказать про one definition rule, что такое единица трансляции, как программа превращается в слабые / сильные слова и т. д
Не видел такого контента на ютьюбе, а было бы интересно
перфекционисты разбили монитор хотев убить муху, оказалось это был курсор
Спасибо, иду с учёбы и тут годнота.
Подождите, а разве не было видео так же про полиморфизм, где параметрический был назван ad-hoc?
Было видео где ad-hoc был назван частным случаем реализации параметрического полиморфизма через перегрузку функций.
@@S0ERDEVS получается, что если развита система типов (частный случай - включение), то - можно получить "честный" параметрический (частный случай которого - ad-hoc), который, в свою очередь представляет из себя перегрузку и принудительное приведение. Верно ли, что деление на универсальный и ad-hoc можно свести к иерархии как частные случаи полиморфизма одного из другого?
вопрос того, что ad-hoc - частный случай универсального не решен однозначно, поэтому трудно дать однозначный ответ.
На данный момент я все же склоняюсь к мысли, что ad-hoc не связан с параметрическим полиморфизмом.
Только на Соера надежда в этом бренном мире
Почему именно js ? А не C++, Java, Python ? Или будет серия видео?
Возможно, потому что js динамически типизирован
Потому что он на нём работает
Существует ли язык с честным параметрическим полиморфизмом?
7:11 ууу.. началось 😄
пипец
Вот я только только понял как работает полиморфизм в C++ и C#, вижу этот ролик, и думаю, ну сейчас я еще и в js разберусь. А тут фиг мне. Your level is too low. Come back later. В C++ и C# с помощью апкаста и виртуальных методов можно под один интерфейс клепать дочерки, меняя им метод на подходящий этой конкретной дочерке. Смотрел на extremecode и на канале одного чела, который показывает как делать разные простые игры на C++ и разное другое. И вот как такое в js реализовать? И вообще оно нужно в js или есть решение попроще? А тут SOER как завалил информацией, так у меня голова опять поломалась на середине ролика в попытке осознать о чем речь))
А почему только 4 примитива в JS? Оператор typeof для значения null возвращает object, но это известная ошибка работы оператора typeof. null - это отдельный тип данных.
Символ тоже к сложным типам данных не принадлежит. Это примитив.
1. ситуация с typeof - это очень характерно для JS, сама философия языка такова, что типам в ней уделяется минимальное внимание. Я формально подошел к этому вопросу.
2. Я руководствуюсь двумя правилами при определении примитивов:
- примитив может быть представлен значением (литералом)
- литерал должен быть равен сам себе.
Если считать примитивами все базовые типы, то тогда все перечисленное в видео - это примитивы. Очевидно, что тогда лучше говорить "базовый тип/класс". Символ не ведет себя как примитив, он не может быть использован в большинстве операций, которые приняты над примитивами в JS, обладает своим собственным поведением. Интересно по каким принципам его можно отнести к примитивами?
@S0ER интересно было вдуматься в Ваш ответ. В этом есть логика. Считаю, что это тот самый момент, когда можно по-разному дать определение примитиву, и все они могут быть аргументировано правильными. Например, на MDN говорится, что примитив - тип данных, который не может быть изменен (3-й абзац). По такому определению, действительно, все укладывается в популярное суждение о 7. В любом случае, это не так важно для меня) Не хочу ворошить тему, кто как представляет определение и какое истино.
Мне больше интересно узнать в ознакомительных целях:
1. как Вы пришли к данному определению примитива ?
2. почему, если над примитивом нельзя выполнять большинство операций над примитивами, то он не является примитивом ? Возьмем string и num или num и boolean. Очевидно, что есть операции, которые возможны для одного типа, и невозможны для другого (деление с остатком). Получается, чем больше примитивных типов, тем больше расхождений в общих операциях над примитивами. Да и закономерности не видно. Как одно на другое влияет?
3. если int - примитив, bigint - расширенная в диапозоне (кол-ве выделяемой памяти)версия int, то почему он уже не примитив?
Заранее предупреждаю, что я не читал никакой профессиональной литературы, касающейся именно типов в ЯП. Не судите строго😁 Буду рад замечаниям
На MDN пишут, что это примитивный тип, потому что в спецификации сказано, что этот тип "примитивный", тогда непонятно почему "Each Symbol value immutably holds an associated value called [[Description]] that is either undefined or a String value." Впервые слышу о примитивных типах, которые хранят значения других примитивных типов кроме собственного значения. Так что я могу лишь вернуться к тезису "сама философия языка такова, что типам в ней уделяется минимальное внимание"
@@S0ERDEVSc typeof вообще непонятная история. Он для функции возвращает тип 'function', хотя в любой литературе о функциях как о типе не говорят, относя функции к объектам. Ведь для тех же массивов, множеств и мап typeof возвращает 'object'.
По поводу определения примитивов. NaN - примитив. Но он не равен сам себе. Это правило равенства примитивных литералов в JS не работает. Хотя, возможно, исключение лишь подтверждает правило.
Возможность создания примитива только с помощью вызова функции выглядит странно. Хранение дополнительных свойств в символе ещё больше вносит сумбур в попытку разобраться в сути вопроса.
Для того, чтобы высказать свою точку зрения, для начала мне нужно уточнить определение понятия "Сложный тип". В большинстве литературы, когда речь идёт о сложном типе в JS, говорится об объекте. Всё, что не является объектом, считается примитивом. Я в своём видении ситуации буду руководствоваться этим утверждением.
"В JS - всё есть объект" - также одна из самых популярных фраз в книгах о JS. Если обратить внимание на определение понятия в MDN "Объект - это набор свойств, и каждое свойство состоит из имени и значения, ассоциированного с этим именем", то можно смело говорить о том, что таки не всё в JS является объектами.
Попытка задать свойство undefined вызовет исключение. Остальным примитивам можно задать свойство, но оно не будет сохранено, так как для примитивов используется оборачивание в объект, который благополучно удалится после проведения операции присваивания. Получается, что примитивы точно не являются объектами. Да, ими можно манипулировать как объектами, но объектами они не являются.
С символом такая же ситуация. В него нельзя записать свойство, которое будет сохранено. То есть символ не является объектом в понимании JS. А то, что не объект, в JS считается примитивом.
P.S. Поддержу вопрос, оставленный выше. Что по поводу bigint? Литерал есть, два литеральных значения равны друг другу. Почему этот тип в Вашем понимании является сложным, если он попадает под Ваши правила определения примитивов?
@@cheenanai3672 определение примитива на MDN действительно вносит ясность в вопрос. Но как быть с Object.freeze? Я не думаю, что объектный тип станет примитивом после того, как его нельзя будет изменить.
Всегда подозревал, что определение полиморфизма подтипов как возможность объектов с одинаковой спецификацией иметь различную реализацию - это не то, то нужно. Это как как когда полиморфизм называют наследованием. Кстати, цитата из статьи о полиморфизме на википедии: "В сообществе объектно-ориентированного программирования под термином «полиморфизм» обычно подразумевают наследование" ©
На самом деле, оказывается, что наследование только позволяет реализовать полиморфизм, но никак им не является.
Так и особенности объектов, классы которых образуют иерархию, не являются определением понятия полиморфизма подтипов. Полиморфизм подтипов - это действительно частный случай параметрического полиморфизма, когда функция обрабатывает значения, находящиеся в отношении иерархии тип - подтип. И подходить под требования полиморфизма включения такой функции как раз и позволяет возможность объектов разных типов иметь одинаковый интерфейс. Реализация же может быть как одинаковой, так и различаться от класса к классу.
Код такой функции может обрабатывать значения разных типов без условий и приведения типов. Всё как в истинном (универсальном) полиморфизме. Конечно, нужно учитывать принцип подстановки Лисков. Наследуемые классы должны соблюдать этот принцип, иначе функция, обрабатывающие экземпляры таких классов, может оказаться неполиморфной из-за неподходящих типов значений, возвращаемых методами дочерних классов
Я тут натыкал: Полиморфизм произошёл от Греческого поли - много, морф - форма, суффикс -ик - сделан из. Polymorphic - сделан из многих форм. Monomorphic - сделан из одной формы.
После того, как у Drink появилась буква C, подумалось про паттерн Command
Кровь с глаз!!! Это как родинка на лице на которую стараешься не смотреть при разговоре, но думаешь только о ней
Лайк за курсор
это интересно
Или во мне много пива, или я безнадёжно тупой... 😐
P.S. Курсор с экрана тоже смахивал... 🤦
*Abstract*
Я не очень понимаю, каким образом можно рассуждать о реализации той или иной
концепции в языке, при этом не ориентируясь в фундаментальных основах самого
языка.
Ниже, я хочу продемонстрировать, что автор видео, возможно делая верные выводы о
заявленной теме, демонстрирует это на совершенно неверной машинерии языка.
Но более этого мне не вполне понятно, зачем вообще концептуально сравнивать
что-то, чему дай бог чтобы было 30 лет отроду, с тем, что строится на принципах
которым было уже около 20 лет на момент рождении, а сейчас уже почти 60 лет.
Иными словами полиморфизм, как концепция, с точки зрения программирования в его
академическом смысле, является ущербным направлением в любых его проявлениях. И
совершенно неважно какого сорта этот самый полиморфизм. Потому как если в бидон
варенья, добавить всего маленькую чайную ложечку го@#на,, то мы получим целый
бидон того самого полиморфизма.
Оно то может быть и очень любопытно, что и как куда полиморфирует, вот только
варенья от этого у нас стало гораздо меньше. А именно на целый бидон.
6:40 *тип symbol*
Этот тип существует под капотом языка с бог знает каких времен. С ним все
сталкивались постоянно, облизывались и требовали.
Сейчас потребности пользователей языка достигли уровня, когда ему дали
интерфейс.
7:03 *Смотрим как это делается на уровне*
У меня для Вашего видео плохие новости:
typeof, не смотря на свое название, не возвращает тип идентификатора. И никогда
не возвращал.
Все идентификаторы в JS одного типа, потому они и идентификаторы.
typeof это унарный оператор возвращающий строковые значения в соответствии с:
A) предорпеделенной таблицей условий в случае родных обьектов,
Б) что угодно что захотел разработчик в случае неродных обьектов.
Это поведение закреплено спецификацией с момента ее, спецификации появления.
*Игого*
К сожалению у меня нет сил и времени дальше разбирать то что вы
нагородили. Потому сразу ИГОГО
В JavaScript полиморфизма нет вообще. И никогда не было. Как нет и никогда не
было примитивных типов.
В JavaScript все - это объекты. Боже Вас упаси думать о них как о обьектах в класс ориентированно стиле.
В JavaScript никогда классов не было и нет сейчас. Не смотря на присуствия солва Class которое является почти
синтаксическим сахаром к прототипной модели.
Идентификаторы это ссылки на эти объекты.
Исключением можно назвать целые числа укладываемые в пределах 31 бита.
Да и то, они существуют только потому что V8 хотели сделать очень быстрым.
Ну и на закуску, есть еще типизированные массивы. Которые должны были дать понять,
что весь поток сознания из видео вообще яйца выеденного не стоит. Даже не зная что делает typeof
"Оператор typeof возвращает строку, указывающую тип операнда."
developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/typeof
Не надо делать таких долгих вступлений, это называется бульверизм и считается мувитоном. Про typeof я знаю о чем вы говорите, но в контексте данного видео это вообще не существенно.
UPD. по поводу примтивных типов - developer.mozilla.org/ru/docs/Web/JavaScript/Data_structures
Если что-то хотите сказать по делу, давайте лучше ссылку на доку, я не могу дешифровать ваши мысли. Какой-то сбой в терминологическом аппарате, Вы самоучка что-ли?
@@S0ERDEVS Вот мы и дожили до момента, когда программисту, который настаивает на своей компетентности, нужно давать ссылку на официальную спецификацию языка.
Судя по тому, что вы даете ссылку на mdn, спецификацию Вы в глаза никогда не видели. Мне не трудно вам подсказать. Есть такая организация - ecma. Она занимается спецификацией всех частей языка и публикует ее официально. А с 2009 года, если не ошибаюсь, хранит архивы.
Так вот если Вы сподобитесь найти ее сайт, а на нем ту самую официальную спецификацию то в первую очередь рекомендую прочитать:
Главу 4.4. *Terms and Definitions* а именно главу 4.4.5 *primitive value*. Сразу обозначу, что спецификация практически любого языка программирования содержит подобное описание. И коль Вы уж с ним не знакомы, я рискну предположить что Вы вообще никогда ни одной спецификации не читали. Что для программиста отрицательное качество. Будете спорить?
Далее, Вам следует прочитать всю главу 6 *ECMAScript Data Types and Values*. Обратить особое внимание на раздел о идентификаторах. Ну и на закуску главу 13 *ECMAScript Language*, если быть точнее ее часть о унарном операторе typeof.
Ну и в целом, очень рекомендую прочитать ее всю. Потому как Вам крайне будет полезно для своего развития, узнать, что в JavaScript все данные имутабельны. То есть и речи быть не может о полиморфизме.
Хуже воинствующего невежества, может быть только невежество водрузившее себя на трибуну. Научитесь признавать свои ошибки. И тогда, возможно, из вас получиться специалист.
@Околовсяческий JavaScript с DemiMurych - ем
Судя по положению звезд на небе у вас что-то не то с головой ) Вижу что вам интересно обсасывать мою личность, а не обсуждать технические моменты. По опыту знаю, что разговор ничего не даст, поэтому всего хорошего.
@@S0ERDEVS Вам не откажешь в трезвомыслии. Действительно на месте человека у которого нет возможности полагаться на свою экспертизу, самым правильным является апеллировать к невменяемости оппонента.
Ни у кого не было сомнений, что это аутодафе вам не по зубам. Были надежды, что Вас волнует что-то кроме собственного лица.
Всего наилучшего.
@@S0ERDEVS почему вы даете ссылки не на спецификацию?
const someFunc = (a,b)=>{ return a +b; } выглядит как параметрический полиморфизм? someFunc(1,2) => (int) 3; someFunc('что', 'где') => (string) 'что где';
если сможете обобщенно описать тип результата функции (a,b) => a+b, то будет параметрическим, но в JS этого сделать нельзя, так как "+" реализован через ad-hoc и может вести себя как угодно, начиная от выбрасывания исключений, заканчивая выдачей произвольного типа.
@@S0ERDEVS Спасибо! Получается, полиморфизм рассматривается "под капотом" в исходниках языка? Вероятно, я путаю с "полиморфизмом", который реализует программист в рамках самого ЯП с его возможностями и ограничениями.
@S0ER функция (a, b) => a+b не может обработать любые типы a, b поэтому это не параметрический полиморфизм. А чтобы разобраться почему не может, нужно уже копать "под капотом".
Дед, сделай на своих роликах громкость побольше, пожалуйста
у меня завис курсор
Сотонизм и сектанство какое-то ... На самом деле большое спасибо, было очень любопытно и интересно. C# Мидл
Соеру бы почитать "типа в языках программирования" Бенджамина Пирса
Я читал эту книгу, она довольно старая. Там про типы тоже самое говорится. В чем смысл совета?
Я думал, узнаю что такое полиморфизм и для чего он нужен 🙄
Хотел создать дату из дейтпикера и охреневал от происходящего: new Date(dateParts[2], dateParts[1] - 1, parseInt(dateParts[0],10) + 1)
Птичку жалко( на глобус, как так-то!
Судя по курсору мышки ubunty
глубоко копнул, годно
Алгебраичная система типов вышла из комнаты...
Полиморфизм переоценен, ваш код никогда не будет переиспользован, и не должен быть. Смиритесь и пишите конкретную реализацию, так хотя бы код будет понятнее.
а шо так мало лайков?
Натянули сову на глобус? 🦉
У тебя муха))
Зачем нужно знание полиморфизма в JavaScript, если в нём динамическая типизация, и итак всё работает?
Никакой?
мушка
Говорим ни0чем!