ЛУЧШИЙ САЙТ ДЛЯ ВЕБ-РАЗРАБОТЧИКОВ

JS Учебник

JS Старт JS Интро JS Установка JS Вывод JS Инструкции JS Синтаксис JS Комментарии JS Переменные JS Ключевое слово Let JS Ключевое слово Const JS Операторы JS Арифметические JS Присваивание JS Типы данных JS Функции JS Объекты JS События JS Строки JS Строковые методы JS Строковый поиск JS Строковые шаблоны JS Числа JS Числовые методы JS Массивы JS Методы массива JS Сортировка массива JS Итерация массива JS Массив Const JS Даты JS Форматы дат JS Методы получения дат JS Методы установки дат JS Математические JS Рандомные JS Булевы JS Сравнения JS Условия JS Switch JS Цикл For JS Цикл For In JS Цикл For Of JS Цикл While JS Break и Continue JS Итерации JS Наборы JS Карты JS Typeof JS Преобразование типов JS Побитовые JS Регулярные выражения JS Ошибки JS Область действия JS Хостинг JS Use Strict JS Ключевое слово this JS Функция стрелки JS Классы JS JSON JS Отладка JS Гид по стилю JS Лучшие практики JS Распространенные ошибки JS Производительность JS Зарезервированные слова

JS Версии

JS Версии JS 2009 (ES5) JS 2015 (ES6) JS 2016 JS 2017 JS 2018 JS IE/Edge JS История

JS Объекты

Определения объектов Свойства объекта Методы объекта Отображение объекта Доступ к объектам Конструкторы объектов Прототипы объектов Итерируемые объекты Наборы объектов Карты объектов Справочник объектов

JS Функции

Определения функций Параметры функции Обращение к функции Вызов функции Применение функции Закрытие функции

JS Классы

Введение Наследование класса Статические методы

JS Асинхронный

Обратные вызовы Асинхронный Промисы Async/Await

JS HTML DOM

DOM Введение DOM Методы DOM Документ DOM Элементы DOM HTML DOM Формы DOM CSS DOM Анимация DOM События DOM Слушатель событий DOM Навигация DOM Узлы DOM Коллекции DOM Узловые списки

JS Браузер BOM

JS Окно JS Скрин JS Локация JS История JS Навигатор JS Всплывающее оповещение JS Тайминг JS Куки

JS Веб API

Веб API Интро Веб-формы API Веб-история API Веб-хранилище API Веб-воркер API Веб-выборка API Веб-геолокация API

JS AJAX

AJAX Интро AJAX XMLHttp AJAX Запрос AJAX Отклик AJAX XML Файл AJAX PHP AJAX ASP AJAX База данных AJAX Приложения AJAX Примеры

JS JSON

JSON Введение JSON Синтаксис JSON и XML JSON Типы данных JSON Анализ JSON Stringify JSON Объекты JSON Массивы JSON Сервер JSON PHP JSON HTML JSON JSONP

JS и jQuery

jQuery Селекторы jQuery HTML jQuery CSS jQuery DOM

JS Примеры

JS Примеры JS HTML DOM JS HTML Input JS HTML Объекты JS HTML События JS Браузер JS Редактор JS Упражнения JS Викторина JS Сертификат

JS Справочники

JavaScript Объекты HTML DOM Объекты

JavaScript. W3Schools на русском. Уроки для начинающих

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):

Пример

"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;
  }
}
Попробуйте сами »

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

Поскольку он позволяет запускать произвольный код, он также представляет проблему безопасности.