最近看了一篇文章(http://mp.weixin.qq.com/s/6X8peCZXUWrroVBMBD5eyg),說的是一個前端技術經理對大部分前端面試者的分類,他以一個簡單的面試題舉例:前端
編寫一個函數,用js,該函數有一個參數n(數字類型),其返回值是一個數組,該數組內是n個隨機且不重複的整數,且整數取值範圍是[2,32]。面試
若是願意,大家也能夠停下來,先把這個函數編寫出來。數組
他把全部答案進行了總結,分紅了:可用、健壯、‘可靠、寬容、精益求精5個方面。看完這個文章,我感受到我以前考慮問題都是那麼簡單,其實還特別多狀況是我忽略的。dom
實現了基本功能,能夠達到可用階段,你沒有看錯!僅僅是最低的階段。函數
要想到健壯,就要作兼容性,參數的判斷,包括類型,取值範圍等。這些都是需求方不可能告訴你的。測試
而後是可靠,就是不管輸入是什麼,你必定要用相應的輸出,就算是拋出錯誤也行。spa
寬容,就是儘量的擴大你的參數容許範圍,好比要的是一個數字, 咱們能夠擴大到字符串類型的數字。code
最後是精益求精,就是不管代碼多好,多寬容,都要想辦法作到更加好,更加完善。blog
對於這個函數。我本能的只想着實現功能而已,這個不難。可是卻沒有想到是:字符串
1.函數的參數是否存在,你須要進行校檢。
2.函數參數是否爲數字。
3.參數的取值範圍。
完成這三個能夠達到健壯。
4.若是n是一個字符串數字,應該任何處理。
5.若是n是一個浮點數,帶小數的話,相似1.9004,函數應該怎麼辦。
6.註釋!也是對閱讀你代碼的其餘人的一種寬容。
再完成這3個能夠達到寬容。
能達到寬容的境界,通常都是比較完善的代碼了。下面是我修改了我可用的代碼以後的最終代碼:
1 /* 2 randomArray函數是主函數,先對傳入的參數進行判斷是否符合numbe類型而且是,而後生成隨機數,最後判斷生成的隨機數 3 是否在數組內已經存在,不存在就push進去,不然,從新生成隨機數重來一遍。 4 */ 5 function randomArray(n){ 6 if(typeof n=="undefined")throw new Error("randomArray函數沒有參數!"); 7 if(typeof parseInt(n) == "number"){//判斷參數是否是數字的字符串形式而且對浮點數會自動向下取整 8 n = parseInt(n); 9 } 10 if(isNaN(n)) return [];//判斷參數是否是數字形式 11 if(n<1||n>31)return [];//判斷參數是否是在1到31範圍內 12 var arr = []; 13 for(var i=0;i<n;i++){ 14 var ranNum = ranNumFrom2To32();
15 if(checkNumInArr(ranNum,arr)){ 16 arr.push(ranNum); 17 }else{ 18 i--; 19 } 20 } 21 return arr; 22 } 23 24 /* 25 生成一個2到32的隨機數 26 */ 27 function ranNumFrom2To32(){ 28 return Math.floor(Math.random()*31)+2; 29 } 30 /* 31 查看數組內是否已經存在num。返回布爾值。 32 */ 33 function checkNumInArr(num,arr){ 34 if(arr.length!=0){ 35 for(var j in arr){ 36 if(arr[j]==num){ 37 return false; 38 } 39 } 40 return true; 41 } 42 else{ 43 return true; 44 } 45 } 46 47 //測試 48 var Arr = randomArray("10"); 49 alert(Arr);
其實,一句話,細節決定成敗,想完成這個功能,大部分人均可以,可是細節的東西,咱們都會忽略。