- Общие моменты
- Отступы
- Длина строки
- Комментарии
- Имена
- Объявление переменных
- Объявление функций
- Инструкции, операторы и выражения
- Используйте по-возможности краткие формы;
- {} — вместо new Object();
- [] — вместо new Array();
- Используйте инкремент
i++
и декрементi--
; - Используйте точное сравнение без приведения типов:
a === b
иa !== b
; - Допускается приведение типа при проверке на
undefined
,null
или пустую строку''
через!varName
; - Для приведения к булевому типу используйте
b = Boolean(a)
вместо двойного отрицанияb = !!a
; - Для приведения к числу используйте краткую запись
b = +a
, также можно использоватьb = parseInt(a, 10)
, но не забываете о радиксе:parseInt(arg, radix)
.
var o = {};
var a = [];
// явное приведение типов
i = ParseInt(a[1], 10);
b = Boolean(a[1]);
s = (i + b).toString();
// неявное приведение типов
i = +a[1];
b = !!a[1];
s = '' + i + b;
// тернарный оператор
result = (expression) ? operand1 : operand2;
или
result = expression ? operand1 : operand2;
- Используйте запятые после, а не перед декларацией:
var iAm = {
firstName: 'Ildar'
, lastName: 'Gal'
, age: 36
};
var iAm = {
firstName: 'Ildar',
lastName: 'Gal',
age: 36
};
Используйте для отступов двойной пробел. Отсутствие стандарта по ширине символа табуляции приводит к тому, что код выглядит по разному в различных редакторах и IDE.
В конце файлов оставляйте пустую строку.
(function() {
←←...
})();
↵
Длина строки не должна превышать 100 символов.
- Используйте
/* ... */
для многострочных и// ...
для однострочных комментариев; - Для описания методов и свойств/переменных используется формат jsDoc:
/**
* Описание метода/переменной/свойства
* @param {type} propName описание аргумента
*/
- Не пишите инлайновые комментарии;
- Отбивайте комментарии пустой строкой сверху.
var true = false, // наебал
a = 1; // умный комментарий про переменную
function do(what) {
var a = 1;
// blah-blah
// foo
// bar
var b = what || '';
return b;
}
// Наебал
var true = false;
// умный комментарий
var a = 1;
/**
* @param {string|undefined} what Строка, которая ест коров
* @return {string}
*/
function do(what) {
/*
blah-blah
foo
bar
*/
var b = what || '';
return b;
}
В именах можно использовать только буквы латинского алфавита, цифры и символ подчеркивания ([A-Za-z0-9_]).
- camelCase — для имен переменных, публичных методов и свойств;
- _privateVar (с ведущим подчеркиванием
_
) — для приватных свойств; - UPPER_CASE — для констант;
- PascalCase — для классов, имен конструкторов, namespace'ов;
В именах переменных и функций нельзя использовать зарезервированные слова:
var
, array
, object
, null
, arguments
, call
, apply
, case
, default
, ...
Имя переменных и функций должно отражать их смысл. Имя функция должно выражать действие. Если после недолгого размышления вы решили назвать переменную r_chkbx — подумайте еще.
- Не используйте глобальные переменные;
- Переменные должны быть объявлены cверху;
- Каждая переменная должна быть объявлена на новой строке с индивидуальным
var
; - Переменные желательно группировать по смыслу, а затем по алфавиту;
- Неинициализированные переменные объявляйте последними;
- Не используйте имена, которые уже определены во внешней области видимости.
z = 0; // переменная объявляется ниже как локальная
var x,y; // один var на несколько переменных
var uselessVar = 'useless text' // инициализированные переменные должны стоять в начале
function square(x) { // 'x' уже определена во внешнем скоупе
return x*x;
}
var label = 'Coding is cool!';
var z; // по смыслу эта переменная должна стоять рядом с 'x' и 'y'
var label = 'Coding is cool!';
var uselessVar = 'useless text';
var x;
var y;
var z;
function square(arg) {
return arg * arg;
}
- Объявляйте функции до первого использования, в начале блока, но после объявления переменных;
- Не декларируйте функции внутри блоков
if
,for
и т. д.; - Между именем функции и открывающей скобкой не должно быть пробела;
- Между закрывающей скобкой и открывающей фигурной скобкой должен быть пробел;
- Блок тела функции должен открываться на одной строке с именем функции;
- Для изоляции и замыканий используйте немедленно-выполняемый функтор (IIFE on MDN).
function doSomethingUseful (){
// here is no nothing useful in real
}
function anotherFunc()
{
// body
}
if (true) {
function good() { ... }
}
/**
* Comment
*/
function a() {
}
function b() {
}
function doSomethingUseful() {
// here is no nothing useful in real
}
function a() {
}
/**
* Comment
*/
function b() {
}
Размещайте каждую инструкцию на новой строке. Все инструкции кроме блочных
завершаются символом ;
.
Ребята, давайте жить дружно и не забывать ставить точку с запятой!
var i=0; i=i+1;return i
if (true) {
};
var i = 0;
++i;
return i;
function a() {
}
var functionVariable = function() {
};
- Блоки инструкций заключаются в фигурные скобки
{
и}
; - Открывающая скобка завершает строку и не переносится на новую;
- Закрывающая скобка, напротив, переносится на следующую строку, кроме случаев с однострочными блоками;
- Используйте блок даже для одиночного выражения;
- Разделяйте блоки пустой строкой. Если над функцией комментарий, то пустой строки не должно быть.
/**
* Comment
* @param {object} username
*/
var superSu = function (username)
{username.evilmode = true}
if (true) return false;
/**
* Comment
* @param {object} username
*/
var superSu = function(userName) {
userName.godMode = true;
}
// Фильтр четных чисел
[1, 2, 3, 4].filter(function(number) {
return !(number % 2);
});
if (true) { return false; }
Не заключайте в скобки возвращаемый объект и не переносите его на новую строку.
return
a;
return (a);
- Ставьте пробел перед круглыми скобками и после них;
- Правила оформления блока описаны в соответствующем разделе.
if(){
...
}
if ()
{
...
} else
{ ... }
if (...) {
...
} else if (...) {
...
} else {
...
}
try {
...
} catch (...) {
...
} finally {
...
}
- Не объявляйте статические переменные в теле цикла;
- Не объявляйте функции в теле цикла.
- При переборе объектов в конструкции
for...in
используйте оберткуhasOwnProperty
для исключения из перечисления свойств, добавленных в прототип;
var items = [ ... ];
for(i=0;i<len; i=i+1)
{
len = items.length;
function do(a,b) { ... }
do(i, items[i]);
}
for(a in b){ if(b.a<10) return false }
function do(i, item) {
...
}
for(var i = 0, len = items.length; i < len; i++) {
do(i, item[i]);
}
for (var key in object) {
if (object.hasOwnProperty(key)) {
if (b.a < 10) {
return false;
}
}
}
var n = 0;
var x = 0;
while (n < 3) {
n++;
x += n;
}
var i = 0;
do {
i += 1;
console.log(i);
} while (i < 5);
Завершайте каждый блок кроме default
оператором break
или throw
.
switch (...) {
case value1:
...
break;
case value2: return ...;
default:
throw ...;
}
Никогда не используйте with
.
with Statement Considered Harmful
Никогда не используйте eval
.
eval is Evil
- Используйте одинарные кавычки, конкатенируйте длинные строки;
- Для новых стандартов используйте шаблонные литералы
var name = "Vasya";
var longStr = "Note that in the 3d example, '3d' had to be quoted. It's possible to quote the JavaScript array indexes as well (e.g., years['2'] instead of years[2]), although it's not necessary.";
var longStr = "Note that in the 3d example, '3d' had to be quoted. \
Possible to quote the JavaScript array indexes as well (e.g., \
years['2'] instead of years[2]), although it's not necessary. The 2 ";
var name = 'Vasya';
var longStr = 'Note that in the 3d example, \'3d\' had to be quoted.' +
'Possible to quote the JavaScript array indexes as well (e.g., ' +
'years['2'] instead of years[2]), although it\'s not necessary. The 2';
или
var longStr = `Example ${varName}, something`;
- При инициализации массива после последнего элемента допустима запятая;
- Используйте методы:
push
,map
,forEach
,filter
,some
,every
,slice
.
a[a.length] = 12;
for (i = 0; i < a.length; i++) {
a[i] = a[i] + 1;
}
var s = '<ul>';
for (i = 0; i < a.length;i++) s+= '<li>' + a[i] '</li>';
s += '</ul>';
var b = [];
for (i = 0; i < a.length; i++) {
if (a[i] > 0) b[i] = a[i];
}
var aCopy = [];
for (i = 0; i < a.length; i++) {
aCopy[i] = a[i];
}
var a = [1,2,3,];
a.push(12);
a.forEach(function(i) {i += 1;});
var s = '<ul><li>' + items.join('</li><li>') + '</li></ul>';
var aCopy = a.slice();
var b = a.filter(function(i) { return i>0; });
// чтобы получить массив свойств
var myObj = {a: 1, b: 2, c: 3, d: 'bubble-gum', e: 5};
myObj.length = Object.keys(myObj);
var myArr = Array.prototype.slice.call(myObj);
- Используйте
this.foo = undefined
вместоdelete this.foo
(это быстрее работает); - Обращение к свойству осуществляется через
obj.propertyName
, а неobj['propertyName']
, за исключением, когда имя свойство хранится в переменнойobj[variable]
.
var x = {y: 123};
delete x.y;
// или
x.y = null;
// или
x['y'] = undefined;
x.y = undefined;
- CoffeScript — нет.
- jQuery — нет.
- Bootstrap — нет. Используйте вместо него sega3.
- Сеттеры и геттеры — пока нет, ждем внедрения ES6.
// плохо var name = user.getName(); user.setName('Vasya'); // хорошо var name = user.name(); user.name('Vasya');
- Object.defineProperty — да.
- Скопируйте в корень проекта конфигурационные файлы:
linters/signaltech.jshintrc
,linters/signaltech.jscsrc
;
- Переименуйте:
signaltech.jshintrc
=>.jshintrc
,signaltech.jscsrc
=>.jscsrc
;
- Установите
jshint
иjscs
:
npm install -g jshint
npm install -g jscs
- Запустите проверку:
# из каталога с конфигурационными файлами
jshint src/app.js
jscs src/app.js
# из другого каталога
jshint /path/to/file.js --config /path/to/jshint.config
jscs /path/to/file.js --config /path/to/jscs.config
# автоматическое исправление ошибок
jscs /path/to/file.js --config /path/to/jscs.config --fix
В данной инструкции мы подразумеваем, что модуль Package Control
уже установлен, если нет - следуйте указаниям в документации: Package Control Installation
Для подключения линтеров в SublimeText необходимо установить фреймворк SublimeLinter
.
- Нажимаем
Ctrl + Shift + P
, для вызова командной консоли; - Запрашиваем список пакетов, набрав
install package
(пунктPackage Control: Install Package
); - Устанавливаем пакет с именем
SublimeLinter
, выбрав его в списке.
Сам по себе фреймворк не содержит линтеров, они находятся в отдельных модулях. Устанавливаем пакеты SublimeLinter-jshint
и SublimeLinter-jscs
указанным выше методом.
Все должно заработать.
Если ошибки не начали подсвечиваться, попробуйте запустить проверку стандартным сочетанием Ctrl + k, l
.
TODO: Добавить инструкцию
TODO: Добавить инструкцию
Signaltech, 2019