Как и любые другие приложения, приложения на JavaScript также должны быть хорошо написаны. В противном случае позже мы столкнемся со всевозможными проблемами.
В этой статье мы рассмотрим некоторые рекомендации по работе со стрелочными функциями. Также мы рассмотрим, почему и как избежать мутаций.
Не используйте геттеры и сеттеры
Поскольку геттеры и сеттеры вводят побочные эффекты, нам не следует использовать их, если мы хотим создавать функции, с которыми легко работать.
Например, мы не должны писать:
const person = { name: 'james', get age() { return this._age; }, set age(n) { if (n < 0) { this._age = 0; } else if (n > 200) { this._age = 200; } else { this._age = n; } } };
Также мы должны вызвать __defineGetter__
или __defineSetter__
:
person.__defineGetter__('name', () => { return this.name || 'james'; });
or:
person.__defineSetter__('name', (name) => { this.name = name.trim(); });
Вместо этого мы создаем чистые функции:
const restrictAge = (n, min, max) => { if (n <= min) { return min; } if (n >= max) { return max; } return n; } const setAge = (age, person) => { return Object.assign({}, person, { age: restrictAge(age, 0, 120 )}); }
Таким образом, у нас есть все чистые функции, и он более универсален, чем наша реализация установщика, поскольку мы можем изменять min
и max
.
Уменьшите использование петель
Большинство циклов в коде JavaScript можно переписать с помощью методов массива.
Это связано с тем, что уже существует множество методов, таких как map
, filter
и reduce
, которые могут позволить нам работать с массивами более коротким способом.
Поэтому вместо того, чтобы писать:
for (const a of arr) { result.push(a * 10); }
Мы можем написать:
const result = arr.map(a => a * 10);
Гораздо проще использовать map
, чем цикл for-of.
Не используйте Object.assign с переменной в качестве первого аргумента
Object.assign
изменяет первый аргумент.
Следовательно, чтобы использовать его таким образом, чтобы не изменять существующие данные, мы должны передать пустой объект в качестве первого аргумента.
Вместо того, чтобы писать:
const a = { foo: 1, bar: 2 }; const b = { baz: 3 }; Object.assign(a, b);
мы пишем:
const c = Object.assign({}, a, b);
Уменьшите использование методов мутирующих массивов
Поскольку у нас есть оператор распространения и альтернативные методы массива, мы можем избежать использования методов изменяющегося массива в нашем коде.
Например, вместо того, чтобы писать:
arr.pop();
Мы можем написать:
const arr = arr.slice(0, arr.length - 1);
Единственный, который сложнее заменить, - это sort
. В этом случае мы можем сделать его копию с помощью оператора распространения, а затем вызвать sort
для этого массива.
Итак, мы можем написать:
const copy = [...arr]; copy.sort();
Вместо splice
мы можем рассмотреть возможность использования filter
или slice
.
Если мы хотим удалить один элемент с данным индексом, мы можем написать:
const removed = arr.filter((a, i) => i !== index);
Затем мы удаляем элемент с индексом index
и присваиваем его новой переменной.
Сократите использование операторов-мутаций
Случайно изменить данные легко.
Поэтому мы можем захотеть избежать использования операторов мутации.
Например, мы можем захотеть избежать использования операторов +=
, /=
, -=
, %=
или *=
.
Вместо этого мы можем использовать немутантные методы массива или присваивать значения новой переменной.
Мы можем написать:
const b = a + 10;
вместо того:
a += 10;
Если нам нужно обновить переменную новыми значениями путем повторного добавления, мы можем использовать reduce
:
const total = arr.reduce((total, a) => total + a, 0);
Перед осторожностью с null или undefined
Мы всегда должны быть осторожны со значениями null
или undefined
, поскольку они являются источником множества ошибок.
Поэтому мы должны убедиться, что переменная или свойство не null
или undefined
, прежде чем работать с ними.
Чтобы проверить и то, и другое, мы можем написать:
if (val === null || val === undefined){ //... }
or:
if (val === null || typeof val === 'undefined'){ //... }
Заключение
Мы должны избегать мутации данных, чтобы случайно не изменить их.
Также проще протестировать функцию, которая не изменяет данные.
Кроме того, мы должны быть осторожны с null
или undefined
.