PascalCase-大驼峰规则:首字母大写CamelCase-小驼峰规则:首字母小写1.文件名不包含空格;只有小写,没有大写;(README除外)使用多个词-连接;...2.函数命名函数名要说出它做什么(这样更容易阅读)规则:动词+名词前缀是动词如:can,has,is,get,set3.变量命名使用有意义的变量names(readableproperties)相同类型的变量使用同一个词(统一),使用可搜索的变量名:比如我需要定义多少毫秒一天不直接写86400000而是定义一个可读变量进行赋值。常数MILLISECONDS_PER_DAY=60*60*24*1000;//86400000;这样做的好处是1.知道这里数字的具体含义2.可以全局搜索这个变量,使用可解释的变量,比如const[_,city,zipCode]=address避免使用itemabbreviated等有歧义的变量名asi和location缩写为l以避免添加不必要的变量名,例如constcar={name:'',color:''}而不是constcar={car??Name:'',carColor:''}使用默认参数,例如constbreweryName=名称||“时髦啤酒公司”;这里的breweryName将是多余的和必要的functioncreateMicrobrewery(name="HipsterBrewCo."){//...}详见:https://github.com/ryanmcderm...4.常量命名:全部大写,单词之间用下划线隔开扩展函数定义函数参数建议2个以下函数参数避免使用2个以上参数,如果传入的不止一个可用的对象为了明确函数期望的属性,可以使用ES2015/ES6解构语法函数应该只做一件事当函数做多于一件事时,它们更难组合,测试和推理。当您可以将一个函数隔离为一个操作时,重构它就很容易,并且您的代码读起来更清晰。函数名应该说明它的作用4.函数应该通过拆分函数来优化结构。大致的意思就是,如果你需要在一个函数中做一件事情(注意和2的区别),而且这个事情需要复杂的功能,在流程实现的这个时候,你可以在当前的函数中划分一些精细的功能点,定义它们在函数中使用它们使你的函数内部更清晰、更容易理解和更容易维护。函数考虑了复用性,避免了冗余代码,结构更清晰6.使用Object.assign设置默认对象7.不要使用标签作为函数参数,如badfunctioncreateFile(name,temp){if(temp){fs.create(`./temp/${name}`);}else{fs.create(名称);}}goodfunctioncreateFile(name){fs.create(name);}functioncreateTempFile(name){createFile(`./temp/${name}`);}8.避免函数带来的副作用例如,1)函数内赋值全局变量2)使用深拷贝和浅拷贝直接操作函数内传入参数的对象badconstaddItemToCart=(cart,item)=>{car??t.push({item,date:Date.now()});};goodconstaddItemToCart=(cart,item)=>{return[...cart,{item,date:Date.now()}];};8.不要全局定义函数,会污染全局,导致库间冲突badArray.prototype.diff=functiondiff(comparisonArray){consthash=newSet(comparisonArray);returnthis.filter(elem=>!hash.has(elem));};goodclassSuperArrayextendsArray{diff(comparisonArray){consthash=newSet(cobstacleArray);返回this.filter(elem=>!hash.has(elem));}}9.函数式编程简单来说就是避免造轮子,利用已有的函数和函数库来实现你的功能不仅代码更简洁易实现10.封装条件语句badif(fsm.state==="fetching"&&isEmpty(listNode)){//...}goodfunctionshouldShowSpinner(fsm,listNode){returnfsm.state==="fetching"&&isEmpty(listNode);}if(shouldShowSpinner(fsmInstance,listNodeInstance)){//...}11.避免使用双重否定(垃圾代码),例如functionisDOMNodeNotPresent(node){//...}//isnot!这看起来很糟糕if(!isDOMNodeNotPresent(node)){//...}
