TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.
Но стоп, компиляция - это процесс перевода "человеческого" кода в машинный код.
In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).
function createCounter() {
let counter =0;
counter = counter - 10
const myFunction = function () {
counter = counter+1;
return counter
}
return myFunction
}
let z = createCounter() // Вернули в переменную z функцию "myFunction" у которой в замыкании есть counter.
// counter внутри на данный момент равен -10.
// Вызвали функцию и вывели результат в консоль.
// Так как внутри функции counter берётся из замыкания, то при вызове функции получаем
// -10 + 1
console.log(z()) // -9
// В данном примере - бесполезный ничего не делающий вызов.
// То есть создаётся ещё один НОВЫЙ счётчик, со своим замыканием, но он никуда не сохраняется.
createCounter()
// Снова вызвали функцию и вывели результат в консоль.
// -9 + 1
console.log(z()) // -8
где я допускаю ошибку
Второй вопрос откуда берется counter при втором вызове console.log(z())
const groupedArr = arr.reduce((acc, n) => {
const keys = n.slice(0, -1);
let group = acc.find(m => m.length === n.length && keys.every((k, i) => k === m[i]));
if (!group) {
acc.push(group = [ ...keys, 0 ]);
}
group[keys.length] += n[keys.length];
return acc;
}, []);
const groupedArr = arr.reduce((acc, n) => {
const keys = n.slice(0, -1);
const groups = keys.reduce((groups, k) => groups.set(k, groups.get(k) ?? new Map).get(k), acc[1]);
let group = groups.get(acc[2]);
if (!group) {
acc[0].push(group = [ ...keys, 0 ]);
groups.set(acc[2], group);
}
group[keys.length] += n[keys.length];
return acc;
}, [ [], new Map, Symbol() ])[0];
useEffect(() => {
fetch('https://prava74.ru/questions/AB/tickets/'+istr+'.json')
.then((response) => response.json())
.then((json) => setData(json))
.catch((error) => console.error(error))
.finally(() => setLoading(false));
}, []);
type FunctionDinamicParams = <T extends keyof TMap>(eventName: T, params: TMap[T]) => Promise<void>;
const obj = {
a: 69,
b: 187,
c: 666,
};
const proxy = new Proxy(obj, {
set(target, key, val) {
console.log(`${key} changed from ${target[key]} to ${val}`);
target[key] = val;
return true;
},
});
getDataByINN(myPersonPars['INN']).then((suggestion) => {
const myCompany = suggestion
})
<Note
removeElement={() => handleDelete(index)}
/>
const [notes, setNotes] = useState([тут ваши Notes])
const handleDelete = (index) => {
let newNotes = [...notes];
newNotes[index].splice(index, 1);
setNotes(newNotes);
};
indexOf()
, который возвращает -1
если не найдено, или индекс от 0
и больше.-1
или иное значение. Можно просто сравнивать if (a.indexOf(b) > -1) { /* найдено! */ }
но иногда хочется короче.~
хорош тем, что выделяет -1
: только -1
с этим оператором даст 0
. Прочие числа дадут какое-то ненулевое значение.~(-1) === 0
0
и больше получилось тоже ненулевое число, и !!
даст true
-1
получится уникальный 0
, и !!0
вернёт false
function truncateString(str, num) { // функция принимает два аргумента - саму строку и ограничение длины строки
if (str.length > num) { // если длина строки больше ограничения
return str.slice(0, num) + "..."; // обрезаем строку до ограничения, в конце добавляем многоточие (sic!) и возвращаем
} else { // в противном случае
return str; // возвращаем исходную строку
}
}