转载的一道小米面试题和自己的写法

来源:互联网 发布:中国足球知乎 编辑:程序博客网 时间:2024/06/05 22:50

转载 的一道小米的面试题

写一个函数stringconcat, 要求能

var result1 = stringconcat(“a”, “b”) result1 = “a+b”

var stringconcatWithPrefix = stringconcat.prefix(“hellworld”);

var result2 = stringconcatWithPrefix(“a”, “b”) result2 = “hellworld+a+b”

首先拿到这道题,其实就是一个简单的闭包。然后我就这么写了:


<script type="text/javascript">            window.onload = function() {                 function stringconcat(a,b){                    return a+"+"+b;                 }                 //Function.prototype.prefix = function(str){                 // function addOne(a,b){                 //     return str+"+"+stringconcat(a,b);                 // }                 // return addOne;                 //}                //注意,这是之前写的,这里这种方式拓展內建函数是不好的。                stringconcat.prefix = function(str){                    function addOne(a,b){                        return str+"+"+stringconcat(a,b);                    }                    return addOne;                 }                 var result1 = stringconcat("a","b");                 var stringconcatWithPrefix = stringconcat.prefix('helloworld');                 var result2 = stringconcatWithPrefix("a","b");                 console.log(result1);                 console.log(result2);                }        </script>

然后一看结果,对了。然后我又回去看了一下原博主的答案,发现自己的写法真的好low - -!

一下是原博主的写法(为了方便大家观看,我调整了一下函数的顺序)


function stringconcat() {                var result = [];                stringconcat.merge.call(null, result, arguments); //自身调用merge方法 ,就这道面试题来说  这里  resul  =[a,b]。                return result.join("+");  //这里将数组拼接成字符串  "a+b"            }            stringconcat.merge = function(array, arrayLike) {  //这里给stringconcat添加了一个merge方法                var i = 0;                for(i = 0; i < arrayLike.length; i++) {                    array.push(arrayLike[i]);  // 在本题中这里的作用是将內建变量arguments里面的元素全部搬到自己的数组里面                }            }            stringconcat.prefix = function() {  //又为stringconcat添加了一个方法                var _arguments = [],                    _this = this;  // 放回stringconcat                _this.merge.call(null, _arguments, arguments);                  return function() {  //闭包返回一个函数。                    var _args = _arguments.slice(0);  // 这里只取第一个元素,也就是stringconcat.prefix的第一个参数                    _this.merge.call(null, _args, arguments);                    return _this.apply(null, _args);  // call()与apply()方法类似                };            };
为了方便大家阅读呢,我在原博主的代码的基础上添加了自己理解的注释,由于自身知识浅薄,可能在理解上有错误,欢迎大家斧正。

两个版本的比较:

当然是我写的那个low啦。至于low在哪里:

首先是在stringconcat这个函数中,我只考虑了两个参数的情况,在本题中也就是a,b。

如果在实际开发中成百上千个,我想我就吃不消了,而且在参数传入的写法上我也欠缺考虑,如果使用函数的人传入的不是一个一个的参数,而是一个数组,那么我写的那个就GG了。

第二个low点,就是在stringconcat.prefix方法中,我忘了考虑使用的人误操作,或者恶意操作的情况,在题目中它要的是第一个参数。而我写的时候和调试的时候也只会写一个参数。但是万一使用的人不是我,填写了很多的实参,我想也得不到想要的结果。。。。。

至于面向对象和面向过程在这道题目里面优势不明显

原博主出处http://www.cnblogs.com/iyangyuan/p/4119166.html

0 0
原创粉丝点击