Как вам этот чел? (Frontend)
304
44
InversionSpells сказал(а):↑Типа тут у меня реально глаза открылись что ***ть, ссылки у переменных же сравнивать дешевле чем значения, оператор === получается сравнивает всегда только ссылки, почему мне раньше об этом не сказали умные люди?
(Это к предыдущему ответу добил)
Нажмите, чтобы раскрыть...почему дешевле?
InversionSpells сказал(а):↑Ну про let и var было довольно очевидно, он тут мне глаза не открыл.
Про ссылки я так понял что переменные хранят только ссылку до примитива или обьекта, и если компилятор не может предоставить переменной ссылку до примитива, то создает новое примитивное значение и ссылку к нему, хз надо поразбираться в вопросе. Я просто не знаком со всеми этими языками с указателями всякими и т.п. так что мне это сложно.
Но бтв в плане определений он тут всë четко обьяснил и разьяснил, и это важно, потому что без них я нифига не понимал, а щас всë сложилось в картину.
Ну минин это вообще кал, я со своим годом в программировании и полугодом в React/Vue слушаю его видосы про Vue и такой: "Вот тут верю, вот тут да поверил, да, верю, да я а шо?"
Щас там месседж модерацию проходит, а по поводу бычит - ну не, показатель неуверенности это когда ты в споре вместо аргументов бычить начинаешь, или по поводу чего то субьективного.
Когда ты публично высказываешь тезисы которые можно проверить, то когда ты разговариваешь в таком тоне то это наоборот показатель нереальной уверенности, потому что дать заднюю или оправдаться не получится.
Нажмите, чтобы раскрыть...
Нет, насколько я знаю, переменные хранят не ссылки а копии ссылок. Именно поэтому, если мы назначим (=) новое значение переменной, то старое значение в памяти останется, просто ссвлка у переменной изменится. Т.е. идентификатор не является алиасом. А чтобы получить доступ к реальному объекту в памяти, нужно менять его свойства.
Я думал это относится только к объедкам и массивам, но, оказывается, ещё и к строкам. Но самая жесть, насколько я сейчас покрутил, если в памяти уже есть строка, а потом мы приравниваем другую переменную к этой строке (не к переменной, а просто к строке такой же, которую заново написали руками), то память новая не будет занята, переменная приравняется к той же самой строке, лежавшей в памяти. С числами всё не так, все числа разные, т.е. уже по значению сравниваются, память выделяется по-любому.
Просто мозг отваливается, что если мы создаём 2 одинаковых объекта или массива, то они будут считаться разными, а со строкой нет.
А минин просто документацию переводит, ничего не объясняя (потому что сам не понимает). Он копирует код из документации, а зрители у него. В итоге никто после этого не сможет шаг в сторону сделать
Любая агрессия - страх. Если боишься, то бей или беги. Он пытается агрессией напугать, задавить авторитетом, чтобы было страшно ему перечить и в итоге никто бы не смог его задушить
falitan сказал(а):↑
Нет, насколько я знаю, переменные хранят не ссылки а копии ссылок. Именно поэтому, если мы назначим (=) новое значение переменной, то старое значение в памяти останется, просто ссвлка у переменной изменится. Т.е. идентификатор не является алиасом. А чтобы получить доступ к реальному объекту в памяти, нужно менять его свойства.
Я думал это относится только к объедкам и массивам, но, оказывается, ещё и к строкам. Но самая жесть, насколько я сейчас покрутил, если в памяти уже есть строка, а потом мы приравниваем другую переменную к этой строке (не к переменной, а просто к строке такой же, которую заново написали руками), то память новая не будет занята, переменная приравняется к той же самой строке, лежавшей в памяти. С числами всё не так, все числа разные, т.е. уже по значению сравниваются, память выделяется по-любому.
Просто мозг отваливается, что если мы создаём 2 одинаковых объекта или массива, то они будут считаться разными, а со строкой нет.
А минин просто документацию переводит, ничего не объясняя (потому что сам не понимает). Он копирует код из документации, а зрители у него. В итоге никто после этого не сможет шаг в сторону сделать
Любая агрессия - страх. Если боишься, то бей или беги. Он пытается агрессией напугать, задавить авторитетом, чтобы было страшно ему перечить и в итоге никто бы не смог его задушить
Нажмите, чтобы раскрыть...Я пару раз прочитал и так и не понял утверждений в первых двух абзацах. Куча каких-то новых терминов, чем отличается ссылка от копии ссылки, что такое идентификатор и чем отличается от переменной и тем более что такое алиас. В JS мы в принципе никак напрямую с памятью не взаимодействуем же. А уж в какой момент появилось принципиальное отличие строк от чисел вообще в тумане.
Можешь как то придумать код демонстрирующий твои утверждения и, главное, механизм фальсификации утверждений?
DrZoidberg сказал(а):↑почему дешевле?
Нажмите, чтобы раскрыть...ну может ты меня поправишь, но в моем понимании когда происходит сравнение допустим
"foo".repeat(9999) === "foo".repeat(9998)+"bar" то если бы сравнивались значения, то сравнивались бы поочередно буквы в индексах и если они не совпадают - выбрасывалось бы false.
По факту же сравниваются ссылки, которые намного короче.
Может это для кого-то очевидно, но я этого не знал.Теперь немного понимаю смысл иммутабельности.
какой-то Вася (2) сказал(а):↑И это крутой чел??
что ты тогда скажешь вот про этого чела? здесь он, например, за час портирует дум на свою собственную операционную систему.
Нажмите, чтобы раскрыть...крутяк, я не разработчик игр, мне всё равно
DrZoidberg сказал(а):↑Я пару раз прочитал и так и не понял утверждений в первых двух абзацах. Куча каких-то новых терминов, чем отличается ссылка от копии ссылки, что такое идентификатор и чем отличается от переменной и тем более что такое алиас. В JS мы в принципе никак напрямую с памятью не взаимодействуем же. А уж в какой момент появилось принципиальное отличие строк от чисел вообще в тумане.
Можешь как то придумать код демонстрирующий твои утверждения и, главное, механизм фальсификации утверждений?
Нажмите, чтобы раскрыть...есть такое, когда прочитал то решил что я тупой
InversionSpells сказал(а):↑ну может ты меня поправишь, но в моем понимании когда происходит сравнение допустим
"foo".repeat(9999) === "foo".repeat(9998)+"bar" то если бы сравнивались значения, то сравнивались бы поочередно буквы в индексах и если они неНажмите, чтобы раскрыть...Довольно странно притягивать свою логику и ощущение "мне кажется" к чему то, работающему сильно иначе чем человеческий мозг. Я лично проверял, разницы в скорости особой не заметил ни в строках, ни в числах, ни в объектах. Так-то согласно этому видео, надо залезть в спеку и посмотреть, но эмпирически разницы никакой.
DrZoidberg сказал(а):↑Я пару раз прочитал и так и не понял утверждений в первых двух абзацах. Куча каких-то новых терминов, чем отличается ссылка от копии ссылки, что такое идентификатор и чем отличается от переменной и тем более что такое алиас. В JS мы в принципе никак напрямую с памятью не взаимодействуем же. А уж в какой момент появилось принципиальное отличие строк от чисел вообще в тумане.
Можешь как то придумать код демонстрирующий твои утверждения и, главное, механизм фальсификации утверждений?
Нажмите, чтобы раскрыть...
суть в том, что, например, если передавать объект (например, obj = {x: 1, y: 2}) в качестве параметра в функцию (foo(obj)), а потом в этой функции поменять значение obj (obj={ghoul: 993}), то при передаче по ссылке (by reference)? obj снаружи поменяется тоже. Если же, как в жс - "передача по разделению" (by sharing) , то если мы в функции поменяем значение, то внешний obj останется прежним, а внутренний obj в функции просто изменит ссылку. Т.е. алиас, как в by reference значит, что переменная "олицетворяет" собой другую переменную. Иными словами, в жс значение переменных — ссылки, а присваивание значения — присваивание ссылки, а в by reference, всё-таки, сам объект является значением. Вот, что я имел в виду и как это понимаю. А переменной я называю идентификатор, потому что привык и все так делают. Кстати, формально, считается, что в ЖС присваивается by value (значение), но только значение - копия ссылки. Тут вопрос терминологии
Про числа и строки просто коды скину и сколько памяти занимают:var gay = {}
for (let i=0; i<1000000; i++) {
gay = String(i)
}Это занимает 27MB
var gay = {}
for (let i=0; i<1000000; i++) {
gay = '9999999'
}
Это занимает 6,9MB
Также если просто так сделать 2 переменные с огромными одинаковыми строками, то будет память занята, как от одной здоровенной, а если в одной из этих строк изменить символ какой-нибудь, то сразу размер вырастет почти в 2 раза. С числами так не работает. Да и этот тоже сказал именно про строку, а не просто про примитивы
falitan сказал(а):↑
суть в том, что, например, если передавать объект (например, obj = {x: 1, y: 2}) в качестве параметра в функцию (foo(obj)), а потом в этой функции поменять значение obj (obj={ghoul: 993}), то при передаче по ссылке (by reference)? obj снаружи поменяется тоже. Если же, как в жс - "передача по разделению" (by sharing) , то если мы в функции поменяем значение, то внешний obj останется прежним, а внутренний obj в функции просто изменит ссылку. Т.е. алиас, как в by reference значит, что переменная "олицетворяет" собой другую переменную. Иными словами, в жс значение переменных — ссылки, а присваивание значения — присваивание ссылки, а в by reference, всё-таки, сам объект является значением. Вот, что я имел в виду и как это понимаю. А переменной я называю идентификатор, потому что привык и все так делают. Кстати, формально, считается, что в ЖС присваивается by value (значение), но только значение - копия ссылки. Тут вопрос терминологии
Про числа и строки просто коды скину и сколько памяти занимают:var gay = {}
for (let i=0; i<1000000; i++) {
gay = String(i)
}Это занимает 27MB
var gay = {}
for (let i=0; i<1000000; i++) {
gay = '9999999'
}
Это занимает 6,9MB
Также если просто так сделать 2 переменные с огромными одинаковыми строками, то будет память занята, как от одной здоровенной, а если в одной из этих строк изменить символ какой-нибудь, то сразу размер вырастет почти в 2 раза. С числами так не работает. Да и этот тоже сказал именно про строку, а не просто про примитивы
Нажмите, чтобы раскрыть...String(i) - это не строка.
gay = '9999999' - а это не число.
Сорри, но ощущение, что у тебя афазия какая-то.
О том, как в функцию передаются параметры чуваку стоило бы выяснить, а так он начал доказывать отсутствие примитивных типов через ложный эксперимент и доказал вообще иное (ну и что чувак в видео ошибся).
DrZoidberg сказал(а):↑String(i) - это не строка.
gay = '9999999' - а это не число.
Сорри, но ощущение, что у тебя афазия какая-то.
О том, как в функцию передаются параметры чуваку стоило бы выяснить, а так он начал доказывать отсутствие примитивных типов через ложный эксперимент и доказал вообще иное (ну и что чувак в видео ошибся).
Нажмите, чтобы раскрыть...
String() преобразует параметр в строку
и эта строка записывается а объект. Суть примеров, что я скинул в том, что в первом случае миллион разных строк (число i переводится в строку), а во втором примере миллион одинаковых строк. В первом случае расход памяти значительно больше, что указывает на то, что в память не записываются одинаковые строки, т.е. не дублируются, в отличии от массивов и объектов (можно это и без цикла проверить, просто двумя большими строками, но сюда не вставить, но работает это аналогично)
Я же написал, что для чисел не скидывал пример, потому что они так не работают — память потребляется одинаково.
falitan сказал(а):↑
String() преобразует параметр в строку
и эта строка записывается а объект.
Нажмите, чтобы раскрыть...Нет, не преобразует. Есть обратное преобразование, что когда ты используешь объект String в большинстве случаев JS приводит String(value) к value через вызов метода valueOf(), который для всех таких оберток и возвращает примитивное значение. Именно по этому сложно рассмотреть разницу, но она проявляется в использовании памяти (и в некоторых других моментах, например в функции eval и создании функкции через конструктор функции типа new Function(). Есть и противоположно действующие механизмы, когда ты вызываешь, например, метод над примитивным значением типа 'helloworld'.toUpperCase() примитивное значение сначала оборачивается в объект String, а уже затем используется метод.
Можешь вот тут почитать https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_primitives_and_string_objects
или непосредственно в спеке.
InversionSpells сказал(а):↑хз глянь трансляции, разбирает js/html под капотом
Нажмите, чтобы раскрыть...а зачем эта духота что там под капотом? жс придумали решать бизнес задачи, и фреймворки туда же.
тебе на работе надо быстро нпм либ поставить связать и в прод, а не сидеть ковырятся что там у жс под капотом, за это не платят
Dyler Turden сказал(а):↑Бэкендера порвало ?
Нажмите, чтобы раскрыть...бекенд спокойно и хорошо пишется на js ts
это скорее всего обычный клоун 1с битрикс
какой-то Вася (2) сказал(а):↑И это крутой чел??
что ты тогда скажешь вот про этого чела? здесь он, например, за час портирует дум на свою собственную операционную систему.
Нажмите, чтобы раскрыть...это типо круто или че? за час там примерно понятно что он делал, код перекинул либы поменял.
обычный еникейщик
DrZoidberg сказал(а):↑Напрямую нет, но знание некоторых таких штук улучшает прохождение интервью и, в конечном счете, увеличивает ЗП. Для собственно работы не пригождалось.
Нажмите, чтобы раскрыть...у фронтендеров все интервью примерно похожи плюс минус. гуглишь любой собес видеозапись 2022 года и смотришь что за вопросы. везде одинаковое. база jsовская, что такое евент лупы, что такое замыкания и т.д потом быстро по реакту какому то пробежались и лайв код. все вопросы можно задрочить даже не зная и не понимая что это. собесы по фронту на джуна и мидла реально проходятся легко. даже есть список вопросов и ответов.
а вот эта душнина как оно под капотом работает - не совсем понятно как поможет в подготовке к собесам, так как про это обычно и не спрашивают.
Podpivasik сказал(а):↑а вот эта душнина как оно под капотом работает - не совсем понятно как поможет в подготовке к собесам, так как про это обычно и не спрашивают.
Нажмите, чтобы раскрыть...Если хорошо и быстро проходишь предыдущие пункты (согласен, что в основном интервью одинаковы), могут спросить. Ну или ты сам во время объяснений можешь более глубоко залезть. Но да, в целом это совсем необязательный факультатив, который нужен только если занимаешься оптимизацией, ну или какой-то хитрый баг правишь.
DrZoidberg сказал(а):↑Нет, не преобразует. Есть обратное преобразование, что когда ты используешь объект String в большинстве случаев JS приводит String(value) к value через вызов метода valueOf(), который для всех таких оберток и возвращает примитивное значение. Именно по этому сложно рассмотреть разницу, но она проявляется в использовании памяти (и в некоторых других моментах, например в функции eval и создании функкции через конструктор функции типа new Function(). Есть и противоположно действующие механизмы, когда ты вызываешь, например, метод над примитивным значением типа 'helloworld'.toUpperCase() примитивное значение сначала оборачивается в объект String, а уже затем используется метод.
Можешь вот тут почитать https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#string_primitives_and_string_objects
или непосредственно в спеке.Нажмите, чтобы раскрыть...Так String() же именно в примитив преобразует. Это new String() создаёт объект с valueOf() = string
DrZoidberg сказал(а):↑почему дешевле?
Нажмите, чтобы раскрыть...Смотря что сравниваешь. Если откинуть разные факторы аля оптимизации и прочего, а взять тупо базу, то объяснить это можно так.
Знаешь ведь что такое стек и куча?
Самое основное, что надо знать про стек, так это то что он очень быстрый. Если очень грубо, то процессору надо сделать одну операцию, что бы взять оттуда значение.
Куча –– медленная. Очень много сложных методов управления памятю, всякие поколения и другая непонятная фигня, сложно короче.
В стеке всегда хранятся ссылки на объекты и примитивы(primitive type).
К примеру, у java есть 8 примитивов: boolean , byte , char , short , int , long , float and double.
.NET: Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, Single.
Когда ты сравниваешь по ссылке, тебе нужно лезть только в стек. Когда ты сравниваешь по значению, если это не primitive type тебе надо лезть в кучу, чтобы оттуда взять значения, которые ты будешь сравнивать.
Обычно, когда ты пишешь свой equals метод для своего класса, то в начале принято проверить являются ли ссылки одинаковые(т.к. быстрее на случай если они ссылаются на один адрес, вот типичный equals в .NET и там мелкий коммент для ReferenceEquals), а потом ты уже начинаешь сравнивать поля, аля длину, id и так далее.
DrZoidberg сказал(а):↑Я лично проверял, разницы в скорости особой не заметил ни в строках, ни в числах, ни в объектах.
Нажмите, чтобы раскрыть...Я конечно за javascript пояснить не могу. Не пишу на нем. Но со строками и числами понятно, в javascript они оба примитивы.
По поводу объектов, тут ещё зависит что и как сравнивать. Если ты напишешь свой метод equals и будешь сравнивать по полям, а не просто сравнишь два класса как a == b(т.к. первые 6 проверок внутри ничем не отличаются от ===, например, если типы одинаковые, то он проверит по ссылке и т.д.), то разница должна быть. Опять же, я не специалист по javascript, но вот я написал бенчмарк
(можно открыть картинку в full size в новом окне)
"equals x 575,909,746 ops/sec ±1.00% (98 runs sampled)"
"=== x 1,540,886,506 ops/sec ±3.50% (75 runs sampled)"
"== x 1,620,282,133 ops/sec ±4.24% (68 runs sampled)" - тож самое, что и === т.к. типы одинаковые и он проверил по ссылке.
"Fastest is ==,==="
Как мы видим, классический equals медленнее без проверки на ссылку в начале. Если мы добавим проверку, то он станет быстрее(хотя, почему-то он все равно будет отставать на пару %, но эта библиотека benchmark немного странная, т.к. иногда тесты не запускала, мб я что-то не так делаю).
falitan сказал(а):↑Странный чел, много бычит - показатель неуверенности. По поводу скорости работы let и var - прикольно, но по поводу того, как передаются переменные (по ссылке, по значению) уже что-то стрёмно: говорит, что не так, но нормально объяснить, как на самом деле не может. Вроде как, утверждает,что даже примитивы передаются через ссылку (я знаю про by sharing), показал пример со строкой, но с числом такое же не проходит. Дальше орёт про то, что нет примитивных типов данных, а есть примитивные значения. Иииии что? Какая разница? Конечно, лучше Минина, но это не показатель
Нажмите, чтобы раскрыть...Кто хоть немного изучал Си, у того вопросов про ссылочный тип (указатель, держащий адрес данных в куче, созданные через malloc/calloc/new) и обычных переменных в функциях, которые лежат в стеке, нет.
Вопрос только в том, как этл реализовано в том или ином языке.
Например, в шарпе класс - ссылочный, а структура - переменный тип.
В плюсах вообще рофл полный. Структура и класс - одно и то же. Разница только в модификаторе доступа по умолчанию
Тема закрыта
-
ЗаголовокОтветов ПросмотровПоследнее сообщение
-
Сообщений:1
Просмотров:1
-
Сообщений:1
Просмотров:2
-
внук берии 21 Dec 2024 в 14:31Сообщений: 2 21 Dec 2024 в 14:31
Сообщений:2
Просмотров:6
-
Сообщений:2
Просмотров:4
-
Сообщений:9
Просмотров:18
