As For JS
3.43K subscribers
130 photos
12 videos
4 files
375 links
As For JavaScript...
Обсуждения — @AsForJsTalks
Download Telegram
Использование 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
🔥30👍93😍2👀2❤‍🔥1👨‍💻1
Краткое ИГОГО тезисами:

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
🔥37👍5😍2
Про void

Современный V8, игнорирует спецификацию void как таковую.
И преобразовывает любой код с void к такому, который исполняется без него, с полсдещуюей вставкой undefined

Например код
function doThing() {};

void doThing();


На уровне V8, код будет приведен к следующему байт коду:
CallUndefinedReceiver0 r0, [0]
LdaUndefined


Эквивалентом этому коду на языке JavaScript будет:
function doThing() {};

(
doThing()
, undefined
)



Вместо ИГОГО
Современный V8 игнорирует void как самостоятельный оператор, и заменяет его альтернативным взаимозаменяемым кодом.
То есть с точки зрения проивзодительности, в отличии от махровых времен, сейчас никаких дополнительных расходов на использования void нет.
Пишите сколько влезет. V8 за вас заменит его на undefined.
👍25👌5
Попробуйте восстановить код таким образом, чтобы получить тот же результат который Вы видите в на скриншоте.
🔥10🤯5👍1
15-00 По Киеву

Я был в бешенстве от теста на Head Hunter, что заставило меня поковырять их код поглубже.
В результате выше нас только звезды.

Посмотрим до какого разгильдяйства доходят разработчики. И как этим можно воспользоваться в своих целях.

https://www.youtube.com/watch?v=CxD9xy_NmFQ
🤣25🔥7👍3😁1
00:30 по Киеву
По просьбам папищиков
Многократное прохождение теста javascript.ru без подглядывания в спецификацию
С разоблачением

https://www.youtube.com/watch?v=6H0e4c-SPgo
🔥16😁4🤣31
19-00 по Киеву

Реализация обьектов в V8.
Расхождения со спецификацией.
Производительность или как не мешать интерпретатору при работе с обьектами.

https://www.youtube.com/watch?v=KMrVKtVrJ3Q
🔥143👍2
Не зря я твой дом труба шатал

Мне показали уже три видео от сторонних авторов, которые вопят о производительности var/let/const

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

Вот пример видео.
Какие ошибки в тесте автора вы видите?


https://youtu.be/gUi5_WVsPFQ
😁18👀3
19-00 по Киеву
Разбор решений для задачи: Try To Hack My JavaScript - readyState

https://www.youtube.com/live/dsrPYivNgXc
13🔥4
Хочу поделиться радостью.

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

Вославим ВанДама!
🔥79👍8❤‍🔥5🤣3👌2😎2
Повод поломать мозги над тем, почему null єто Primitive Value которое связано с Object у которого нулевая/неопределенная структура.

Вспомните все что Вы слышали - про ошибку из за которой null это Object, прочие рассуждения...
И задайте себе вопрос - какой единственный тип мы можем использовать в случае определения прототипа?
А потом вспомните, что Вы можете передать в
Object.setPrototypeOf( {}, {} ); // Ok
Object.setPrototypeOf( {}, null ); // Ok
Object.setPrototypeOf( {}, undefined ); // throw
Object.setPrototypeOf( {}, 'aaa' ); // throw
// etc...
🔥91👍1
6-30 по Киеву.
Для тех кому нечего делать, новая задача из цикла: try to hack my JavaScript.

Задача найти магическое слово, спрятанное в одной из функций.

Вопрос не в том, чтобы сообщить слово, но в том, чтобы рассказать - КАК его удалось найти.

https://www.youtube.com/watch?v=FeLs8aJF2wk
🔥15