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 / replaceMatches.js
Created August 28, 2021 00:27
Text replacer, it replaces source string with special keywords on required values
function replaceMatches(template, objReplacer, objData){
if(typeof template !== "string") return null;
if(typeof objReplacer !== "object") return template;
objData = objData || {};
for(let key of Object.keys(objReplacer)){
if(!Object.hasOwnProperty.call(objData, key)) continue;
template = template.replace(new RegExp(objReplacer[key],"g"), objData[key])
}
return template;
}
@dSalieri
dSalieri / closestPoint.js
Created August 31, 2021 06:16
Finds closest value in sorted array
function closestPoint(arr, point){
if(!Array.isArray(arr)) return [];
point = Number.isFinite(point) ? point : 0;
let prevDiff = Infinity;
let result = arr.findIndex((value,key) => {
let diff = Math.abs(value - point);
return diff >= prevDiff ? true : (prevDiff = diff, false);
});
result = result === -1 ? arr.length - 1 : result - 1;
return {key: result, value: arr[result]};
@dSalieri
dSalieri / eventLoop.js
Last active September 14, 2021 23:07
This is a picture how event loop works.
document.addEventListener("click", () => {
setTimeout(() =>{
Promise.resolve(13).then((value) => console.log(value));
console.log("click1");
})
})
document.addEventListener("click", () => {
setTimeout(() =>{
Promise.resolve(17).then((value) => console.log(value));
console.log("click2");
@dSalieri
dSalieri / renderNextFrame.js
Last active September 12, 2021 08:01
Invokes callback function next frame
function renderNextFrame(callback){
if(typeof callback !== "function") return;
requestAnimationFrame(() => {
requestAnimationFrame(() => {
callback();
});
});
}
@dSalieri
dSalieri / generatorColors.js
Last active November 19, 2022 12:42
There is used generator's principles, excellent example of it
function* generatorColors(options) {
options = Object.assign(
{
order: ["r", "g", "b"],
borders: {
r: [0, 255],
g: [0, 255],
b: [0, 255],
},
initials: {
@dSalieri
dSalieri / rand.js
Created September 19, 2021 08:05
Pseudorandom is based on Math.random function
function rand(start, end){
return start + (Math.round(Math.random() * Math.abs(start - end)));
}
@dSalieri
dSalieri / shallowSetEquality.js
Created September 20, 2021 04:53
Test on equality of sets
function shallowSetEquality(set1, set2){
if(!(set1 instanceof Set) || !(set2 instanceof Set))
throw Error("One of arguments or both is/are not instance of Set");
if(set1 === set2) return true;
let it1 = set1[Symbol.iterator]();
let it2 = set2[Symbol.iterator]();
while(true){
let {value: v1, done: d1} = it1.next();
let {value: v2, done: d2} = it2.next();
if(d1 === true || d2 === true) {
@dSalieri
dSalieri / shallowMapEquality.js
Created September 20, 2021 08:43
Test on equality of maps
function shallowMapEquality(map1, map2){
if(!(map1 instanceof Map) || !(map2 instanceof Map))
throw Error("One of arguments or both is/are not instance of Map");
if(map1 === map2) return true;
let it1 = map1[Symbol.iterator]();
let it2 = map2[Symbol.iterator]();
while(true){
let {value: v1, done: d1} = it1.next();
let {value: v2, done: d2} = it2.next();
if(d1 === true || d2 === true) {
@dSalieri
dSalieri / index.md
Last active January 12, 2022 19:45
Работа формальных параметров через спецификацию метода-ловушки construct у объекта Proxy

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

Код:

const trapsObject = {
    construct(target, [args]){
        console.log(args); /// [1,2,3]
        return {};
    }
};
const Exo = new Proxy(Array, trapsObject);
@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).