setTimeout(), a именно requestAnimationFrame()requestAnimationFrame() успел сработать дважды во время одного кадра и перерисовки не требуется.npm install ml-matrix документацияimport { Matrix } from 'ml-matrix';
const matrix = new Matrix(12, 31); const opts = this.selectedOptions;
const data = {
count: optionCount || 0, // значения по умолчанию
name : optionName || '',
info : optionChars || '',
price: optionPrice || '',
value: optionValue || '',
}
switch (type) {
case 'p':
case 'c':
case 'm':
case 'radio':
case 'button':
opts[type] = data;
break;
case 'disk':
opts[type + t.diskNumber] = data;
break;
case 'checkbox':
opts[type][`check${data.checkId}`] = data;
} const countr = str => {
const result = {};
const len = str.length;
for (let i = 0; i < len; i++) {
const char = str[i];
if (!result[char]) result[char] = 0;
result[char]++;
}
return result;
} нужно вернуть true если элементы массива отсортированны по возрастанию, а если нет то false. Что не так в коде?«Не так» здесь то, что никак не проверяется отсортированность массива.
false. true.function isSorted(arr) {
const length = arr.length;
if (length < 2) return true;
for (let i = 1; i < length; i++) {
if (arr[i] < arr[i - 1]) return false;
}
return true;
}
isSorted([1,2,2,5,9]) // true
isSorted([4,3,5,8,44,88,23,145]) // false(function(e) {}) === (function(e) {}) // falsefunction func(e) {
console.log(e.target.id);
}
// Назначить событие
document.body.addEventListener('click', func);
// И сразу его удалить
document.body.removeEventListener('click', func); const setPropChain = (obj, path, value) => {
path.split('.').reduce((acc, c, i, arr) => {
if (!acc.hasOwnProperty(c)) acc[c] = {};
if (typeof acc[c] !== "object") throw "Not an object prop " + c;
if (i === arr.length - 1) acc[c] = value;
return acc[c];
}, obj);
return obj;
}
// использование:
setPropChain({"test": 0}, "make.some.noise", "habr"){
"test": 0,
"make": {
"some": {
"noise": "habr"
}
}
} for (...) {
// что-то делается
if (condition) {
break; // досрочный выход из цикла
}
// ещё может что-то делается
}for, while можно оборвать, выйти из них с помощью breakArray.forEach() досрочно оборвать не удастся. каким образом допустим в этой функции мы используем массив(объект) не объявив егоОбъявляют переменные. Здесь обошлись без переменной.
5? return 5; — тут всё нормально.[1, 2, 3] // массив
{a: 1, b: 2} // объект
return [1, 2, 3]; // вернули массив
return {a: 1, b: 2}; // вернули объект
return [1, 2, 1 + 2]; // вернули массив, где что-то посчитали налету
return {a: 1, b: 1 + 1}; // вернули объект, что сложили в последний момент + является особенным оператором, исключением, отличающимся от других математических операторов.Почти все математические операторы выполняют численное преобразование. Исключение составляет +.Подробнее: https://learn.javascript.ru/type-conversions
Если одно из слагаемых является строкой, тогда и все остальные приводятся к строкам.
Тогда они конкатенируются (присоединяются) друг к другу:
alert( 1 + '2' ); // '12' (строка справа) alert( '1' + 2 ); // '12' (строка слева)
'42' / 2 // 21
'42' - 2 // 40
'42' * 2 // 84
'42' + 2 // "422" ¯\_(ツ)_/¯
1 + 2 + 3 + 4 + 5 // 15
1 + 2 + 3 + '4' + 5 // "645"+ работает слева-направо. Поэтому 1+2+3 всё ещё число, а дальше '4' заставляет переключиться на строки. arr[0] // первый элемент, объект:
{
variation: {
attributes: {
"attribute_pa_obem": "500-gr",
"attribute_pa_czvet-produkta": "c-110-goluboj"
}
}
}variation: arr[0].variation // там объект с единственным свойством "attributes"attributes: arr[0].variation.attributes // там объект с искомыми двумя свойствамиarr[0].variation.attributes["attribute_pa_obem"] // "500-gr"
arr[0].variation.attributes["attribute_pa_czvet-produkta"] // "c-110-goluboj"const ref = arr[0].variation.attributes;
ref["attribute_pa_obem"] // "500-gr"
ref["attribute_pa_czvet-produkta"] // "c-110-goluboj"arr[0].variation.attributes.attribute_pa_obem // "500-gr"
// или
ref.attribute_pa_obem // "500-gr" const arr = [0, 0, 0];
Object.freeze(arr); // ма-агия!
arr.unshift(100); // выбросит ошибку: нельзя менять свойство длины, оно non-writeable
arr[1] = 'z'; // ошибки не будет, но
console.log(arr) // [0,0,0] (s => `${s.substr(0,2)}.${s.substr(2,2)}.${s.substr(4)}`)('30032020')const format = (_, v) => {
const s = v.toString();
return `${s.substr(0,2)}.${s.substr(2,2)}.${s.substr(4)}`;
}
format`${30032020}`const num = 30032020; // число
const str = num.toString().padStart(8, '0'); // строка длиной 8 символов
const result = `${str.substr(0,2)}.${str.substr(2,2)}.${str.substr(4)}`; // "30.03.2020"requestAnimationFrame(), реже срабатывают таймеры. for(let i = 0; i < 18; i++){
let block = document.createElement('div');
field.appendChild(block);
block.classList.add('blocks');
block.addEventListener('click', event => onClick(event, i));
}