javascript-style-guide

  1 /*
  2 1.類型types
  3     原始值:存取直接做用於它自身
  4         string
  5         number
  6         boolean
  7         null
  8         undefined        
  9             var foo=1;
 10             var bar=foo;
 11             bar=9;
 12             console.log(foo,bar);//=>1,9        
 13     複雜類型:存取時做用於它自身值的引用
 14         object
 15         array
 16         function
 17             var foo=[1,2];
 18             var bar=foo;
 19             bar[0]=9;
 20             console.log(foo,bar);//=>1,9
 21 2.對象objects
 22     使用直接量建立對象
 23         //bad
 24         var item=new Object();
 25         //good
 26         var item={};
 27     不要使用保留字做爲鍵名,它們在IE8下不工做
 28         //bad
 29         var superman={
 30             default:{clark:‘kent’},
 31             private:ture;
 32         };
 33         //good
 34         var superman={
 35             default:{clark:‘kent’},
 36             hidden:ture;
 37         };
 38     使用同義詞替換須要使用的保留字
 39         //bad
 40         var superman={
 41             class:'alien'
 42         };
 43         //bad
 44         var superman={
 45             klass:'alien'
 46         };
 47         //good
 48         var superman={
 49             type:'alien'
 50         };
 51 3.數組arrays
 52     使用直接量建立數組
 53         //bad
 54         var items=new Array();
 55         //good
 56         var items=[];
 57     向數組增長元素時使用Array#push來替代直接賦值
 58         var someStack=[];
 59         //bad
 60         someStack[someStack.length]='abcdefghi';
 61         //good
 62         someStack.push('abcdefghi');
 63     當你須要拷貝數組時,使用Array#slice.
 64         var len=items.length;
 65         var itemsCopy=[];
 66         var i;
 67         //bad
 68         for(i=0;i<len;i++){
 69             itemsCopy[i]=items[i];
 70         }
 71         //good
 72         itemsCopy=items.slice();
 73     使用Array#slice將類數組對象轉換成數組
 74         function trigger(){
 75             var args=Array.prototype.slice.call(arguments);
 76         }
 77 4.字符串strings
 78     使用單引號‘’包裹字符串
 79         //bad
 80         var name=「bob parr";
 81         //good
 82         var name='bob parr';
 83         //bad
 84         var fullName="bob"+this.lastName;
 85         //good
 86         var fullName=‘bob’+this.lastName;
 87     超過100個字符的字符串應該使用連接字符寫成多行。
 88     注:若過分使用,經過鏈接符鏈接的長字符串可能會影響性能。
 89         //bad
 90         var errorMessage='this is a super long error that was thrown because of batman.when you stip to think';
 91         var errorMessage='this is a super long error that was thrown\
 92         because of batman.\
 93         when you stip to think';
 94         //good
 95         errorMessage='this is a super long error that was thrown'+
 96         'because of batman.'+
 97         'when you stip to think';
 98     程序化生成的字符串使用Array#join鏈接而不是使用鏈接符。尤爲是IE下;
 99         var items;
100         var messages;
101         var length;
102         var i;
103         
104         messages=[{
105             state:'success',
106             message:'this one worked'
107         },{
108             state:'success',
109             message:'this one worked as well'
110         },{
111             state:'error',
112             message:'this one did not work'
113         }];
114         legnth=messages.length;
115         //bad
116         function inbox(messages){
117             items='<ul>';
118             for(i=0;i<length;i++){
119                 items+='<li>'+messages[i].message+'</li>';
120             }
121             return items+'</ul>';
122         }
123         //good
124         function inbox(messages){
125             items=[];
126             for(i=0;i<length;i++){
127                 items[i]='<li>'+messages[i].message+'</li>';
128             }
129             return '<ul>'+items.join('')+'</ul>';
130         }
131 5.函數functions
132     函數表達式
133         //匿名函數表達式
134         var anonymous=function(){
135             return true;
136         }
137         //命名函數表達式
138         var named=function named(){
139             return true;
140         }
141         //當即調用的函數表達式(IIFE)
142         (function(){
143             console.log('welcome to the internet');
144         }());
145     永遠不要在一個非函數代碼塊(if、while等)中聲明一個函數,把那個函數賦給一個變狼。瀏覽器容許你這麼作,但它們的解析表現不一致。
146     注:ECMA-262把塊定義爲一組語句。函數聲明不是語句。
147     //bad
148     if(currentUser){
149         function test(){
150             console.log('Nope');
151         }
152     }
153     //good
154     var test;
155     if(currentUser){
156         test=function test(){
157             console.log('Yup');
158         };
159     }
160     永遠不要把參數命名爲arguments。這將取代函數做用域內的arguments對象。
161         // bad
162         function nope(name, options, arguments) {
163             // ...stuff...
164         }
165 
166         // good
167         function yup(name, options, args) {
168             // ...stuff...
169         }
170     
171 6.屬性properties
172     使用.來訪問對象的屬性。
173         var luke={
174             jedi:ture;
175             age:28
176         };
177         //bad
178         var isJedi=luke['jedi'];
179         //good
180         var isJedi=luke.jedi;
181     當經過變量訪問屬性時,使用中括號[]
182         var luke={
183             jedi:ture;
184             age:28
185         };
186         function getProp(prop){
187             return luke[prop];
188         }
189         var isJedi=getProp('jedi');
190 7.變量varibles
191     老是使用var來聲明變量。不這麼作將致使產生全局變量。咱們要避免污染全局命名空間。
192         //bad
193         superPower=new SuperPower();
194         //good
195         var superPower=new SuperPower();
196     使用var聲明每個變量。這樣作的好處是增長新變量將變得更加容易,並且你永遠不用再擔憂調換錯;跟,。
197         //good
198         var items=getItems();
199         var    goSportsTeam=ture;
200         var    dr='z';
201     最後再聲明未賦值的變量,當你須要引用前面的變量賦值時這將變的頗有用。
202         var items=getItems();
203         var    goSportsTeam=ture;
204         var    dragonball;
205         var i;
206     在做用域頂部聲明變量。這將幫助你避免變量聲明提高相關的問題。    
207 8.提高hoisting
208     變量聲明會提高至做用域頂部,但賦值不會。
209     匿名函數表達式會提高它們的變量名,但不會提高函數的賦值。
210     命名函數表達式會提高函數名,但不會提高函數名或函數體。
211     函數聲明提高它們的名字和函數體。
212         function example() {
213             superPower(); // => Flying
214 
215             function superPower() {
216                 console.log('Flying');
217             }
218         }
219 9.比較預算法&等號comparison-operators-equality
220     優先使用===和!==而不是==和!=
221     條件表達式例如if語句經過抽象方法ToBoolean強制計算它們的表達式而且老是遵照下面的規則。
222         對象被計算爲true
223         undefined被計算爲false
224         Null被計算爲false
225         布爾值被計算爲布爾值
226         數字若是是+0、-0或NaN被計算爲false,負責爲true
227         字符串若是是空字符串‘’被計算爲false,負責爲true
228             if([0]){
229                 //true
230                 //一個數組就是一個對象,對象被計算爲true
231             }
232     使用快捷方式
233     //bad
234     if(name!==''){
235         //stuff
236     }
237     //good
238     if(name){
239         //stuff
240     }
241     //bad
242     if(collection.length>0){
243         //stuff
244     }
245     //good
246     if(collection.length){
247         //stuff
248     }
249 10.塊blocks
250     使用大括號包裹全部的多行代碼塊
251         if(test){
252             return false;
253         }
254         function(){
255             return false;
256         }
257     若是經過if和else使用多行代碼塊,把else放在if代碼塊關閉括號的同一行
258         if(test){
259             thing1();
260         }else{
261             thing2();
262         }
263 11.註釋comments
264     使用/+*..*+/做爲多行註釋,包含描述、指定全部參數和返回值得類型和值
265     使用//做爲單行註釋,在評論對象上面另起一行使用單行註釋。在註釋錢插入空行
266         // good
267         // is current tab
268         var active = true;
269         
270         // good
271         function getType() {
272             console.log('fetching type...');
273 
274             // set the default type to 'no type'
275             var type = this.type || 'no type';
276 
277             return type;
278         }
279     使用FIXME或TODO的前綴能夠幫助其餘開發者快速瞭解這是一個須要複查的問題
280         //FIXME:shouldn`t use a global here
281         //TODO:total should be configurable by an options param
282 12.空白whitespace
283     使用2個空格做爲縮進
284     在大括號前方一個空格
285     function test() {
286         
287     }
288     在控制語句(if、while等)的小括號前放一個空格。在函數調用及聲明中,不在函數參數列表前加空格。
289     使用空格把運算符隔開。
290         var x = y + 5;
291     在文件末尾插入一個空行
292     在使用長方法鏈時進行縮進。使用前面的點.強調這是方法調用而不是新語句
293         $('items')
294             .find('selected')
295                 .highlight()
296                 .end()
297             .find('open')
298                 .updateCount();
299     在塊末和新語句前插入空行。
300 13.逗號commas
301     行首逗號:不須要  
302     額外的行末逗號:不須要
303         var story=[
304             once,
305             upon,
306             aTime
307         ];
308 14.分號semicolons
309     使用分號
310         //good
311         (function() {
312             var name='sky';
313             return name;
314         })();
315         //good (防止函數在兩個IIFE合併時被當成一個參數)
316         ;(function() {
317             var name='sky';
318             return name;
319         })();
320 15.類型轉化type-casting-coercion
321     在語句開始時執行類型轉換
322     使用parseInt轉換數字時老是帶上類型轉換的基數;
323         var inputValue='4';
324         //bad
325         var val=new Number(inputValue);
326         //bad
327         var val=+inputValue;
328         //bad
329         var val=parseInt(inputValue);
330         //good
331         var val=Number(inputValue);
332         //good
333         var val=parseInt(inputValue,10);
334     布爾:
335         var age=0;
336         //bad
337         var hasAge=new Boolean(age);
338         //good
339         var hasAge=Boolean(age);
340         //good
341         var hasAge=!!age;
342         
343 16.命名規則naming-conventions
344     避免單字母命名,命名應具有描述下
345     使用駝峯式命名對象、函數和實例
346     使用帕卡斯式命名構造函數或類
347         //bad
348         function user(){
349             this.namme=options.name;
350         }
351         //good
352         function User(){
353             this.namme=options.name;
354         }
355         var good=new User(){
356             name:'hip';
357         }
358     不要使用下劃線前/後綴,javascript沒有私有屬性或方法的概念
359         //bad
360         this._firstName_='';
361         //good
362         this.firstName='';
363     不要保存this的應用,使用Function#bind
364         //bad
365         function(){
366             var self=this;
367             return function(){
368                 console.log(self);
369             };
370         }
371         //good
372         function() {
373             return function() {
374                 console.log(this);
375             }.bind(this);
376         }
377     給函數命名,這在作堆棧軌跡時頗有幫助
378         //bad 
379         var log=function(msg) {
380             console.log(msg);
381         };
382         //good
383         var log=function log(msg) {
384             console.log(msg);
385         }
386     
387 17.存取器accessors
388     屬性的存取函數不是必須的
389     若是你須要存取函數時使用getVal()和setVal('hello'),便於理解函數的用途
390     若是屬性時布爾值,使用isVal()或hasVal()    
391 18.事件events
392     當給事件附加數據時,傳入一個哈希而不是原始值。這樣可讓後面的貢獻者增長更
393     多數據到事件數據而無需找出並更新事件的每個處理器。
394         //bad
395         $(this).trigger('listingUpdated','listing.id');
396         //good
397         $(this).trigger('listingUpdated',{listingId:listing.id});
398 
399 
400 
401 */
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息