Skip to content

Instantly share code, notes, and snippets.

View dSalieri's full-sized avatar
😒
Dark guardian always there!

dSalieri

😒
Dark guardian always there!
View GitHub Profile
@dSalieri
dSalieri / timer.js
Last active March 15, 2024 12:24
Timer based on setTimeout
/// Don't use interval less 5ms because web agents can't provide delay less than 4ms in due with optimization in nested setTimeout calls
/// But how the practice shows 5ms is lower border for this timer, because it accounts errors and evaluates corrected interval. That's is why 5ms the lowest interval of this timer.
function timer(callback, interval, duration, ...args) {
if (typeof callback !== "function") return;
const toNumberPositive = (value) => {
const n = Number(value);
return (n !== n || n < 0) ? 0 : n
};
@dSalieri
dSalieri / index.md
Last active March 14, 2024 20:11
Promise изнутри

Автор: dSalieri

Версия ECMAScript, используемая в объяснении: Draft ECMA-262 / June 24, 2022

Версия WHATWG, используемая в объяснении: Living Standard - 22 August 2022

Последнее изменение документа: 13.12.2022


@dSalieri
dSalieri / index.md
Last active March 13, 2024 06:36
Почему функция внутри Block не всегда перезаписывает глобальный идентификатор

Вопрос: Почему функция внутри Block не всегда перезаписывает глобальный идентификатор?

Код:

/// пример 1
{
    function a() {}
}
console.log(a); /// f a() {}
@dSalieri
dSalieri / index.md
Last active February 21, 2024 06:21
Исполнительные контексты в ECMAScript

Автор: dSalieri

Версия ECMAScript, используемая в объяснении: Draft ECMA-262 / February 19, 2024

Последнее изменение документа: 20.02.2024


Important

Раздел посвященный устройству спецификации [execution contexts][execution-contexts]. Так как спецификация сама отлично описывает данный механизм, то решено было просто перевести с внедрением некоторых пояснительных сносок.

@dSalieri
dSalieri / _index.md
Last active February 3, 2024 11:50
Promise.resolve/Promise.reject

Реализация двух конструкторных функций Promise.resolve и Promise.reject
Алгоритмы имеют зависимость от NewPromiseCapability

@dSalieri
dSalieri / _index.md
Last active February 1, 2024 08:29
Создание специальной записи возможности Promise / Promise.withResolvers момент

Изначально этот файл демонстрировал внутреннюю операцию [NewPromiseCapability] на языке js. Не так давно в 14 версию ECMAScript интегрировали API [Promise.withResolvers]. И всвязи с этим я хочу кое-что пояснить.

Для начала вспомним операцию [NewPromiseCapability]:

function NewPromiseCapability(C){
  if (!(C.prototype && C.prototype.constructor === C && typeof C === "function")) throw TypeError("C is not a constructor");
  const resolvingFunctions = {
    resolve: undefined,
    reject: undefined,
@dSalieri
dSalieri / _index.md
Last active December 1, 2023 07:44
Реализация специального объекта с определением типов данных

Цель: Расширить определение типов данных / Сделать работу с типами более гибкими

@dSalieri
dSalieri / _index.md
Last active November 21, 2023 08:56
IsConstructor попытка реализовать проверку на конструктор

Чтобы проверить является ли функция [конструкторной][constructor], нужно посмотреть есть ли у нее поле [[Construct]]. Нет ни единого варианта проверить это [напрямую][isconstructor]. Но есть два способа, которые мне известны:

  • Проверить поля, которые мы можем просмотреть с помощью кода js (быстрее).
  • Проверить поле [[Construct]], используя интерфейсы, которые это делают (медленнее).

К первому типу относится реализация prototype.js, ко второму newTarget.js, bind.js, proxy.js и reflect.js.

Также существует одна весомая разница; при проверке в newTarget.js, bind.js, proxy.js и reflect.js мы используем [[Construct]] поле, которое вызывается через операцию [Construct][construct-op] для создания объекта, чтобы убедиться, что объект создан, тем самым это докажет, что функция является конструкторной, но в этом и опасность если произойдет ошибка в алгоритме [[Construct]] проверяемая функция не пройдет проверку.

  • [[[Construct]]][builtin-Construct] для встроенных функций (пример: [Objec
@dSalieri
dSalieri / index.js
Last active November 6, 2023 13:48
Алгоритм SpeciesConstructor
/// Эта функция отсылка к спецификационному алгоритму https://tc39.es/ecma262/#sec-speciesconstructor
/// Смысл операции извлечь конструктор для переданного объекта
/*
Наверное вас смущает, что первая строчка кода могла бы решить этот вопрос,
но особенность в том что есть [Symbol.species], через который можно сообщить что использовать значение из
"constructor" вы не хотите, а хотите возспользоваться чем-то другим, решение - [Symbol.species]
*/
function SpeciesConstructor(O, defaultConstructor){
const C = Reflect.get(O, "constructor");
if(C === undefined) return defaultConstructor;
@dSalieri
dSalieri / index.md
Last active November 3, 2023 04:28
Как работает преобразование значений в примитив используя Symbol.toPrimitive, valueOf, toString

Очень интересная тема, на которой я давненько съел собаку при изучении. Теперь хотелось бы помочь закрыть чей-нибудь гештальт при изучении javascript.

Так как поведение внутренних механизмов изменилось со временем, то я обязан учесть этот факт. Итак начнем мы с ядра этого механизма, а затем рассмотрим частные случаи.

Алгоритм ToPrimitive(input[,preferredType]):

The abstract operation ToPrimitive takes argument input (an ECMAScript language value) and optional argument preferredType (string or number). It converts its input argument to a non-Object type. If an object is capable of converting to more than one primitive type, it may use the optional hint preferredType to favour that type. It performs the following steps when called:
1. If Type(input) is Object, then
    a. Let exoticToPrim be ? GetMethod(input, @@toPrimitive).