JavaScript Лучшие практики
Избегайте глобальных переменных, избегайте new
, избегайте ==
, избегайте eval()
Избегайте глобальных переменных
Сведите к минимуму использование глобальных переменных.
Сюда входят все типы данных, объекты и функции.
Глобальные переменные и функции могут быть перезаписаны другими скриптами.
Вместо этого используйте локальные переменные и узнайте, как использовать замыкания.
Всегда объявляйте локальные переменные
Все переменные, используемые в функции, должны быть объявлены как локальные переменные.
Локальные переменные должны быть объявлены с помощью ключевого слова var
или ключевого слова let
, иначе они станут глобальными переменными.
Строгий режим не допускает необъявленных переменных.
Объявления вверху
Хорошая практика программирования - помещать все объявления вверху каждого скрипта или функции.
Это даёт:
- Более чистый код
- Обеспечивает единое место для поиска локальных переменных
- Упрощает избежание нежелательных (подразумеваемых) глобальных переменных
- Уменьшает вероятность нежелательного повторного объявления
// Объявить в начале
let firstName, lastName, price, discount, fullPrice;
// Use later
firstName = "John";
lastName = "Doe";
price = 19.90;
discount = 0.10;
fullPrice = price - discount;
Это также касается переменных цикла:
for (let i = 0; i < 5; i++)
{
Инициализация переменных
Рекомендуется инициализировать переменные при их объявлении.
Это даёт:
- Более чистый код
- Обеспечивает единое место для инициализации переменных
- Избежание неопределенных значений
// Объявить и инициировать в начале
let firstName = "",
let lastName = "",
let price = 0,
let discount = 0,
let fullPrice = 0,
const myArray = [],
const myObject = {};
Инициализация переменных даёт представление о предполагаемом использовании (и предполагаемом типе данных).
Объявить объекты с помощью const
Объявление объектов с помощью const предотвратит случайное изменение типа:
Пример
let car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat"; // Изменяет объект на строку
const car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat"; // Невозможно
Объявить массивы с помощью const
Объявление массивов с помощью const предотвратит случайное изменение типа:
Пример
let cars = ["Saab", "Volvo", "BMW"];
cars = 3; // Изменяет массив на число
const cars = ["Saab", "Volvo", "BMW"];
cars = 3; // Невозможно
Не используйте new Object()
- Используйте
""
вместоnew String()
- Используйте
0
вместоnew Number()
- Используйте
false
вместоnew Boolean()
- Используйте
{}
вместоnew Object()
- Используйте
[]
вместоnew Array()
- Используйте
/()/
вместоnew RegExp()
- Используйте
function (){}
вместоnew Function()
Пример
let x1 = ""; // новая примитивная строка
let x2 = 0; // новое примитивное число
let x3 = false; // новое примитивное булево значение
const x4 = {}; // новый объект
const x5 = []; // новый объект массива
const x6 = /()/; // новый объект regexp
const x7 = function(){}; // новый объект функции
Попробуйте сами »
Остерегайтесь автоматического преобразования типов
Код JavaScript не очень типизирован.
Переменные могут содержать все типы данных.
Переменная может изменять свой тип данных:
Пример
let x = "Hello"; // typeof x - это строка
x = 5; // изменяет typeof x на число
Попробуйте сами »
Помните, что числа могут случайно быть преобразованы в строки или NaN
(Not a Number - Не число).
При выполнении математических операций JavaScript может преобразовывать числа в строки:
Пример
let x = 5 + 7; // x.valueOf() равно 12, typeof x - это число
let x = 5 + "7"; // x.valueOf() равно 57, typeof x - это строка
let x = "5" + 7; // x.valueOf() равно 57, typeof x - это строка
let x = 5 - 7; // x.valueOf() равно -2, typeof x - это число
let x = 5 - "7"; // x.valueOf() равно -2, typeof x - это число
let x = "5" - 7; // x.valueOf() равно -2, typeof x - это число
let x = 5 - "x"; // x.valueOf() равно NaN, typeof x - это число
Попробуйте сами »
Вычитание строки из строки не вызывает ошибки, но возвращает NaN
(Not a Number):
Используйте === Сравнение
Оператор сравнения ==
всегда преобразует (в соответствующие типы) перед сравнением.
Оператор ===
принудительно сравнивает значения и тип:
Пример
0 == ""; // true
1 == "1"; // true
1 == true; // true
0 === ""; // false
1 === "1"; // false
1 === true;
// false
Попробуйте сами »
Используйте значения параметров по умолчанию
Если функция вызывается с отсутствующим аргументом, значение отсутствующего аргумента устанавливается на undefined
(неопределенное).
Undefined (неопределенные) значения могут нарушить ваш код. Присваивать аргументам значения по умолчанию - хорошая привычка.
ECMAScript 2015 позволяет использовать параметры по умолчанию в определении функции:
function (a=1, b=1) { /*код функции*/ }
Дополнительные сведения о параметрах и аргументах функции см. в разделе Параметры функции
Завершите переключатели настройками по умолчанию
Всегда завершайте операторы switch
с помощью default
(значения по умолчанию). Даже если вы думаете, что в этом нет необходимости.
Пример
switch (new Date().getDay()) {
case 0:
day = "Sunday";
break;
case 1:
day = "Monday";
break;
case 2:
day = "Tuesday";
break;
case 3:
day = "Wednesday";
break;
case 4:
day = "Thursday";
break;
case 5:
day = "Friday";
break;
case 6:
day = "Saturday";
break;
default:
day =
"Unknown";
}
Попробуйте сами »
Избегайте числовых, строковых и логических значений в качестве объектов
Всегда относитесь к числам, строкам или логическим значениям как к примитивным значениям. Не как к объектам.
Объявление этих типов как объектов снижает скорость выполнения и вызывает неприятные побочные эффекты:
Пример
let x = "John";
let y = new String("John");
(x === y) // является false потому что x - это строка, а y - объект
Попробуйте сами »
Или даже хуже:
Пример
let x = new String("John");
let y = new String("John");
(x == y) // является false, потому что нельзя сравнивать объекты
Попробуйте сами »
Избегайте использования eval()
Функция eval()
используется для запуска текста как кода. Практически во всех случаях нет необходимости использовать его.
Поскольку он позволяет запускать произвольный код, он также представляет проблему безопасности.