npm init
Для этого понадобится сначала установить на комп node
и npm
npm install ...
main.js
, где объединить ваш код и этот модульimport { Game } from 'js-chess-engine'; // 1-я строчка в файле main.js
const game = new Game();
// ... ваш код, взаимодействующий с game
Array.from(employees, ({name, age}) => `Имя: ${name}, возраст: ${age}`)
createCounter()
создаёт и возвращает новую функцию. С которой в комплекте идёт свой новый «чемодан» замыкания, в котором лежит своя переменная counter
. откуда беретсяcounter
при втором вызовеconsole.log(z())
createCounter()
класс1 И класс2
— чтобы непременно оба были в наличии у элемента, и тогда только его брать;класс1 ИЛИ класс2
— достаточно любого одного из двух, ну или оба, вообще супер.document.querySelector('.popup__close.popup__area'); // без пробела
document.querySelector('.popup__close, .popup__area'); // через запятую
querySelector()
выбирает первый подходящий найденный элемент. Один.querySelectorAll()
выберет все подходящие. const months = 'января|февраля|марта';
const re = new RegExp(`(\\d{1,2})\\s(${months})\\s(\\d{4})`);
'блаблаблаб ла блаб ла 10 января 2023 блаблабла'.match(re)
// [ "10 января 2023", "10", "января", "2023" ]
Mon Mar 20 2023 07:42:33 GMT+0300 (Moscow Standard Time)
(new Date(1679287353711))
.toISOString() // "2023-03-20T04:42:33.711Z"
.substring(11, 23) // "04:42:33.711"
;
Омонимы сидели в баре, развалившись, как баре.
\b
— работает только для ASCII, не годится для Unicode кириллицы./дум.?(?=$|\s)/u
– один опциональный символ, и смотреть вперёд, чтобы там был или конец строки или пробельный символ.const m = str => str.match(/дум.?(?=$|\s)/u);
m('ду') // null
m('дум') // ["дум"]
m('дума') // ["дума"]
m('думать') // null
Only functions defined as methods have access to thesuper
keyword.super.prop
looks up the property on the prototype of the object that the method was initialized on.
Свойство [[HomeObject]] определено для методов как классов, так и обычных объектов. Но для объектов методы должны быть объявлены именно как method(), а не "method: function()".
Для нас различий нет, но они есть для JavaScript.
const str = '1+1'; // строка
const result = eval(str); // 2
плохой кулхацкер передаст не "1+1", а злодейский код, который тупо выполнится и всё сломает.+ - * /
Разбить можно используя «регулярное выражение», или просто тупо искать в строке один из 4 операторов. С регуляркой примерно так: const str = '1+1'; // строка
const parts = str.match(/(\d+)([-+*\/])(\d+)/); // массив [ "1+1", "1", "+", "1" ]
if (!parts) throw 'не похоже на арифметику!';
const [ _, A, op, B ] = parts;
const a = +A; // из строки в число
const b = +B;
let result;
if (op === '+') result = a + b;
if (op === '-') result = a - b;
if (op === '*') result = a * b;
if (op === '/') result = a / b;
console.log('result', result); // 2
const arr = Array.from({ length: 50 }, (_, i) => i); // [0, 1, 2, 3, ... 49]
const pattern = [2, 5, 1, 2];
const result = [];
for (let i = 0, patternIndex = 0, toDeleteIndex = pattern[0] - 1; i < arr.length; i++) {
if (i === toDeleteIndex) {
patternIndex = (patternIndex + 1) % pattern.length; // 0, 1, 2, 3, 0, 1, 2, 3, ...
toDeleteIndex += pattern[patternIndex];
} else {
result.push(arr[i]);
}
}
console.log(result.join(', '));
// 0, 2, 3, 4, 5, 8, 10, 12, 13, 14, 15, 18, 20, 22, 23, 24, 25, 28, 30, 32, 33, 34, 35, 38, 40, 42, 43, 44, 45, 48
Такое задумывалось? this
для функции, объявленной как function
определяется в момент её вызова. Если её вызывают будто она свойство объекта, этот объект будет this'ом.this === window
.window
это не user
. И там нет искомого свойства, скорее всего. Или есть, но неожиданно другое. maxValues = { fullPrice: 123, rating: 5 };
minValues = { fullPrice: 103, rating: 3 };
const src = [{ id: 1, fullPrice: 123, rating: 5 }, { id: 2, fullPrice: 103, rating: 3 }];
const checkProps = ['fullPrice', 'rating'];
const xValues = (method, initialValue) =>
src.reduce((acc, c) => {
Object.entries(c).forEach(([key, value]) => {
if (checkProps.includes(key)) {
acc[key] = Math[method](acc[key], value);
}
});
return acc;
}, Object.fromEntries(checkProps.map(propName => [propName, initialValue])));
const minValues = xValues('min', Number.POSITIVE_INFINITY);
const maxValues = xValues('max', Number.NEGATIVE_INFINITY);
const result = src.map(item =>
Object.fromEntries(
Object.entries(item).map(([key, value]) => {
if (checkProps.includes(key)) {
return [key, { value, min: minValues[key] === value, max: maxValues[key] === value }];
}
return [key, value];
})
)
);
[
{
"id": 1,
"fullPrice": {
"value": 123,
"min": false,
"max": true
},
"rating": {
"value": 5,
"min": false,
"max": true
}
},
{
"id": 2,
"fullPrice": {
"value": 103,
"min": true,
"max": false
},
"rating": {
"value": 3,
"min": true,
"max": false
}
}
]
encodeURIComponent()
(new URLSearchParams({q: 'QnA Habr'})).toString()
// "q=QnA+Habr"
function foo(currentNumber){
console.log(currentNumber);
currentNumber++;
}
setInterval(foo, 1000, 5);
Здесь, наверное, понятно, почему будет каждый раз 5 ?foo(5); // выведет 5
foo(5); // выведет 5
foo(5); // выведет 5
Внутренняя переменная функции изначально 5, выводит 5 и становится 10. Функция завершила работу, про переменную все забыли. Как исправить готовый код?Код надо привести в вопросе, окружив тегом <code>
addEventListener('click', ...
click
выше, на общем родителе всех этих карточек – cardsContainer
. Всего один слушатель. В обработчике разбирать, по кому, собственно, кликнули: смотреть класс кликнутого элемента и искать ближайшую к нему карточку.cardsContainer.addEventListener('click', ({ target }) => {
if (target.classList.contains('element__button')) {
// toggle Like
target.classList.toggle('element__button_active');
} else if (target.classList.contains('element__basket')) {
// delete
target.closest('.element').remove();
} else if (target.classList.contains('element__item')) {
// open picture
openPicture({ target });
}
});
// и убрать всё ставшее ненужным