Хорошая практика программирования на Javascript

Избегать глобальных переменных, избегать оператора new, избегать оператора ==, избегать функции eval().

Избегайте глобальных переменных

Старайтесь сводить к минимуму использование глобальных переменных.

Сюда относятся все типы данных, объекты и функции.

Дело в том, что глобальные переменные и функции могут переписываться другими скриптами.

Вместо этого используйте локальные переменные и учитесь использовать замыкание.

Всегда декларируйте локальные переменные

Все переменные, используемые в функции, должны декларироваться как локальные переменные.

Локальные переменные должны декларироваться при помощи ключевого слова var, иначе они станут глобальными переменными.

Внимание! Строгий режим не допускает использование недекларированных переменных.

Декларирование в верху области видимости

Хорошей практикой программирования на JavaScript является практика размещения всех деклараций в верху скрипта или функции.

Это позволит:

  • получить более чистый код
  • обеспечить единое место для отслеживания локальных переменных
  • избегать нежелательных (неявных) глобальных переменных
  • снизить вероятность появления нежелательных повторных деклараций

// Декларируем в начале
var firstName, lastName, price, discount, fullPrice;

// Используем потом
firstName = "John";
lastName = "Doe";

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 = {};

Никогда не декларируйте объекты Number, String, Boolean

С числами, строками и логическими значениями всегда обращайтесь как к примитивам, а не объектам.

Декларирование этих типов как объектов замедляет скорость выполнения скрипта и приводит к неприятным побочным эффектам:


 var x = "John";             
 var y = new String("John");
 (x === y) // возвращает false, так как x — строка, а y — объект

Или даже хуже:


 var x = new String("John");             
 var y = new String("John");
 (x == y) // возвращает false, так как нельзя сравнивать объекты

Не используйте команду new Object()

  • Используйте { } вместо new Object()
  • Используйте "" вместо new String()
  • Используйте 0 вместо new Number()
  • Используйте false вместо new Boolean()
  • Используйте [ ] вместо new Array()
  • Используйте /()/ вместо new RegExp()
  • Используйте function (){ } вместо new Function()

 var x1 = {};           // новый объект
 var x2 = "";           // новая строка
 var x3 = 0;            // новое число
 var x4 = false;        // новое значение boolean
 var x5 = [];           // новый объект массива
 var x6 = /()/;         // новое регулярное выражение
 var x7 = function(){}; // новый объект функции

Помните об автоматическом преобразовании типов

Помните о том, что числа могут быть случайно преобразованы в строки или значение NaN (Не число).

JavaScript — слабо типизированный язык программирования. Переменные могут содержать значения разных типов, при этом переменные могут менять тип, содержащихся в них данных:


 var x = "Hello";     // 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 (Не число):


 "Hello" - "Dolly"    // возвращает NaN

Используйте сравнение ===

Оператор сравнения == всегда приводит сравниваемые значения к одинаковым типам.

Оператор сравнения === сравнивает как сами значения, так и их типы:


 0 == "";        // true
 1 == "1";       // true
 1 == true;      // true

 0 === "";       // false
 1 === "1";      // false
 1 === true;     // false 

Используйте параметры по умолчанию

Если функция вызывается с пропущенным параметром, то этому параметру присваивается значение undefined.

Значения undefined могут сломать ваш код. Если взять за правило присваивать параметрам значения по умолчанию, то это будет хорошей привычкой.


 function myFunction(x, y) {
     if (y === undefined) {
         y = 0;
     }
 } 

Всегда заканчивайте выражение switch оператором default

Всегда заканчивайте выражение switch оператором default. Даже если вы думаете, что он совсем не нужен.


 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() используется, чтобы запустить текст, как код. Почти во всех случаях в этом нет необходимости.

Из-за того, что эта функция позволяет запускать самостоятельный код, она еще может являться и источником проблем безопасности.