JavaScript Практика
Избегайте глобальных переменных, избегайте new, избегайте ==, избегайте eval()
Избегайте глобальных переменных
Сведите к минимуму использование глобальных переменных.
Сюда входят все типы данных, объекты и функции.
Глобальные переменные и функции могут быть перезаписаны другими сценариями.
Вместо этого используйте локальные переменные и узнайте, как их использовать закрытия.
Всегда объявляйте локальные переменные
Все переменные, используемые в функции, должны быть объявлены как локальные переменные.
Локальная переменная должена быть объявлена с ключевым словом var, в противном случае они станут глобальными переменными.
Строгий режим не допускает необъявленных переменных.
Заявления на вершине
Это хорошая практика кодирования, чтобы поместить все объявления в верхней части каждого сценария или функция.
Будет:
- Предоставить более чистый код
- Укажите единственное место для поиска локальных переменных
- Сделать его проще, чтобы избежать нежелательных (подразумеваемых) глобальных переменных
- Уменьшить вероятность нежелательных повторных объявлений
// Объявить в самом начале
var firstName, lastName, price, discount, fullPrice;
// Использовать позже
firstName = "Андрей";
lastName = "Щипунов";
price = 19.90;
discount = 0.10;
fullPrice = price * 100 / discount;
Это также относится к переменным цикла:
// Объявить в самом начале
var i;
// Использовать позже
for (i = 0; i < 5; i++)
{
По умолчанию JavaScript перемещает все объявления наверх (JavaScript Подъемный).
Инициализация переменных
Хорошей практикой в кодировании является инициализация переменных при их объявлении.
Будет:
- Предоставить более чистый код
- Укажите одно место для инициализации переменных
- Избегайте неопределенных значений
// Объявить и инициировать в самом начале
var firstName = "",
lastName
= "",
price = 0,
discount = 0,
fullPrice
= 0,
myArray = [],
myObject = {};
Инициализация переменных дает представление о предполагаемом использовании (и предполагаемом типе данных).
Никогда не объявляйте числовые, строковые или логические объекты
Всегда считайте числа, строки или логические значения примитивными значениями. Не так как объекты.
Объявление этих типов в качестве объектов замедляет скорость выполнения, и производит неприятные побочные эффекты:
Пример
var x = "Андрей";
var y = new String("Андрей");
(x === y) // false, потому что x - строка, а y - объект.
Попробуйте сами »
Или еще хуже:
Пример
var x = new String("Андрей");
var y = new String("Андрей");
(x == y) // false, потому что вы не можете сравнивать объекты.
Попробуйте сами »
Не используйте new Object()
- Использовать {} вместо new Object()
- Использовать "" вместо new String()
- Использовать 0 вместо new Number()
- Использовать false вместо new Boolean()
- Использовать [] instead of new Array()
- Использовать /()/ вместо new RegExp()
- Использовать function (){} вместо new Function()
Пример
var x1 = {}; // новый объект
var x2 = ""; // новая примитивная строка
var x3 = 0; // новое примитивное число
var x4 = false; // новый примитивный логический элемент
var x5 = []; // новый объект массива
var x6 = /()/; // новый объект регулярное выражение
var x7 = function(){}; // новый объект функции
Попробуйте сами »
Остерегайтесь автоматических преобразований типов
Учтите, что номера могут случайно быть преобразованы в строки или NaN (не Число).
JavaScript слабо типизирован. Переменная может содержать различные типы данных, и переменная может изменять свой тип данных:
Пример
var x = "Привет"; // typeof x - строка
x = 5; // Изменение typeof x - число
Попробуйте сами »
При выполнении математических операций JavaScript может преобразовывать числа в строки:
Пример
var x = 5 + 7; // x.valueOf() будет 12, typeof x будет числом
var x = 5 + "7"; // x.valueOf() будет 57, typeof x будет строкой
var x = "5" + 7; // x.valueOf() будет 57, typeof x будет строкой
var x = 5 - 7; // x.valueOf() будет -2, typeof x будет числом
var x = 5 - "7"; // x.valueOf() будет -2, typeof x будет числом
var x = "5" - 7; // x.valueOf() будет -2, typeof x будет числом
var x = 5 - "x"; // x.valueOf() будет NaN, typeof x будет числом
Попробуйте сами »
Вычитание строки из строки, это не генерирует ошибку, но возвращает NaN (не число):
Использовать === сравнение
Оператор == сравнение всегда преобразует (в соответствующие типы), прежде чем сравнение.
Оператор === заставляет сравнивать значения и тип:
Пример
0 == ""; // true
1 == "1"; // true
1 == true; // true
0 === ""; // false
1 === "1"; // false
1 === true;
// false
Попробуйте сами »
Использовать параметры по умолчанию
Если функция вызывается с отсутствующим аргументом, то значение отсутствующего аргумента имеет значение undefined.
Неопределенные значения могут нарушить ваш код. Это хорошая привычка назначать дефолт значения для аргументов.
Подробнее о параметрах и аргументах функций читайте в разделе Параметр функции
Завершите работу коммутаторов с настройками по умолчанию
Всегда завершайте свои инструкции switch значением по умолчанию. Даже если вы думаете, что есть в этом нет необходимости.
Пример
switch (new Date().getDay()) {
case 0:
day = "Воскресенье";
break;
case 1:
day = "Понедельник";
break;
case 2:
day = "Вторник";
break;
case 3:
day = "Среда";
break;
case 4:
day = "Четверг";
break;
case 5:
day = "Пятница";
break;
case 6:
day = "Суббота";
break;
default:
day =
"Неизвестно";
}
Попробуйте сами »
Избегайте использования eval()
Функция eval() используется для запуска текста в виде кода. Почти во всех случаях это не должно быть необходимости использовать его.
Поскольку она позволяет запускать произвольный код, он также представляет собой проблему защиты.