Upgrade to Pro — share decks privately, control downloads, hide ads and more …

js 代码规范

倪日哲
September 05, 2015

js 代码规范

之前在公司分享的内容,这里测试下

倪日哲

September 05, 2015
Tweet

Other Decks in Programming

Transcript

  1. 由于光云前端团队的扩张趋势,将来一定会遇到团队代码维护成本的问题,而统一的代码风格会提升 大量工作效率,势在必行。愿景是让每个人在改别人代码的时候,不再那么抓狂! 变量声明必须加var关键字,严格控制作用域; 变量声明全部集中在顶部,禁止在块级代码中声明变量,如if(true) {var a = 0;}; 建议使用驼峰式命名变量和函数,如:functionNamesLikeThis,ClassNamesLikeThis; 私有成员变量和方法命名以下划线开头,如:

    v a r _ t h i s ; 常量定义单词全部大写,以下划线连接,但不要用const关键字来声明,如: SOME_CONSTANTS,全局变量也用这种命名方式 jquery的dom变量,用$开头,如:var $input = $('input'); 函数参数大于3个时,应以对象形式作为参数集传递, API特殊处理; 禁止在代码块中声明函数,错误的范例:if (true) {function foo() {}}; 禁止用new来实例化基本类型,错误的范例:var x = new Boolean(false);正则不在范围内 直接定义数组或对象,而不使用new关键字声明,错误的范例:var a = new Array();var o = new Object(); 使用单引号''来定义字符串; 文件名必须全部用小写,文件名分隔符用中划线连接,版本连接符用实心点,如:passport- core.min.js。且使用常用的英文,避免使用拼音首字母拼接 函数表达式(有别于函数声明,如:function x(){})必须用分号结束,下面是错误的范例,第三行漏 背景 基本规范 分号
  2. 掉分号,后面的函数被当作参数传递给myMethod,导致解析错误: v a r m y M e t h

    o d = f u n c t i o n ( ) { r e t u r n 4 2 ; } ( f u n c t i o n ( ) { / / 一个匿名函数,在这里会被错误解析当作参数调用导致报错 } ) ( ) ; 由于无法完美的控制都不出现异常,所以尽量在可能但不确定出现异常的地方(大量运算,AJAX请 求,数组操作或DOM操作等)用try-catch(e)来抛出异常,这样有利于规模较大的项目中排查错误。 使用自定义异常抛出错误信息,更有利于错误信息阅读,且更加通用,因为不同浏览器抛出的信息不 一样,有时候可能很难定位到问题所在位置,特别是IE下可能遇到的如下报错信息: S t a c k o v e r f l o w a t l i n e : 0 或: 未知的运行时错误 不使用with关键字,容易造成作用域混乱; 通用全局函数,特别是通用组件代码应将业务逻辑放入闭包中,并通过“命名空间”将其引入; 若函数中使用到全局变量,则访问全局变量时应使用window来引入,如: v a r s o m e v a r = 1 0 ; f u n c t i o n g e t v a r ( ) { v a r n u m = w i n d o w . s o m e v a r + 1 ; / / . . . 异常 作用域相关
  3. r e t u r n n u m ;

    } 没有强制要求代码需格式化成什么样子,但尽量使代码具有较高的可读性。下面给出一些建议的代码 风格: / / 花括号起始位置与语句开始在同一行 i f ( s o m e t h i n g ) { / / . . . } e l s e { / / . . . } / / 数组和对象书写 v a r a r r = [ 1 , 2 , 3 ] ; / / [ 之后,] 之前没有空格 v a r o b j = { a : 1 , b : 2 , c : 3 } ; / / { 之后,} 之前没有空格 / / 多行数组和对象书写 v a r a = [ ' h u a n g r o n g r o n g ' , ' c h e n y i n g ' , ' s m a l l g r e y g r e y ' , ' s h e n s h u n l i n ' ] ; v a r p o s = { t o p : 1 0 , r i g h t : 2 0 , b o t t o m : 1 5 , l e f t : 1 2 } ; 格式化代码
  4. / / 将业务逻辑相关的代码写一起,不相关的以空行分隔 d o S o m e t

    h i n g T o ( x ) ; d o S o m e t h i n g E l s e T o ( x ) ; a n d T h e n ( x ) ; n o w D o S o m e t h i n g W i t h ( y ) ; a n d N o w W i t h ( z ) ; v a r x = a ? b : c ; / / 一行能写完, 一行8 0 个字符左右 / / 写不完可以换行加缩进 v a r y = a ? l o n g B u t S i m p l e O p e r a n d B : l o n g B u t S i m p l e O p e r a n d C ; / / 或者这样 v a r z = a ? m o r e C o m p l i c a t e d B : m o r e C o m p l i c a t e d C ; 对于代码中需要进行==逻辑判断的变量,建议进行强制类型转换或使用===代替。 下列值在布尔表达式中结果为false: null undefined '' //空字符串 0 //数字 而下面的为true: '0' //字符串 类型转换
  5. [] //空数组 {} //空对象 平时开发: 单行注释使用//,多行使用/* ... */; 注释名词:TODO-将要做的;HACK-用了些坑爹的技巧,必须详细描述下 BUG-要及时解决的

    FIXME-现在没办法只能先这样 建议加入开发者个人信息及最后修改时间注释,虽然这些信息不会被YUIDoc解析显示; 组件开发: 文档注释遵循YUIDoc规范(http://yui.github.io/yuidoc/syntax/),所有的文件、类、方法和属性都 应该用合适的标记和类型进行注释。 YUIDoc要求文档中至少要有一个class和constructor标记来定义类和构造函数; YUIDoc中注释块必须以/**(至少两个星号)开头; 方法、参数和返回值等必须有注释说明; 下面给出代码注释实例作为参考,更多标记和类型定义请参考YUIDoc官方文档。 / * * 这是一个M y C l a s s 类 @ c l a s s M y C l a s s @ c o n s t r u c t o r @ a u t h o r x x < x x @ g m a i l . c o m > @ m o d i f i e d s o m e o n e @ d a t e 2 0 1 5 ‐ 0 6 ‐ 0 3 * * / 注释规范
  6. f u n c t i o n M y

    C l a s s = f u n c t i o n ( ) { } ; / * * M y m e t h o d d e s c r i p t i o n . L i k e o t h e r p i e c e s o f y o u r c o m m e n t b l o c k s , t h i s c a n s p a n m u l t i p l e l i n e s . @ m e t h o d c s s @ p a r a m p r o p { S t r i n g } s e t / g e t a c s s p r o p e r t y @ p a r a m [ v a l u e ] { S t r i n g } A v a l u e y o u w a n t t o s e t t o a c s s p r o p e r t y @ e x a m p l e e l e . c s s ( ' w i d t h ' , ' 1 0 0 % ' ) ; @ r e t u r n { B o o l e a n } R e t u r n s t r u e o n s u c c e s s * * / M y C l a s s . p r o t o t y p e . c s s = f u n c t i o n ( p r o p , v a l u e ) { } ; 取消strict模式,加入raycloud全局变量 { / / J S H i n t D e f a u l t C o n f i g u r a t i o n F i l e ( a s o n J S H i n t w e b s i t e ) / / S e e h t t p : / / j s h i n t . c o m / d o c s / f o r m o r e d e t a i l s " m a x e r r " : 5 0 , / / { i n t } M a x i m u m e r r o r b e f o r e s t o p p i n g / / E n f o r c i n g " b i t w i s e " : t r u e , / / t r u e : P r o h i b i t b i t w i s e o p e r a t o r s ( & , | , ^ , e t c . ) " c a m e l c a s e " : f a l s e , / / t r u e : I d e n t i f i e r s m u s t b e i n c a m e l C a s e " c u r l y " : t r u e , / / t r u e : R e q u i r e { } f o r e v e r y n e w b l o c k o r s c o p e " e q e q e q " : t r u e , / / t r u e : R e q u i r e t r i p l e e q u a l s ( = = = ) f o r c o m p a r i s o n " f o r i n " : t r u e , / / t r u e : R e q u i r e f i l t e r i n g f o r . . i n l o o p s w i t h o b j . h a s O w n P r o p e r t y ( ) " f r e e z e " : t r u e , / / t r u e : p r o h i b i t s o v e r w r i t i n g p r o t o t y p e s o f n a t i v e o b j e c t s s u c h a s A r r a y , D " i m m e d " : f a l s e , / / t r u e : R e q u i r e i m m e d i a t e i n v o c a t i o n s t o b e w r a p p e d i n p a r e n s e . g . ` ( f u n c t i JSHint配置
  7. " i n d e n t " : 4

    , / / { i n t } N u m b e r o f s p a c e s t o u s e f o r i n d e n t a t i o n " l a t e d e f " : f a l s e , / / t r u e : R e q u i r e v a r i a b l e s / f u n c t i o n s t o b e d e f i n e d b e f o r e b e i n g u s e d " n e w c a p " : f a l s e , / / t r u e : R e q u i r e c a p i t a l i z a t i o n o f a l l c o n s t r u c t o r f u n c t i o n s e . g . ` n e w F ( ) ` " n o a r g " : t r u e , / / t r u e : P r o h i b i t u s e o f ` a r g u m e n t s . c a l l e r ` a n d ` a r g u m e n t s . c a l l e e ` " n o e m p t y " : t r u e , / / t r u e : P r o h i b i t u s e o f e m p t y b l o c k s " n o n b s p " : t r u e , / / t r u e : P r o h i b i t " n o n ‐ b r e a k i n g w h i t e s p a c e " c h a r a c t e r s . " n o n e w " : f a l s e , / / t r u e : P r o h i b i t u s e o f c o n s t r u c t o r s f o r s i d e ‐ e f f e c t s ( w i t h o u t a s s i g n m e n t ) " p l u s p l u s " : f a l s e , / / t r u e : P r o h i b i t u s e o f ` + + ` & ` ‐ ‐ ` " q u o t m a r k " : f a l s e , / / Q u o t a t i o n m a r k c o n s i s t e n c y : / / f a l s e : d o n o t h i n g ( d e f a u l t ) / / t r u e : e n s u r e w h a t e v e r i s u s e d i s c o n s i s t e n t / / " s i n g l e " : r e q u i r e s i n g l e q u o t e s / / " d o u b l e " : r e q u i r e d o u b l e q u o t e s " u n d e f " : t r u e , / / t r u e : R e q u i r e a l l n o n ‐ g l o b a l v a r i a b l e s t o b e d e c l a r e d ( p r e v e n t s g l o b a l l e " u n u s e d " : t r u e , / / U n u s e d v a r i a b l e s : / / t r u e : a l l v a r i a b l e s , l a s t f u n c t i o n p a r a m e t e r / / " v a r s " : a l l v a r i a b l e s o n l y / / " s t r i c t " : a l l v a r i a b l e s , a l l f u n c t i o n p a r a m e t e r s " s t r i c t " : f a l s e , / / t r u e : R e q u i r e s a l l f u n c t i o n s r u n i n E S 5 S t r i c t M o d e " m a x p a r a m s " : f a l s e , / / { i n t } M a x n u m b e r o f f o r m a l p a r a m s a l l o w e d p e r f u n c t i o n " m a x d e p t h " : f a l s e , / / { i n t } M a x d e p t h o f n e s t e d b l o c k s ( w i t h i n f u n c t i o n s ) " m a x s t a t e m e n t s " : f a l s e , / / { i n t } M a x n u m b e r s t a t e m e n t s p e r f u n c t i o n " m a x c o m p l e x i t y " : f a l s e , / / { i n t } M a x c y c l o m a t i c c o m p l e x i t y p e r f u n c t i o n " m a x l e n " : f a l s e , / / { i n t } M a x n u m b e r o f c h a r a c t e r s p e r l i n e / / R e l a x i n g " a s i " : f a l s e , / / t r u e : T o l e r a t e A u t o m a t i c S e m i c o l o n I n s e r t i o n ( n o s e m i c o l o n s ) " b o s s " : f a l s e , / / t r u e : T o l e r a t e a s s i g n m e n t s w h e r e c o m p a r i s o n s w o u l d b e e x p e c t e d " d e b u g " : f a l s e , / / t r u e : A l l o w d e b u g g e r s t a t e m e n t s e . g . b r o w s e r b r e a k p o i n t s . " e q n u l l " : f a l s e , / / t r u e : T o l e r a t e u s e o f ` = = n u l l ` " e s 5 " : f a l s e , / / t r u e : A l l o w E S 5 s y n t a x ( e x : g e t t e r s a n d s e t t e r s ) " e s n e x t " : f a l s e , / / t r u e : A l l o w E S . n e x t ( E S 6 ) s y n t a x ( e x : ` c o n s t ` ) " m o z " : f a l s e , / / t r u e : A l l o w M o z i l l a s p e c i f i c s y n t a x ( e x t e n d s a n d o v e r r i d e s e s n e x t f e a t u r / / ( e x : ` f o r e a c h ` , m u l t i p l e t r y / c a t c h , f u n c t i o n e x p r e s s i o n … ) " e v i l " : f a l s e , / / t r u e : T o l e r a t e u s e o f ` e v a l ` a n d ` n e w F u n c t i o n ( ) ` " e x p r " : f a l s e , / / t r u e : T o l e r a t e ` E x p r e s s i o n S t a t e m e n t ` a s P r o g r a m s " f u n c s c o p e " : f a l s e , / / t r u e : T o l e r a t e d e f i n i n g v a r i a b l e s i n s i d e c o n t r o l s t a t e m e n t s " g l o b a l s t r i c t " : f a l s e , / / t r u e : A l l o w g l o b a l " u s e s t r i c t " ( a l s o e n a b l e s ' s t r i c t ' )
  8. " i t e r a t o r "

    : f a l s e , / / t r u e : T o l e r a t e u s i n g t h e ` _ _ i t e r a t o r _ _ ` p r o p e r t y " l a s t s e m i c " : f a l s e , / / t r u e : T o l e r a t e o m i t t i n g a s e m i c o l o n f o r t h e l a s t s t a t e m e n t o f a 1 ‐ l i n e b " l a x b r e a k " : f a l s e , / / t r u e : T o l e r a t e p o s s i b l y u n s a f e l i n e b r e a k i n g s " l a x c o m m a " : f a l s e , / / t r u e : T o l e r a t e c o m m a ‐ f i r s t s t y l e c o d i n g " l o o p f u n c " : f a l s e , / / t r u e : T o l e r a t e f u n c t i o n s b e i n g d e f i n e d i n l o o p s " m u l t i s t r " : f a l s e , / / t r u e : T o l e r a t e m u l t i ‐ l i n e s t r i n g s " n o y i e l d " : f a l s e , / / t r u e : T o l e r a t e g e n e r a t o r f u n c t i o n s w i t h n o y i e l d s t a t e m e n t i n t h e m . " n o t y p e o f " : f a l s e , / / t r u e : T o l e r a t e i n v a l i d t y p e o f o p e r a t o r v a l u e s " p r o t o " : f a l s e , / / t r u e : T o l e r a t e u s i n g t h e ` _ _ p r o t o _ _ ` p r o p e r t y " s c r i p t u r l " : f a l s e , / / t r u e : T o l e r a t e s c r i p t ‐ t a r g e t e d U R L s " s h a d o w " : f a l s e , / / t r u e : A l l o w s r e ‐ d e f i n e v a r i a b l e s l a t e r i n c o d e e . g . ` v a r x = 1 ; x = 2 ; ` " s u b " : f a l s e , / / t r u e : T o l e r a t e u s i n g ` [ ] ` n o t a t i o n w h e n i t c a n s t i l l b e e x p r e s s e d i n d o t " s u p e r n e w " : f a l s e , / / t r u e : T o l e r a t e ` n e w f u n c t i o n ( ) { . . . } ; ` a n d ` n e w O b j e c t ; ` " v a l i d t h i s " : f a l s e , / / t r u e : T o l e r a t e u s i n g t h i s i n a n o n ‐ c o n s t r u c t o r f u n c t i o n / / E n v i r o n m e n t s " b r o w s e r " : t r u e , / / W e b B r o w s e r ( w i n d o w , d o c u m e n t , e t c ) " b r o w s e r i f y " : f a l s e , / / B r o w s e r i f y ( n o d e . j s c o d e i n t h e b r o w s e r ) " c o u c h " : f a l s e , / / C o u c h D B " d e v e l " : t r u e , / / D e v e l o p m e n t / d e b u g g i n g ( a l e r t , c o n f i r m , e t c ) " d o j o " : f a l s e , / / D o j o T o o l k i t " j a s m i n e " : f a l s e , / / J a s m i n e " j q u e r y " : t r u e , / / j Q u e r y " m o c h a " : t r u e , / / M o c h a " m o o t o o l s " : f a l s e , / / M o o T o o l s " n o d e " : f a l s e , / / N o d e . j s " n o n s t a n d a r d " : f a l s e , / / W i d e l y a d o p t e d g l o b a l s ( e s c a p e , u n e s c a p e , e t c ) " p h a n t o m " : f a l s e , / / P h a n t o m J S " p r o t o t y p e j s " : f a l s e , / / P r o t o t y p e a n d S c r i p t a c u l o u s " q u n i t " : f a l s e , / / Q U n i t " r h i n o " : f a l s e , / / R h i n o " s h e l l j s " : f a l s e , / / S h e l l J S " t y p e d " : f a l s e , / / G l o b a l s f o r t y p e d a r r a y c o n s t r u c t i o n s " w o r k e r " : f a l s e , / / W e b W o r k e r s " w s h " : f a l s e , / / W i n d o w s S c r i p t i n g H o s t " y u i " : f a l s e , / / Y a h o o U s e r I n t e r f a c e / / C u s t o m G l o b a l s
  9. 每个项目根目录下,添加一个README.md;记录项目启动方式(start up),参考资料等等 语法使用MarkDown,因为它有以下优点: 阅读优雅 书写简便 通用化 这里有个在线编辑器分享 ppt 腾讯前端代码规范 《编写可维护的javascript》

    《编写可读代码的艺术》 " g l o b a l s " : { " R a y C l o u d " : t r u e , " d e f i n e " : t r u e , " r e q u i r e " : t r u e } / / a d d i t i o n a l p r e d e f i n e d g l o b a l v a r i a b l e s } 文档规范 参考文档