Nota: Esta guía asume que usas Babel, adicionalmente de tener instalado babel-preset-airbnb o su equivalente. También asume que tienes instalado shims/pollyfills en tu aplicación, con
airbnb-browser-shims o su equivalente.
Usa const para todas tus referencias; evita usar var.
¿Por qué? Esto asegura que no reasignes tus referencias, lo
que puede llevar a bugs y dificultad para comprender el código.
// malvara=1;varb=2;// bienconsta=1;constb=2;
Si vas a reasignar referencias, usa let en vez de var.
¿Por qué? El bloque let es de alcance a nivel de bloque a
diferencia del alcance a nivel de función de var.
// malvarcount=1;if(true){count+=1;}// bien, usa el letletcount=1;if(true){count+=1;}
Nota que tanto let como const tienen alcance a nivel de bloque.
// const y let solo existen en los bloques donde// estan definidos{leta=1;constb=1;}console.log(a);// ReferenceErrorconsole.log(b);// ReferenceError
Objetos
Usa la sintaxis literal para la creación de un objeto.
// malconstitem=newObject();// bienconstitem={};
No uses palabras reservadas para nombres de propiedades. No funciona en IE8 Más información. No hay problema de usarlo en módulos de ES6 y en código de servidor.
Usa object destructuring para múltiple valores de retorno, no array destructuring.
¿Por qué? Puedes agregar nuevas propiedades en el tiempo o cambiar el orden de las cosas sin afectar la forma en que se llama.
// malfunctionprocessInput(input){// then a miracle occursreturn[left,right,top,bottom];}// el que llama necesita pensar en el orden de la data de retornoconst[left,__,top]=processInput(input);// bienfunctionprocessInput(input){// then a miracle occursreturn{ left, right, top, bottom };}// el que llama elige solo la data que necesitaconst{ left, top }=processInput(input);
Las cadenas de texto con una longitud mayor a 100 caracteres deben ser escritas en múltiples líneas usando concatenación.
Nota: Cuando se usa sin criterio, las cadenas de texto largas pueden impactar en el desempeño. jsPerf & Discusión
// malvarerrorMessage='This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';// bienvarerrorMessage='This is a super long error that was thrown because\of Batman. When you stop to think about how Batman had anything to do \with this, you would get nowhere fast.';// bienvarerrorMessage='This is a super long error that was thrown because'+'of Batman. When you stop to think about how Batman had anything to do '+'with this, you would get nowhere fast.';
Cuando se crean cadenas de texto de forma programática, usa template strings (cadena de plantillas) en vez de concatenación.
¿Por qué? Los template strings te dan mayor legibilidad, sintaxis concisa con nuevas líneas apropiadas y capacidades de interpolación.
// malfunctionsayHi(name){return'How are you, '+name+'?';}// malfunctionsayHi(name){return['How are you, ',name,'?'].join();}// bienfunctionsayHi(name){return`How are you, ${name}?`;}
Nunca uses eval() en una cadena de texto, abre una caja de Pandora de vulnerabilidades.
Usa declaración de función en vez de expresiones de función.
¿Por qué? Las declaraciones de función son nombradas, por lo que son más sencillas de identificar en las pilas de llamadas. Además todo el contenido de una declaración de función es hoisted, mientras que solo la referencia de una expresión de función es hoisted. Esta regla hace posible que siempre se usen Arrow Functions en vez de las funciones de expresión.
Nunca declares una función en un bloque que no sea de función (if, while, etc). En vez de ello, asigna la función a una variable. Los navegadores te permitirán hacerlo pero todos ellos lo interpretarán de modo diferente, lo que es lamentable.
Cuando debas usar funciones anónimas (como cuando pasas un callback inline), usa la notación de funciones de flecha.
¿Por qué? Crea una versión de la función que ejecuta en el contexto de this, lo que usualmente es lo que deseas, además que tiene una sintaxis más concisa.
¿Por qué no? Si tienes una función complicada, debes mover esa lógica fuera de su expresión de función nombrada.
Si el cuerpo de la función consiste en una sola sentencia retornando una expresión sin efectos colaterales, omite las llaves y usa el retorno implícito.
De otro modo, mantén las llaves y usa una sentencia de retorno.
¿Por qué? Un edulcorante sintáctico. Se lee bien cuando múltiples funciones están encadenadas entre sí.
// mal[1,2,3].map(number=>{constnextNumber=number+1;`A string containing the ${nextNumber}.`;});// bien[1,2,3].map(number=>`A string containing the ${number}.`);// bien[1,2,3].map((number)=>{constnextNumber=number+1;return`A string containing the ${nextNumber}.`;});// bien[1,2,3].map((number,index)=>({[index]: number,}));// Sin efectos colaterales para retorno implícitofunctionfoo(callback){constval=callback();if(val===true){// Do something if callback returns true}}letbool=false;// malfoo(()=>bool=true);// bienfoo(()=>{bool=true;});
En caso que la expresión se expanda en varias líneas, envuélvela en paréntesis para una mejor legibilidad.
¿Por qué? Se observa claramente dónde empieza y termina la función.
Si tu función tiene un solo argumento y no usa llaves, omite los paréntesis. De otra forma, siempre incluye paréntesis alrededor de los argumentos por claridad y consistencia.
Nota: es también aceptable siempre usar paréntesis, en cuyo caso usa la opción de "always" para eslint o no incluyas disallowParenthesesAroundArrowParam para jscs.
¿Por qué? Menos basura visual.
// mal[1,2,3].map((x)=>x*x);// bien[1,2,3].map(x=>x*x);// bien[1,2,3].map(number=>(`A long string with the ${number}. It’s so long that we don’t want it to take up space on the .map line!`));// mal[1,2,3].map(x=>{consty=x+1;returnx*y;});// bien[1,2,3].map((x)=>{consty=x+1;returnx*y;});
Evita confundir la sintaxis de función de flecha (=>) con los operadores de comparación (<=, >=).
请发表评论