Esta guía de estilo tiene como objetivo dar una pauta para desarrollar código, fácil de entender, limpio y legible.
-
Usar nombres en inglés para clases, métodos, funciones y variables.
class Cliente // ✗ evitar { getTelefono() // ✗ evitar { // ... } } class Customer { // ✓ ok getPhone() { // ✓ ok // ... } }
-
Usar 4 espacios como sangría.
eslint:
indentfunction hello (name) { console.log('hi', name); }
-
Usar comillas simples en cadenas de texto con la excepcion para evitar escapado de texto
eslint:
quotesconsole.log('hello there'); // comillas simples $("<div class='box'>"); // escapado de texto
-
No dejar variables sin usar.
eslint:
no-unused-varsfunction myFunction () { var result = something(); // ✗ evitar }
-
Espacio después de las palabras claves.
eslint:
keyword-spacingif (condition) { ... } // ✓ ok if(condition) { ... } // ✗ evitar
-
Agregar un espacio antes de los paréntesis de la función declarada
eslint:
space-before-function-parenfunction name (arg) { ... } // ✓ ok function name(arg) { ... } // ✗ evitar run(function () { ... }) // ✓ ok run(function() { ... }) // ✗ evitar
-
Usar siempre
===en vez de==.
Exception:obj == nullis allowed to check fornull || undefined.eslint:
eqeqeqif (name === 'John') // ✓ ok if (name == 'John') // ✗ evitar
if (name !== 'John') // ✓ ok if (name != 'John') // ✗ evitar
-
Operadores infijos deben ser espaciados.
eslint:
space-infix-ops// ✓ ok var x = 2; var message = 'hello, ' + name + '!';
// ✗ evitar var x=2; var message = 'hello, '+name+'!';
-
Comas deben tener un espacio despues de ellas.
eslint:
comma-spacing// ✓ ok var list = [1, 2, 3, 4]; function greet (name, options) { ... }
// ✗ evitar var list = [1,2,3,4]; function greet (name,options) { ... }
-
Mantener declaracion else en una linea distinta que sus llaves.
eslint:
brace-stylevalue: 'brace-style': ['error', 'stroustrup', { "allowSingleLine": true }],
// ✓ ok if (condition) { // ... } else { // ... }
// ✓ ok if (condition) { // ... }
// ✗ evitar if (condition) { // ... } else { // ... }
// ✗ evitar if (condition) { // ... } else { // ... }
-
Para declaraciones if multi-linea debe usar llaves.
eslint:
curly// ✓ ok if (options.quiet !== true) console.log('done');
// ✓ ok if (options.quiet !== true) { console.log('done'); }
// ✗ evitar if (options.quiet !== true) console.log('done');
-
Siempre gestionar el parámetro
erren las funciones.eslint:
handle-callback-err// ✓ ok run(function (err) { if (err) throw err; window.alert('done'); })
// ✗ evitar run(function (err) { window.alert('done'); })
-
En las variables globales usar el sufijo
window..
Con la excepcion de:document,consoleynavigator.eslint:
no-undefwindow.alert('hi'); // ✓ ok
-
Múltiples líneas en blanco no está permitido.
eslint:
no-multiple-empty-lines// ✓ ok var value = 'hello world'; console.log(value);
// ✗ evitar var value = 'hello world'; console.log(value)
-
Para el operador ternario en multi-linea, colocar el
?y:en su propia nueva linea.eslint:
operator-linebreak// ✓ ok var location = env.development ? 'localhost' : 'www.api.com'; // ✓ ok var location = env.development ? 'localhost' : 'www.api.com'; // ✗ evitar var location = env.development ? 'localhost' : 'www.api.com';
-
Para declaraciones var, escribir solo una asignación en cada declaracion
eslint:
one-var// ✓ ok var silent = true; var verbose = true; // ✗ evitar var silent = true, verbose = true; // ✗ evitar var silent = true, verbose = true;
-
Envolver asignaciones condicionales con paréntesis adicionales. Esto hace claro que la intención de la expresión es una asignación y no un error de igualdad (
===).eslint:
no-cond-assign// ✓ ok while ((m = text.match(expr))) { // ... } // ✗ evitar while (m = text.match(expr)) { // ... }
-
Agregar espacios dentro de bloques de una sola linea.
eslint:
block-spacingfunction foo () {return true;} // ✗ evitar function foo () { return true; } // ✓ ok
-
Usar camelcase al nombre variables y funciones.
eslint:
camelcasefunction my_function () { } // ✗ evitar function myFunction () { } // ✓ ok var my_var = 'hello'; // ✗ evitar var myVar = 'hello'; // ✓ ok
-
Comas adicionales no esta permitido.
eslint:
comma-danglevar obj = { message: 'hello', // ✗ evitar }
-
Comas deben colocarse al final de la linea actual.
eslint:
comma-stylevar obj = { foo: 'foo' ,bar: 'bar' // ✗ evitar }; var obj = { foo: 'foo', bar: 'bar' // ✓ ok };
-
El Puto debe ir en la misma linea que la propiedad.
eslint:
dot-locationconsole. log('hello'); // ✗ evitar console .log('hello'); // ✓ ok
-
Archivos deben terminar con una nueva linea.
elint:
eol-last -
Sin espacios entre el identificador de la funcion y su invocación.
eslint:
func-call-spacingconsole.log ('hello'); // ✗ evitar console.log('hello'); // ✓ ok
-
Agregar espacio entre dos puntos (colon) y pares clave valor.
eslint:
key-spacingvar obj = { 'key' : 'value' }; // ✗ evitar var obj = { 'key' :'value' }; // ✗ evitar var obj = { 'key':'value' }; // ✗ evitar var obj = { 'key': 'value' }; // ✓ ok
-
Nombres de Constructor deben empezar con letra Mayúscula.
eslint:
new-capfunction animal () {} var dog = new animal(); // ✗ evitar function Animal () {} var dog = new Animal(); // ✓ ok
-
Constructor sin argumentos debe ser invocado con paréntesis.
eslint:
new-parensfunction Animal () {} var dog = new Animal; // ✗ evitar var dog = new Animal(); // ✓ ok
-
Objetos deben contener un getter cuando se ha definido un setter.
eslint:
accessor-pairsvar person = { set name (value) { // ✗ evitar this._name = value; } } var person = { set name (value) { this._name = value; }, get name () { // ✓ ok return this._name; } }
-
Constructores de clases derivadas deben llamar
super.eslint:
constructor-superclass Dog { constructor () { super(); // ✗ evitar } } class Dog extends Mammal { constructor () { super(); // ✓ ok } }
-
Usar array literales en vez de array constructor.
eslint:
no-array-constructorvar nums = new Array(1, 2, 3); // ✗ evitar var nums = [1, 2, 3]; // ✓ ok
-
Evitar usar arguments.caller y arguments.caller.
eslint:
no-callerfunction foo (n) { if (n <= 0) return; arguments.caller(n - 1); // ✗ evitar } function foo (n) { if (n <= 0) return; foo(n - 1); }
-
Evitar modificar variables que fueron declaradas como clase.
eslint:
no-class-assignclass Dog {} Dog = 'Fido'; // ✗ evitar
-
Evitar modifidicar variables declaracas usando
const.eslint:
no-const-assignconst score = 100; score = 125; // ✗ evitar
-
Evitar usar expresiones constantes en condicionales (a excepcion de búcles).
eslint:
no-constant-conditionif (false) // ✗ evitar { // ... } if (x === 0) // ✓ ok { // ... } while (true) // ✓ ok { // ... }
-
Evitar carácteres de control de expresiones regulares.
eslint:
no-control-regexvar pattern = /\x1f/; // ✗ evitar var pattern = /\x20/; // ✓ ok
-
Evitar sentencias
debugger.eslint:
no-debuggerfunction sum (a, b) { debugger; // ✗ evitar return a + b; }
-
Evitar operador delete en variables.
eslint:
no-delete-varvar name; delete name; // ✗ evitar
-
Evitar argumentos duplicados en definicion de funciones.
eslint:
no-dupe-argsfunction sum (a, b, a) { // ✗ evitar // ... } function sum (a, b, c) { // ✓ ok // ... }
-
Evitar duplicados en miembros de clase.
eslint:
no-dupe-class-membersclass Dog { bark () {} bark () {} // ✗ evitar }
-
Evitar duplicado de claves en objetos literales.
eslint:
no-dupe-keysvar user = { name: 'Jane Doe', name: 'John Doe' // ✗ evitar }
-
Evitar dublicados de etiqueta
caseen sentenciasswitch.eslint:
no-duplicate-caseswitch (id) { case 1: // ... case 1: // ✗ evitar }
-
Usar una unica sentencia
importpor modulo.eslint:
no-duplicate-importsimport { myFunc1 } from 'module'; import { myFunc2 } from 'module'; // ✗ evitar import { myFunc1, myFunc2 } from 'module' // ✓ ok
-
Evitar classes de carácteres vacia en expresiones regulares.
eslint:
no-empty-character-classconst myRegex = /^abc[]/; // ✗ evitar const myRegex = /^abc[a-z]/; // ✓ ok
-
Evitar pratones de destructuración vacios.
eslint:
no-empty-patternconst { a: {} } = foo; // ✗ evitar const { a: { b } } = foo; // ✓ ok
-
Evitar uso de
eval().eslint:
no-evaleval( "var result = user." + propName ); // ✗ evitar var result = user[propName]; // ✓ ok
-
Evitar reasignar excepciones en clausas
catch.eslint:
no-ex-assigntry { // ... } catch (e) { e = 'new value'; // ✗ evitar } try { // ... } catch (e) { const newVal = 'new value'; // ✓ ok }
-
Evitar extender objetos nativos
eslint:
no-extend-nativeObject.prototype.age = 21; // ✗ evitar
-
Evitar uso innecesario de bind en funciones.
eslint:
no-extra-bindconst name = function () { getName(); }.bind(user); // ✗ evitar const name = function () { this.getName(); }.bind(user); // ✓ ok
-
Evitar hacer cast a booleanos.
eslint:
no-extra-boolean-castconst result = true; if (!!result) // ✗ evitar { // ... } const result = true; if (result) // ✓ ok { // ... }
-
Evitar paréntesis inncesario alrededor de expresión de funciones.
eslint:
no-extra-parensconst myFunc = (function () { }) // ✗ evitar const myFunc = function () { } // ✓ ok
-
Usar
breakpara evitar pasar de largofallthroughen casosswitch.eslint:
no-fallthroughswitch (filter) { case 1: doSomething(); // ✗ evitar case 2: doSomethingElse(); } switch (filter) { case 1: doSomething(); break; // ✓ ok case 2: doSomethingElse(); }
-
Evitar decimales flotantes.
eslint:
no-floating-decimalconst discount = .5; // ✗ evitar const discount = 0.5; // ✓ ok
-
Evitar reasignación de declaraciones de funciones.
eslint:
no-func-assignfunction myFunc () { } myFunc = myOtherFunc; // ✗ evitar
-
Evitar reasignación de variables globales de solo-lectura.
eslint:
no-global-assignwindow = {}; // ✗ evitar
-
Evitar usar eval() implícito.
eslint:
no-implied-evalsetTimeout("alert('Hello world')"); // ✗ evitar setTimeout(function () { window.alert('Hello world'); }) // ✓ ok
-
Evitar declaracion de funciones en bloques anidados.
eslint:
no-inner-declarationsif (authenticated) { function setAuthUser () {} // ✗ evitar }
-
Evitar cadenas de texto expresiones regulares invalidas en costructores
RegExp.eslint:
no-invalid-regexpRegExp('[a-z'); // ✗ evitar RegExp('[a-z]'); // ✓ ok
-
Evitar espacios en blanco irregulares.
eslint:
no-irregular-whitespacefunction myFunc () /*<NBSP>*/{} // ✗ evitar
-
Evitar uso de
__iterator__.eslint:
no-iteratorFoo.prototype.__iterator__ = function () {}; // ✗ evitar
-
Evitar etiquetas que comparten el nombre de una variable en scope.
eslint:
no-label-varvar score = 100; function game () { score: while (true) // ✗ evitar { score -= 10; if (score > 0) continue score; break; } }
-
Evitar sentencias etiquetadas.
eslint:
no-labelslabel: while (true) { break label; // ✗ evitar }
-
Evitar bloques anidados innecesarios
eslint:
no-lone-blocksfunction myFunc () { { // ✗ evitar myOtherFunc(); } } function myFunc () { myOtherFunc(); // ✓ ok }
-
Evitar mezclar espacios y tabulaciones para sangría
eslint:
no-mixed-spaces-and-tabs -
Evitar uso de espacios en blanco multiples a excepcion de sangría
eslint:
no-multi-spacesconst id = 1234; // ✗ evitar const id = 1234; // ✓ ok
-
Evitar cadenas de texto multi-linea
eslint:
no-multi-strconst message = 'Hello \ world'; // ✗ evitar
-
Evitar usar
newsin asignar a el objecto a una variableeslint:
no-newnew Character(); // ✗ evitar const character = new Character(); // ✓ ok
-
Evitar uso de constructor
Function.eslint:
no-new-funcvar sum = new Function('a', 'b', 'return a + b'); // ✗ evitar
-
Evitar uso de constructor
Objecteslint:
no-new-objectlet config = new Object(); // ✗ evitar
-
Evitar uso de
new require.eslint:
no-new-requireconst myModule = new require('my-module'); // ✗ evitar
-
Evitar uso de constructor
Symbol.eslint:
no-new-symbolconst foo = new Symbol('foo'); // ✗ evitar
-
Evitar envolturas de instancias primitivas.
eslint:
no-new-wrappersconst message = new String('hello'); // ✗ evitar
-
Evitar llamar propiedades de objetos globles como funciones.
eslint:
no-obj-callsconst math = Math(); // ✗ evitar
-
Evitar uso de octal literal.
eslint:
no-octalconst num = 042; // ✗ evitar const num = '042'; // ✓ ok
-
Evitar escapado de secuencia octal en cadena de texto literal.
eslint:
no-octal-escapeconst copyright = 'Copyright \251'; // ✗ evitar
-
Evitar concatenacion de cadena de texto para
__dirnamey__filename.eslint:
no-path-concatconst pathToFile = __dirname + '/app.js'; // ✗ evitar const pathToFile = path.join(__dirname, 'app.js'); // ✓ ok
-
Evitar uso de
__proto__. UsegetPrototypeOfen su lugar.eslint:
no-protoconst foo = obj.__proto__; // ✗ evitar const foo = Object.getPrototypeOf(obj); // ✓ ok
-
Evitar re-reclaración de variables.
eslint:
no-redeclarelet name = 'John'; let name = 'Jane'; // ✗ evitar let name = 'John'; name = 'Jane'; // ✓ ok
-
Evitar multiples espacios en expresiones regulares.
eslint:
no-regex-spacesconst regexp = /test value/; // ✗ evitar const regexp = /test {3}value/; // ✓ ok const regexp = /test value/; // ✓ ok
-
Asignación de variables en el retorno de funciones debe estar rodeado de paréntesis.
eslint:
no-return-assignfunction sum (a, b) { return result = a + b; // ✗ evitar } function sum (a, b) { return (result = a + b); // ✓ ok }
-
Evitar asignar una variable a si misma.
eslint:
no-self-assignname = name; // ✗ evitar
-
Evitar comparar una variable consigo mismo.
esint:
no-self-compareif (score === score) {} // ✗ evitar
-
Evitar uso de secuencia separado po comma.
eslint:
no-sequencesif (doSomething(), !!test) {} // ✗ evitar
-
Nombres restringidos no deben ser cambiados (shadowed).
eslint:
no-shadow-restricted-nameslet undefined = 'value'; // ✗ evitar
-
Array dispersos no estan permitidos.
eslint:
no-sparse-arrayslet fruits = ['apple',, 'orange']; // ✗ evitar
-
No se deben usar Tabulaciones.
eslint:
no-tabs -
Cadenas de textos regulares no deben contener placeholders de plantillas literales.
eslint:
no-template-curly-in-stringconst message = 'Hello ${name}'; // ✗ evitar const message = `Hello ${name}`; // ✓ ok
-
super()debe ser llamado inmediatamente antes de usarthis.eslint:
no-this-before-superclass Dog extends Animal { constructor () { this.legs = 4; // ✗ evitar super(); } }
-
Solo se puede lanzar (
throw) un objectoError.eslint:
no-throw-literalthrow 'error'; // ✗ evitar throw new Error('error'); // ✓ ok
-
Espacios en blanco despues del final linea no estan permitidos .
eslint:
no-trailing-spaces -
Inicializar una variable con
undefinedno esta permitido.eslint:
no-undef-initlet name = undefined; // ✗ evitar let name; name = 'value'; // ✓ ok
-
Búcles no modificados no estan permitidos.
eslint:
no-unmodified-loop-conditionfor (let i = 0; i < items.length; j++) {...} // ✗ evitar for (let i = 0; i < items.length; i++) {...} // ✓ ok
-
Evitar usar operador ternario cuando existe una alternative mas simple.
eslint:
no-unneeded-ternarylet score = val ? val : 0; // ✗ evitar let score = val || 0; // ✓ ok
-
Evitar dejar código inalcanzable despues de sentencias
return,throw,continue, ybreak.eslint:
no-unreachablefunction doSomething () { return true; console.log('never called'); // ✗ evitar }
-
Evitar sentencias de control de flujo en bloques
finally.eslint:
no-unsafe-finallytry { // ... } catch (e) { // ... } finally { return 42; // ✗ evitar }
-
El operando izquierdo en operaciones relacionales no debe ser negado.
eslint:
no-unsafe-negationif (!key in obj) {} // ✗ evitar
-
Evitar uso inncesario de
.call()y.apply().eslint:
no-useless-callsum.call(null, 1, 2, 3); // ✗ evitar
-
Evitar usar constructores innecesarios.
eslint:
no-useless-computed-keyconst user = { ['name']: 'John Doe' }; // ✗ evitar const user = { name: 'John Doe' }; // ✓ ok
-
Evitar uso inncesario de escapado de text.
eslint:
no-useless-escapelet message = 'Hell\o'; // ✗ evitar
-
Renombrar import, export o destructuración con el mismo nombre no esta permitido
eslint:
no-useless-renameimport { config as config } from './config'; // ✗ evitar import { config } from './config'; // ✓ ok
-
Evitar espacios en blanco antes de una propiedad.
eslint:
no-whitespace-before-propertyuser .name // ✗ evitar user.name // ✓ ok
-
Evitar uso de sentencia
with.eslint:
no-withwith (val) {...} // ✗ evitar
-
Mantener consistencia de nuevas lineas entre las propiedades de un objecto .
eslint:
object-property-newlineconst user = { name: 'Jane Doe', age: 30, username: 'jdoe86' // ✗ evitar }; const user = { name: 'Jane Doe', age: 30, username: 'jdoe86' }; // ✓ ok const user = { name: 'Jane Doe', age: 30, username: 'jdoe86' }; // ✓ ok
-
Evitar espacios de relleno entre bloques.
eslint:
padded-blocksvalue: 'padded-blocks': ['error', 'always']
if (user) { const name = getName(); // ✗ evitar } if (user) { // ✓ ok const name = getName(); }
-
Evitar espacios en blanco entre el operador de propagacion y la expresion
eslint:
rest-spread-spacingfn(... args); // ✗ evitar fn(...args); // ✓ ok
-
Punto y coma (semicolon) debe tener un espacio en blanco despues y no antes.
eslint:
semi-spacingfor (let i = 0 ;i < items.length ;i++) {...} // ✗ evitar for (let i = 0; i < items.length; i++) {...} // ✓ ok
-
Mantener espacio despues de los bloques.
eslint:
space-before-blocksif (admin){...} // ✗ evitar if (admin) {...} // ✓ ok
-
Evitar espacios en blanco entre paréntesis.
eslint:
space-in-parensgetName( name ); // ✗ evitar getName(name); // ✓ ok
-
Operador unario debe tener espacio en blanco despues.
eslint:
space-unary-opstypeof!admin; // ✗ evitar typeof !admin; // ✓ ok
-
Usar espacios dentro de comentarios.
eslint:
spaced-comment//comment // ✗ evitar // comment // ✓ ok /*comment*/ // ✗ evitar /* comment */ // ✓ ok
-
Evitar espacios en blanco dentro de placeholders de plantillas literales.
eslint:
template-curly-spacingconst message = `Hello, ${ name }`; // ✗ evitar const message = `Hello, ${name}`; // ✓ ok
-
Usar
isNaN()cuando se desea chequearNaN.eslint:
use-isnanif (price === NaN) { } // ✗ evitar if (isNaN(price)) { } // ✓ ok
-
typeofdebe ser comparado con una cadena de texto valida.eslint:
valid-typeoftypeof name === 'undefimed'; // ✗ evitar typeof name === 'undefined'; // ✓ ok
-
Expressiones Funciones inmediatamente invocadas (IIFEs) deben ser envueltas en paréntesis.
eslint:
wrap-iifeconst getName = function () { }(); // ✗ evitar const getName = (function () { }()); // ✓ ok const getName = (function () { })(); // ✓ ok
-
El
*en expresionesyield*deben tener un espacio en blanco antes y despues.eslint:
yield-star-spacingyield* increment(); // ✗ evitar yield * increment(); // ✓ ok
-
Evitar condiciones Yoda.
eslint:
yodaif (42 === age) { } // ✗ evitar if (age === 42) { } // ✓ ok
-
Con puntos y comas.
eslint:
semiwindow.alert('hi'); // ✓ ok window.alert('hi') // ✗ evitar