ar
Feedback
As For JS

As For JS

الذهاب إلى القناة على Telegram

As For JavaScript... Обсуждения — @AsForJsTalks

إظهار المزيد
3 192
المشتركون
-324 ساعات
-287 أيام
-6430 أيام
أرشيف المشاركات
6-30 по Киеву. Для тех кому нечего делать, новая задача из цикла: try to hack my JavaScript. Задача найти магическое слово, спрятанное в одной из функций. https://www.youtube.com/watch?v=FeLs8aJF2wk

Повод поломать мозги над тем, почему null єто Primitive Value которое связано с Object неопределенной структурой. Вспомните все что Вы слышали - про ошибку из за которой null это Object, прочие рассуждения... И задайте себе вопрос - какой единственный тип мы можем использовать в случае определения прототипа? А потом вспомните, что Вы можете передать в
Object.setPrototypeOf( {}, {} ); // Ok
Object.setPrototypeOf( {}, null ); // Ok
Object.setPrototypeOf( {}, undefined ); // throw
Object.setPrototypeOf( {}, 'aaa' ); // throw
// etc...

Хочу поделиться радостью. Один из наших соратников, обнаружил проблему в v8 с отслеживанием elements-transition, которую на официалном уровне признали багом и пообещали устранить. Вославим ВанДама!

19-00 по Киеву Разбор решений для задачи: Try To Hack My JavaScript - readyState https://www.youtube.com/live/dsrPYivNgXc

Не зря я твой дом труба шатал Мне показали уже три видео от сторонних авторов, которые вопят о производительности var/let/const Проблема только в том, что обоснование которое приводится в видео, заставляет сначала вырасти волосы на жопе а потом их шевелиться. Вот пример видео. Какие ошибки у автора вы видите? https://youtu.be/gUi5_WVsPFQ

19-00 по Киеву Реализация обьектов в V8. Расхождения со спецификацией. Производительность или как не мешать интерпретатору при работе с обьектами. https://www.youtube.com/watch?v=KMrVKtVrJ3Q

00:30 по Киеву По просьбам папищиков Многократное прохождение теста javascript.ru без подглядывания в спецификацию С разоблачением https://www.youtube.com/watch?v=6H0e4c-SPgo

15-00 По Киеву Я был в бешенстве от теста на Head Hunter, что заставило меня поковырять их код поглубже. В результате выше нас только звезды. Посмотрим до какого разгильдяйства доходят разработчики. И как этим можно воспользоваться в своих целях. https://www.youtube.com/watch?v=CxD9xy_NmFQ

22-15 По Киеву Проходим тест на Head Hunter https://www.youtube.com/watch?v=NC5HMquGn4s

19-00 По Киеву Что такое Object согласно ECMAScript спецификации. Приходите - увидите как на обьекты можно смотреть совсем с другой стороны. https://www.youtube.com/watch?v=6FqwosOqJCs

3-15 по Киеву Tips and Tricks: Google Dev Tools и copy Закончено. длина 12 минут. Смотрите тайм коды https://www.youtube.com/watch?v=pvfM_oWFs-o

Попробуйте восстановить код таким образом, чтобы получить тот же результат который Вы видите в на скриншоте.
Попробуйте восстановить код таким образом, чтобы получить тот же результат который Вы видите в на скриншоте.

Про void Современный V8, игнорирует спецификацию void как таковую. И преобразовывает любой код с void к такому, который исполняется без него, с полсдещуюей вставкой undefined Например код
function doThing() {};

void doThing();
На уровне V8, код будет приведен к следующему байт коду:
CallUndefinedReceiver0 r0, [0]
 LdaUndefined
Эквивалентом этому коду на языке JavaScript будет:
function doThing() {};

(
    doThing()
   , undefined
)
Вместо ИГОГО Современный V8 игнорирует void как самостоятельный оператор, и заменяет его альтернативным взаимозаменяемым кодом. То есть с точки зрения проивзодительности, в отличии от махровых времен, сейчас никаких дополнительных расходов на использования void нет. Пишите сколько влезет. V8 за вас заменит его на undefined.

Что, согласно официальной спецификации, определяется как анонимная функция
Anonymous voting

Следующую трансляцию сделать О
Anonymous voting

06-30 По Киеву Почему Switch это синтаксический сахар к IF. Особенности оптимизаций. Множественные return https://www.youtube.com/watch?v=qW3iZCv7vSA

19-30 По Киеву Заключительная часть введения в язык ассемблера для JS программиста. Пишем вирус. https://www.youtube.com/watch?v=nCM2-bsdnKI

