Найти в Дзене
Nuances of programming

4 секрета читаемого и производительного кода JavaScript.

Источник: Nuances of Programming
JavaScript настолько гибкий язык программирования, что дает вам возможность достигать целей разными способами. При этом существует ряд принципов и рекомендаций, соблюдение которых позволит улучшить читаемость и производительность кода.
1. Пишите код в стиле строго типизированного языка
JavaScript  —  слабо типизированный язык, в котором переменная синтаксически
Оглавление

Источник: Nuances of Programming

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

1. Пишите код в стиле строго типизированного языка

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

Конкретизируйте тип данных при определении переменной

Плохой код:

-2

В данном примере переменные не содержат информацию о типе, что усложняет понимание кода или его оптимизацию интерпретатором JavaScript.

Хороший код:

-3

Не меняйте тип переменной произвольно

Плохой код:

-4

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

В то же время в движках типа V8 код JavaScript выполняется после того, как преобразуется в байт-код, в котором тип данных определен. В случае изменения типа переменной компилятору придется заняться дополнительной обработкой, что замедлит выполнение программы.

Хороший код:

-5

Если вам необходимо изменить тип значения, используйте новую переменную.

Возвращаемый тип функции должен быть фиксированным

Плохой код:

-6

Данная функция может вернуть целое число или строку. Это не противоречит синтаксису JavaScript, но затрудняет вызов функции для выполнения арифметических действий непосредственно с результатом getPrice() .

Хороший код:

-7

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

2. Сокращайте число необязательных просмотров областей видимости

JavaScript поддерживает вложенные области видимости и их цепочки, что способствует написанию эффективного кода. Однако неправильное применение данного синтаксиса приводит к ошибкам.

Не раскрывайте код для глобальной области видимости без необходимости

Плохой код:

-8

Во-первых, все переменные в теге script находятся в глобальной области видимости. При этом код в разных тегах script могут писать разные программисты, в связи с чем появляется вероятность конфликтов имен.

Во-вторых, при использовании переменной element вторая строка кода ищет эту переменную в глобальной области, тем самым снижая быстродействие программы.

Хороший код:

-9

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

Но если вы планируете применять переменную element в других частях кода, то ее все же следует объявить в глобальной области видимости.

Не злоупотребляйте замыканиями

В JavaScript поиск переменных осуществляется с помощью цепочки областей видимости. Если переменная не обнаружена в текущей области, то движок продолжает ее искать в родительской, последовательно переходя все выше и заканчивая путь в глобальной области. Чем глубже уровень вложенности замыкания, тем дольше поиск переменной.

Плохой код:

Переменная count в верхней части области используется внутри функции process , вследствие чего при ее вызове движок JavaScript тратит больше времени на поиск этой переменной.

В то же время, если область углублена на несколько уровней, а между process иcount располагаются десятки строк кода, то при считывании функции process переменную count легко перепутать.

Вот поэтому будет лучше передать count в качестве параметра process .

Хороший код:

-10

3. Используйте возможности ES6 для упрощения кода

ES6 существует уже несколько лет и на данный момент широко совместимым. Активное применение его потенциала позволит создавать более лаконичный и понятный код.

Реализуйте обратные вызовы стрелочными функциями, а не обычными

Если вам не нужно задумываться о привязке this , то в качестве функций обратного вызова лучше задействовать стрелочные вместо обычных.

Плохой код:

-11

Хороший код:

-12

Класс

Традиционный синтаксис прототипа отделит код конструктора от кода метода прототипа, препятствуя эффективной организации кода.

Плохой код:

-13

Благодаря применению класса упрощается как понимание кода, так и реализация наследуемых статических функций-членов.

Хороший код:

-14

Шаблонные строки

Шаблонные строки заключены в обратные кавычки (` ` ) вместо двойных или одинарных.

Плохой код:

-15

В шаблонных строках допустимы любые символы вместо escape-символов, таких как \n .

В то же время мы можем напрямую использовать выражение ${} для вставки переменных вместо разделения строк и конкатенации с помощью + .

Хороший код:

-16

Очевидно, что данный код читается легче.

Параметры по умолчанию

Когда нужно присвоить аргументам функции значение по умолчанию, в ES5 можно написать следующий код:

-17

В ES6 используется уже более понятный и читаемый способ.

-18

Переменные с блочной областью видимости

Для последовательного вывода в консоль чисел 0, 1, 2, …10 с интервалом в 100 мс возможен следующий вариант кода:

for(var index = 0; index <= 10; index++){
setTimeout(() => console.log(index), 100)
}

К сожалению, этот код не соответствует требованиям. Так как объявленные с помощью var переменные находятся в глобальной области видимости, значение index меняется на 11 при выполнении функции обратного вызова setTimeout.

-19

В ES5 предлагается решение в виде замыканий:

for(var index = 0; index <= 10; index++){
(function(archivedIndex){
setTimeout(() => console.log(archivedIndex), 100)
})(index)
}

-20

В данном примере мы сохраняем значение index с помощью замыкания, чтобы при выполнении setTimeout обнаруживалось верное значение index.

Но этот вариант трудоёмкий и сложный для понимания. Намного лучше с помощью let объявить переменную с блочной областью видимости.

for(let index = 0; index <= 10; index++){
setTimeout(() => console.log(index), 100)
}

-21

Для завершения условия нужно изменить лишь три символа, сделав его простым, удобным и читаемым.

4. Грамматический стиль

Замените простую условную конструкцию if-else на тернарный оператор

В целом синтаксис тернарного оператора выглядит так:

condition ? expression_1 : expression_2;

condition  —  это выражение, которое вычисляется в логическое значение true или false . Если его условие равно true , то тернарный оператор возвращает expression_1 , в противном случае  —  expression_2 .

Плохой код:

-22

Хороший код:

-23

Избегайте ==

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

Плохой код:

-24

Хороший код:

-25

Читайте также:

Читайте нас в Telegram , VK

Перевод статьи bitfish : 4 Key Principles to Writing Readable and Efficient JavaScript Code