
Когато започнах да изучавам JavaScript, първото нещо, което направих, беше да съставя списък с техники, които ми помагаха да спестявам време. Взех ги назаем от други програмисти, от различни сайтове и ръководства.
В тази статия ще покажа 12 отлични начина за подобряване и ускоряване на JavaScript кода си. В повечето случаи те са универсални.
Напомняме: за всички читатели на "Хабра" — отстъпка от 10 000 рубли при записване на всякакъв курс на Skillbox с промокод "Хабр".
Skillbox препоръчва: Практически курс .
Филтриране на уникални стойности
МАСИВИ
Типът обект Set беше въведен в ES6, а с ... операторът spread можем да го използваме за създаване на нов масив, съдържащ само уникални стойности.
const array = [1, 1, 2, 3, 5, 5, 1]
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // Резултат: [1, 2, 3, 5]В стандартна ситуация, за извършване на същата операция, е необходимо значително повече код.
Тази техника работи за масиви, съдържащи примитивни типове: undefined, null, boolean, string и number. Ако работите с масив, съдържащ обекти, функции или допълнителни масиви, ще ви трябва друг подход.
Дължина на кэширания масив в цикли
ЦИКЛИ
Когато изучавате for за цикли, следвате стандартна процедура:
for (let i = 0; i < array.length; i++){
console.log(i);
}Въпреки това, с този синтаксис цикълът for проверява дължината на масива при всяка итерация.
Понякога това може да бъде полезно, но в повечето случаи е по-ефективно да кэшираш дължината на масива, което изисква едно единствено извикване. Можем да го направим, като определим променлива за дължината, където задаваме променливата i, например така:
for (let i = 0, length = array.length; i < length; i++){
console.log(i);
}В принцип, почти същото като горното, но при увеличаване на размера на цикъла, ще получим значителна икономия на време.
Оценка на краткото замикване (оценка Маккарти)
УСЛОВНИ ОПЕРАТОРИ
Тернарният оператор е бърз и ефективен начин за написване на прости (а понякога и не много прости) условни изрази:
x > 100? "повече от 100": "по-малко от 100";
x > 100? (x > 200? "повече от 200": "между 100-200"): "по-малко от 100";
Но понякога дори тернарният оператор е по-сложен от необходимото. Вместо него можем да използваме логическите оператори 'и' && и 'или' || за оценка на някои изрази по-стегнат начин. Често го наричат "кратко замикване" или "оценка на краткото замикване".
Как работи това
Да кажем, че искаме да върнем само едно от две или повече условия.
Използването на && ще върне първото false значение. Ако всеки операнд е оценен като true, ще бъде върнато последното изчислено изразяване.
let one = 1, two = 2, three = 3;
console.log(one && two && three); // Резултат: 3
console.log(0 && null); // Резултат: 0Използването на || ще позволи да се върне първото true значение. Ако всеки операнд е оценен като false, ще бъде върнато последното изчислено значение.
let one = 1, two = 2, three = 3;
console.log(one || two || three); // Резултат: 1
console.log(0 || null); // Резултат: nullПример 1
Да кажем, че искаме да върнем length на променливата, но не знаем нейния тип.
В този случай можем да използваме if/else за проверка дали foo е подходящ тип, но този метод може да се окаже твърде дълъг. Затова е по-добре да използваме нашето „късо замикане“.
return (foo || []).length;Ако променливата foo има подходящ length, то той ще бъде върнат. В противен случай ще получим 0.
Пример 2
Имахте ли проблеми с достъпа до вложен обект? Може да не знаете дали обектът или едно от неговите подсвойства съществува, което може да доведе до проблеми.
Например, искахме да получим достъп до свойството data в this.state, но data не е определено, докато нашата програма не върне запитване за извличане.
В зависимост от това къде го използваме, извикването на this.state.data може да попречи на стартирането на приложението. За да решим проблема, можем да го обвием в условно изразяване:
if (this.state.data) {
return this.state.data;
} else {
return 'Fetching Data';
}По-подходящ вариант би било използването на оператора „или“.
return (this.state.data || 'Fetching Data');Не можем да променим кода по-горе, за да използваме &&. Операторът ‘Fetching Data’ && this.state.data ще върне this.state.data независимо от това дали е undefined или не.
Опционална верига
Може да предложите да се използва опционална верига при опит за извличане на свойство дълбоко в дървовидна структура. Символът на въпросителен знак ? може да се използва за извличане на свойството само ако то не е равно на нула (null).
Например, можем да извършим рефакторинг на примера по-горе, получавайки this.state.data?.. (). Тоест data се връща само ако стойността не е null.
Или, ако е важно дали state е определен или не, можем да върнем this.state?.data.
Преобразуване в Boolean
ПРЕОБРАЗУВАНЕ НА ТИПОВЕТЕ
Освен стандартните логически функции true и false, JavaScript също така разглежда всички останали стойности като truthy или falsy.
Докато не е посочено друго, всички стойности в JavaScript са истински, с изключение на 0, «», null, undefined, NaN и, разбира се, false. Последните са фалшиви.
Лесно можем да превключваме между тях, използвайки оператора !, който също преобразува типа в логически.
const isTrue = !0;
const isFalse = !1;
const alsoFalse = !!0;
console.log(true); // Резултат: true
console.log(typeof true); // Резултат: "boolean"Преобразуване в низ
ПРЕОБРАЗУВАНЕ НА ТИПОВЕТЕ
Бързото преобразуване на цяло число в низ може да се извърши по следния начин.
const val = 1 + "";
console.log(val); // Резултат: "1"
console.log(typeof val); // Резултат: "string"Преобразуване в цяло число
ПРЕОБРАЗУВАНЕ НА ТИПОВЕТЕ
Обратното преобразуване се извършва по следния начин.
let int = "15";
int = +int;
console.log(int); // Резултат: 15
console.log(typeof int); Резултат: "number"Този метод може да се използва и за преобразуване на логическия тип данни boolean в обикновени числови стойности, както е показано по-долу:
console.log(+true); // Резултат: 1
console.log(+false); // Резултат: 0Могат да има ситуации, когато + ще бъде интерпретиран като оператор за конкатенация, а не за събиране. За да се избегне това, е добре да използвате тилди: ~~. Този оператор е еквивалентен на израза -n-1. Например, ~ 15 е равно на -16.
Използването на две тилди последователно неутрализира операцията, защото — (- — n — 1) — 1 = n + 1 — 1 = n. С други думи, ~ -16 е равно на 15.
const int = ~~"15"
console.log(int); // Резултат: 15
console.log(typeof int); Резултат: "number"<Quick Powers
ОПЕРАЦИИ
Започвайки от ES7, можете да използвате оператора за повдигане на степен ** като съкращение за степени. Това е много по-бързо от използването на Math.pow (2, 3). Изглежда просто, но този момент е включен в списъка с трикове, тъй като не навсякъде се споменава.
console.log(2 ** 3); // Резултат: 8Не трябва да го бъркате с символа ^, който обикновено се използва за повдигане на степен. Но в JavaScript това е оператор XOR.
Пред ES7 съкращението ** можеше да се прилага само за степени с основание 2, използвайки оператора за побитово изместване наляво <<:
Math.pow(2, n);
2 << (n - 1);
2**n;Например, 2 << 3 = 16 е еквивалентно на израза 2 ** 4 = 16.
Float в цяло число
ОПЕРАЦИИ / ПРЕОБРАЗУВАНЕ НА ТИПОВЕ
При необходимост да преобразувате float в цяло число, можете да използвате Math.floor(), Math.ceil() или Math.round(). Но има и по-бърз начин, за това използваме |, т.е. оператора OR.
console.log(23.9 | 0); // Резултат: 23
console.log(-23.9 | 0); // Резултат: -23Поведенческите характеристики зависят в значителна степен от това дали имате работа с положителни или отрицателни числа, поради което този метод е подходящ само ако сте сигурни в действията си.
n | 0 премахва всичко след десетичната запетая, закръглявайки числото с плаваща запетая до цяло число.
Можете да постигнете същия ефект на закръгляне, като използвате ~~. След принудително преобразуване в цяло число стойността остава непроменена.
Премахване на заключващи числа
Операторът OR може да се използва, за да премахнете произволен брой цифри от числото. Това означава, че не е необходимо да преобразувате типовете, както тук:
let str = "1553";
Number(str.substring(0, str.length - 1));Вместо това просто пишем:
console.log(1553 / 10 | 0) // Резултат: 155
console.log(1553 / 100 | 0) // Резултат: 15
console.log(1553 / 1000 | 0) // Резултат: 1Автоматично свързване
КЛАСОВЕ
ES6 стрелковите обозначения могат да се използват в класовите методи, като по този начин се подразбира свързването. Благодарение на това можете да се сбогувате с повторението на изрази, като this.myMethod = this.myMethod.bind(this)!
импортиране на React, { Компонент } от React;
експорт по подразбиране клас App разширява Компонент {
конструктор(пропс) {
супер(пропс);
това.състояние = {};
}
моятМетод = () => {
\/\/ Този метод е свързан имплицитно!
}
рендер() {
върни (
<>
<div>
{този.моятМетод()}
</div>
</>
)
}
};Обрязване на масив
МАСИВИ
Ако трябва да премахнете стойности от масив, има по-бързи методи от splice().
Например, ако знаете размера на оригиналния масив, можете да пренастроите свойството length по следния начин:
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
array.length = 4;
console.log(array); // Резултат: [0, 1, 2, 3]Но има и още един метод, който е по-бърз. Ако скоростта е важна за вас, ето нашият избор:
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
array = array.slice(0, 4);
console.log(array); // Резултат: [0, 1, 2, 3]Извеждане на последната стойност (стойности) на масив
МАСИВИ
Тази техника изисква използването на метода slice().
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(array.slice(-1)); // Резултат: [9]
console.log(array.slice(-2)); // Резултат: [8, 9]
console.log(array.slice(-3)); // Резултат: [7, 8, 9]Форматиране на JSON код
JSON
Може би вече сте използвали JSON.stringify. Знаете ли, че той помага за форматиране на вашия JSON?
Методът stringify() приема два необходими параметъра: функция replacer, която можете да използвате за филтриране на показания JSON и стойността space.
console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, 't'));
// Резултат:
// '{
// "alpha": A,
// "beta": B
// }'И това е всичко, надявам се, че всички изброени техники са били полезни. А какви трикове знаете вие? Споделете ги в коментарите.
Skillbox препоръчва:
- Двугодишен практически курс .
- Онлайн курс .
- Практически годишен курс .
Източник: habr.com
