学会自己查错--完善各种可能情况!

最近看了一篇文章(http://mp.weixin.qq.com/s/6X8peCZXUWrroVBMBD5eyg),说的是一个前端技术经理对大部分前端面试者的分类,他以一个简单的面试题举例:

编写一个函数,用js,该函数有一个参数n(数字类型),其返回值是一个数组,该数组内是n个随机且不重复的整数,且整数取值范围是[2,32]。

如果愿意,你们也可以停下来,先把这个函数编写出来。

他把所有答案进行了总结,分成了:可用、健壮、‘可靠、宽容、精益求精5个方面。看完这个文章,我感觉到我之前考虑问题都是那么简单,其实还特别多情况是我忽略的。

实现了基本功能,可以达到可用阶段,你没有看错!仅仅是最低的阶段。

要想到健壮,就要做兼容性,参数的判断,包括类型,取值范围等。这些都是需求方不可能告诉你的。

然后是可靠,就是无论输入是什么,你一定要用相应的输出,就算是抛出错误也行。

宽容,就是尽可能的扩大你的参数允许范围,比如要的是一个数字, 我们可以扩大到字符串类型的数字。

最后是精益求精,就是无论代码多好,多宽容,都要想办法做到更加好,更加完善。

对于这个函数。我本能的只想着实现功能而已,这个不难。但是却没有想到是:

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);

其实,一句话,细节决定成败,想完成这个功能,大部分人都可以,但是细节的东西,我们都会忽略。

posted @ 2017-09-06 18:45  JavaScriptBUG  阅读(153)  评论(0编辑  收藏  举报