einzigartig([1, 2, 3, 4, 5]) // [1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5]
if(arr[i] !== arr1[j])
ведь и i и j пробегают все элементы массиваCOUNT()
- это агрегатная функция.!
- это булево отрицание. И он приводит свой аргумент к типу boolean. Автор не открыл Америку, и это используется. Но использовать нужно с умом.false
- это undefined
, null
, ''
(пустая строка), 0
, 0n
(bigint 0), NaN
.!!
- это всего лишь 2 идущих подряд оператора !
, это такое популярное сокращение для быстрого каста к boolean.!!!
, но это бессмысленно, так как тройное отрицание даст тоже самое что и одинарное. number | string | symbol
type MyFunc = <N extends string>() => (N extends string ? Field<N> : never)[];
но возвращаемый тип так же будет юнионом:({ name: "town" } | { name: "city" })[]
"town" | "city"
это тоже самое, что и тип "city" | "town"
.type MyFunc = <N extends string[]>() => {
[K in keyof N]: N[K] extends string ? Field<N[K]> : never;
};
myFunc<["town", "city"]>()
as const
, что так же делает его readonly массивом. Но принимать аргументы через readonly там где нам не нужно их мутирорвать - это вообще хорошая практика. Полный пример будет выглядеть так:Иначе говоря, в ООП-шном стиле и в функциональном (если я правильно понимаю).в обоих случаях процедурный стиль
Пока возникает ощущение, что всё это - сугубо вкусовщинаПо сути да, чисто вкусовщина.
const controller = { login }
export default controller
на export default login
Но для ноды terser редко используют for (const letter of target) {
if ( letter.toLowerCase() !== letter.toUpperCase() ) {
direct = letter + direct;
reversed = letter + reversed;
}
}
target.split('').reverse().join('')
0
), другая на конец строки (изначальный индекс target.length - 1
).function truncInteger(number, precision) {
return number - (number % precision);
}
console.log(truncInteger(1000040, 100));
console.log(truncInteger(1200040, 100));
function roundInteger(number, precision) {
return Math.round(number / precision) * precision;
}
console.log(roundInteger(1000040, 100));
console.log(roundInteger(1200040, 100));
console.log(roundInteger(1000080, 100));
console.log(roundInteger(1200080, 100));
Можете, пожалуйста, объяснить, что выполняет эта часть кода: (Membership || (Membership = {})Если в Membership не falsy значение (например объект), то передать ссылку на него в функцию, иначе (если в Membership undefined) присвоить в Membership новый объект и передать ссылку на него в функцию
И почему это всё обёрнуто в функцию?Сложно сказать, думаю кто-то скопировал код отсюда в код сюда и не стал париться, так как в обоих случаях есть declaration merging, о котором уже написал Aetae
но зачем скомпилированную версию называть отдельным именем и выделять под нее отдельный репозиторийdist репозиторий может автоматически разворачиваться на CDN через CI или push-хук, при этом в нем нет исходников и на него может быть ограниченный доступ на запись, а в репо с исходниками нет артефактов сборки. Кроме того можно быстро откатить кривой релиз через revert.
Что-то я не пойму в чем разница между pdf.js и pdfjs-dist?В одном лежат исходники, в другом собранные бандлы.