Краткое ИГОГО тезисами: 1. Современный V8 вынужден тратить больше ресурсов на исполнения кода для let/const declaration. 2. Возникновение этих издержек СТРОГО связано с использованием идентификаторов, заявленных при помощи let/const в функциональном окружении, которое отличается от того где они используются. 3. Окружение создаваемое Block Statement (Declarative Environment) не создает лишних издержек. Все сказанное касается ТОЛЬКО функционального окружения. 4. let/const declaration не имеет никаких отличий от var в том случае, если заявленный идентификатор используется ТОЛЬКО в том же функциональном окружении где и был объявлен идентификатор. 5. var подобных издержек не имеет. То есть производительность let/const всегда либо равна variable statement либо хуже. 6. Для var существует одно исключение связанное с объявлением идентификаторов в глобальном окружении. Где var покажет худшую в сравнении с let/const производительность. 7. Не забывайте, что function declaration согласно спецификации, выполняет те же шаги что и variable statement. Из чего следует, что если вы используете function declaration в Global Environment - вы создаете ненужную нагрузку на Agent исполняющий ваш код. 8. На текущий момент (начало 2024), let/const медленнее var на 7% +-2; На конец 2022 года, эта цифра была на уровне 15% +-5 9. Существуют еще дополнительные издержки возникающие на стадии Static Semantics для анализа кода с Let и Const. Все что описано ваше, касается только RunTime Semantics Дополнительные детали в документе от инженеров V8

Использование var/let/const в примерах Когда let/const не создаст никаких проблем с производительностью let/const не создаст вам никаких проблем при условии, если вы их используется СТРОГО в рамках одного функционального окружения:
function doExampleWhereAllFineWithLet() {
   function doCalculateCirlceArea( theRadius ) {
       const PI = 3.14;
       let thePower = 2;
       return PI * theRadius ** thePower;
   }
   doCalculateCirlceArea( 10 );
}
doExampleWhereAllFineWithLet();
Оба идентификатора( thePI, thePower ), используются только в том функциональном окружении, в котором они заявлены. Производительность этого кода будет на 100% идентична случаю, если бы мы вместо let/const использовали var. Когда let/const начнут создавать проблемы с производительностью Проблемы возникают тогда, когда объявленный идентификатор начнете использовать за пределами того функционального окружения в котором был объявление.
function doExampleWhereWeHaveProblemsWithLet() {
   const PI = 3.14;
   let thePower = 2;
   function doCalculateCirlceArea( theRadius ) {
       return PI * theRadius ** thePower;
   }
   doCalculateCirlceArea( 11 );
}
doExampleWhereWeHaveProblemsWithLet();
Оба идентификатора ( thePI, thePower ) используются в другой функции (функциональное окружение отличается от того, где они были объявлены) В этом случае Вы получаете дополнительные издержки внтури функции doExampleWhereWeHaveProblemsWithLet Глубина вложенности не важна. Решение проблем производительности let/const через var Решением проблем let/const, для случаев использования идентификаторов в окружениях отличных от тех где этот идентификатор был создан, является замена let/const на var.
function doExampleWhereWeResolveThroughVar() {
   var PI = 3.14;
   var thePower = 2;
   function doCalculateCirlceArea( theRadius ) {
       return PI * theRadius ** thePower;
   }
   doCalculateCirlceArea( 11 );
}
doExampleWhereWeResolveThroughVar();
Одно исключение для var Замена let на var в случае, если идентификатор декларируется в глобальном окружении, напротив приведет к еще большим издержкам. То есть код вида:
var PI = 3.14;
var thePower = 2;
function doCalculateCirlceArea( theRadius ) {
   return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 7 );
Будет работать медленнее чем:
let PI = 3.14;
let thePower = 2;
function doCalculateCirlceArea( theRadius ) {
   return PI * theRadius ** thePower;
}
doCalculateCirlceArea( 8 );
Происходит это потому, что спецификация, для случая глобального окружения и variable statement, обладает своим особым поведением, которое создает дополнительные издержки: подобный идентификатор должен создать Property в Global Object. Что требует дополнительных издержек от Agent-а выполняешь го JS код. Чего не происходит в случае let/const. Так как для них подобное поведение не определено.
var theVarThing = 1;
console.log( globalThis.theVarThing ); // 1
console.log( theVarThing ); // 1

let theLetThing = 2;
console.log( globalThis.theLetThing ); // undefined
console.log( theLetThing ); // 2

Это все еще не все. Не смотря на то, что тема работы var/let/const для меня закрыта, и теперь за меня будут говорить инженеры v8, я анонсирую новый ахуху кейс при использовании let. Который всех снова поставит на рога. Я сам его только что случайно открыл. Но я Вам его не покажу, потому, что у вас документов нету. Все, в том числе и я, как остолопы тестировали издержки связанные с ThrowReferenceErrorIfHole, и никто не додумался посмотреть на то, как этот Hole инициализируется. А там, издержек в два раза больше Кому нечем заняться - попробуйте угадать где проблема. Вот код для теста.
function doAdd1( a, b ) {
  var theThing = 1;
  let theSummator = 0;
  function doSum() {
    for ( var i = 0; i < 10000; i++ ) {
      theSummator += theThing + i;
    }
  }
  doSum();
  return theSummator;
}

As For JS - إحصائيات وتحليلات قناة تيليجرام @asforjavascript