JavaScript — это язык, который уже много лет используется практически в каждом программном стеке.
Меняйте местами значения переменных без использования вспомогательных или временных переменных
Иногда нам нужно поменять местами значения переменных, и мы обычно делаем это, используя вспомогательные переменные или алгоритм замены XOR.
Однако в JavaScript этот обмен можно выполнить с помощью деструктурирующего присваивания, как вы можете видеть ниже:
let a = 1; let b = 2; [a,b] = [b,a]; console.log(a); // 2 coonsole.log(b); // 1
Делая это таким образом, код становится более читаемым, короче и выглядит чище, мы даже программируем его быстрее, и можно сэкономить несколько ресурсов.
Вы можете найти больше информации об этом синтаксисе по следующей ссылке:
Используйте console.table для печати структур данных.
Объект console
обеспечивает доступ к консоли отладки, из этого объекта мы обычно используем метод console.log()
для отображения его аргументов в консоли отладки.
Но у объекта консоли есть другие методы с другим использованием и функциональностью для отладки, которые практически не используются, или мы даже не знали об их существовании. Однако я считаю, что метод console.table()
является одним из самых интересных, поскольку он отображает табличные данные в виде таблицы.
Этот метод может отображать в консоли отладки значения простых структур данных в очень ясной и удобочитаемой форме, как вы можете видеть в следующем примере:
console.table({a:1, b:2});
Когда аргументом является массив, консоль выводит что-то похожее на вышеприведенное с той разницей, что в первой колонке таблицы (index) вместо свойств выводятся индексы массива, очень наглядный пример этого показан ниже:
console.table(['car', 'plane', 'bus', 'bike']);
Самое интересное, когда у нас есть структурированный массив таких же простых объектов, как в примере ниже:
console.table( [ { id: 1, name: 'foo', date: new Date('2023'), active: true, }, { id: 2, name: 'bar', date: new Date('2020'), active: false }, { id: 3, name: 'bran', date: new Date('2022'), active: true } ]);
Таким образом, информация отображается очень четко и понятно, что упрощает отладку коллекций структурированных данных. Этот метод весьма удобен для проверки и анализа данных, возвращаемых API.
Вы можете найти больше информации о методе console.table()
по следующей ссылке:
Функции генератора
Генераторы — это функции, из которых можно выйти, а затем повторно войти несколько раз, а их контекст (привязки переменных) будет сохранен при повторных входах.
Вызов функции-генератора не приводит к немедленному выполнению ее тела; вместо этого возвращается объект итератор для функции. Когда вызывается метод
next()
итератора, тело функции-генератора выполняется до первого выраженияyield
.
Метод
next()
возвращает объект со свойствомvalue
, содержащим полученное значение, и свойствомdone
, которое указывает, выдал ли генератор свое последнее значение, как логическое значение. Вызов методаnext()
с аргументом возобновит выполнение функции генератора, заменив выражениеyield
, где выполнение было приостановлено, аргументом изnext()
.
Оператор
return
в генераторе при выполнении завершит работу генератора (т. е. свойствоdone
возвращаемого им объекта будет установлено наtrue
).
В качестве примера я покажу вам ниже простую функцию генератора идентификаторов с пределом генерации идентификатора, который будет передан в качестве параметра:
function* idGenerator(max) {
var index = 0;
while (index <= max)
yield index++;
return true;
}
var idGen = idGenerator();
function* idGenerator(max) {
var index = 0;
while (index <= max)
yield index++;
return;
}
var idGen = idGenerator(2);
console.log(idGen.next().value); // 0
console.log(idGen.next().value); // 1
console.log(idGen.next().value); // 2
console.log(idGen.next().value); // undefined
/* It's the same example as above, but without reading the value directly to show the done property, that is set to true once the generator executes the return statement*/
idGen = idGenerator(2); /* Calling the generator again to reset it in the idGen variable. */
console.log(idGen.next()); // { value: 0, done: false }
console.log(idGen.next()); // { value: 1, done: false }
console.log(idGen.next()); // { value: 2, done: false }
console.log(idGen.next()); // { value: undefined, done: true }
Генераторы в JavaScript — особенно в сочетании с промисами — являются очень мощным инструментом для асинхронного программирования, поскольку они смягчают — если не полностью устраняют — проблемы с обратными вызовами, такие как Callback Hell и Inversion of Control. Однако еще более простое решение этих проблем можно получить с помощью асинхронных функций.
Эти генераторы могут иметь сложное использование, например возвращаемые значения yield, параметры генератора и yield или синтаксис yield*
для делегирования одному генератору внутри другого. Поскольку всего этого хватило бы на целый отдельный пост, лучше всего перейти по следующим ссылкам, чтобы найти хорошие объяснения, информацию и примеры:
Генераторы
Обычные функции возвращают только одно единственное значение (или ничего). Генераторы могут возвращать («выдавать) несколько значений, одно…javascript.info»
Параметры покоя
В JavaScript последний параметр функции может иметь префикс «...
», чтобы поместить в него все остальные параметры в виде массива.
Синтаксис остального параметра позволяет функции принимать неопределенное количество аргументов в виде массива, обеспечивая способ представления функций с переменным числом аргументов в JavaScript.
В следующем примере показана функция, которая печатает с помощью метода журнала первое значение и отображает с помощью метода таблицы оставшийся массив параметров:
const print = (first,...rest)=>{ console.log(first); console.table(rest) } print(1,2,3,4,5,6); /* 1| (index) | Values | |---------|--------| | 0 | 2 | | 1 | 3 | | 2 | 4 | | 3 | 5 | | 4 | 6 |
*/
print(1,2); /* 1| (index) | Values | |---------|--------| | 0 | 2 |
*/
Это имеет множество применений, но наиболее важным является то, что это улучшает удобство сопровождения кода, делает его чистым, облегчая чтение и понимание. По моему опыту, использование этого синтаксиса очень помогло мне с хорошими результатами, особенно при реализации рекурсивных функций.
Дополнительную информацию и примеры параметров Rest можно найти по следующей ссылке:
Найдите максимальное или минимальное значение в массиве
Это простой и легкий совет, который заключается в использовании синтаксиса распространения для вызова методов Math.hypot()
, Math.max()
иMath.min()
. Таким образом, мы можем напрямую передавать массивы в качестве аргументов этим методам для выполнения их операций с массивом, как в следующих примерах, чтобы найти максимальное и минимальное значение массива:
var array = [2, 8, 15, 4] console.log(Math.max(...array)); // 15 console.log(Math.min(...array)); // 2
Мы можем использовать Math.hypot()
квадратный корень из суммы квадратов массивов векторов, как в примере ниже:
const vector = [5, 3, 2, 1];
console.log(Math.hypot
(...vector)); // 6.244997998398398
Вы можете найти больше информации о синтаксисе распространения и математических методах по следующим ссылкам:
Сокращенное присвоение свойств объекта
Начиная с ECMAScript 2015 появились новые нотации инициализатора, такие как Shorthand property names
и Shorthand method names
, которые недостаточно известны, хотя их использование делает код более чистым, читабельным и понятным.
Эти нотации состоят из создания объектов из переменных без необходимости явно указывать имена свойств, поскольку имя свойства каждого значения совпадает с именем его переменной, это можно ясно увидеть в следующем фрагменте кода:
var name = 'bran'; console.log({bran}); // { name: 'bran' }
Например, мы можем использовать его для создания объекта из разных переменных или параметров, как показано ниже:
const displayAsObject = (name, color, active) => { console.log({name,color,active}) } displayAsObject('bran','red',true); /* { name: 'bran', color: 'red', active: true } */
Это довольно простой и тривиальный пример, но, несмотря на это, вы можете увидеть потенциал, который могут иметь эти обозначения. В моем случае это то, что я очень часто использую в формах, при создании тела POST-запросов, отладке переменных и особенно при программировании на React или React Native.
Вы можете увидеть больше информации и примеров об этом по ссылкам ниже:
Это все для этого поста, я еще знаю некоторые другие приемы, которые со временем опубликую. Но прежде всего я надеюсь, что они помогут вам писать более качественный код в целом (чистый, разборчивый, понятный и быстрый). В любом случае, если у вас есть какие-либо предложения или сомнения, вы можете оставить комментарий здесь без каких-либо проблем, я отвечу вам как можно скорее 😃👍
Привет!
Ссылки и информация об этом посте:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
- https://javascript.info/generators
- https://codeburst.io/understanding-generators-in-es6-javascript-with-examples-6728834016d5
- https://developer.mozilla.org/en-US/docs/Web/API/console/table
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment