原题目地址:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html

答案丰富多彩。我只是记录下自己思考了半天全部的答案。

题目一:找出数字数组中最大的元素(使用Match.max函数)

这个题目,看到Match,不知道啥东西,结果放在最后,

用了个很笨的解决方法:

var arr=[0,1,2,3,4,5,6,7,8,9],arrFunc = [], max = -Infinity
for(var i = 0, l = arr.length; i < l; i++){
max = Math.max(max,arr[i])
}
console.log(max);

后来看了下原文评论,原来这么简单。

var arr=[0,1,2,3,4,5,6,7,8,9];
console.log(Math.max.apply(null,arr))

这个问题就没啥好解析的了。

题目二:转化一个数字数组为function数组(每个function都弹出相应的数字)

for循环闭包的问题,大叔的文章很多提到这个问题。

var arr=[0,1,2,3,4,5,6,7,8,9],arrFunc = [];
for(var i = 0, l = arr.length; i < l; i++){
arrFunc.push((function(i) {
return function() {
console.log(arr[i]);
}
})(i))
}

个人觉得对于闭包最简单的解析:闭包的作用就是保存当前的作用链域的环境。

题目三:给object数组进行排序(排序条件是每个元素对象的属性个数)

这个说起来好像很坑爹的赶脚。我居然用了这么笨的想法。

Object.prototype.myLength = function(){
var length = 0;
for(var i in this){
length ++;
}
return length;
}
var objArr = [
{a:1, b:2, c:5, d:7, e:8, g:0, h:12, i:5, v:9, w:9, x:9, y:9, z: 15},
{a:2, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, x:9, y:9, z:9 },
{a:3, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, q:0 },
{a:4, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, w:9, x:9, y:9, z:9 },
{a:5, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, v:9, w:9, x:9, y:9, z:9 },
{a:6, b:2, c:5, d:7, e:8, g:0, h:12, i:5, j:7, k:5, l:9, m:9, n:0, o:1, p:9, q:0, r:8, s:9, t:9, z:9 },
{a:7, b:2, c:5, d:7, e:8, x:9, y:9, z:9 }
];
// arr before sort
var numArr1 = []
for(var i = 0, l = objArr.length; i < l; i++ ){
numArr1.push( objArr[i].myLength() )
}
console.log(numArr1.join(" ")) //result
// arr after sort
objArr.sort(function(a,b){
// stable sort
// return (a.myLength() > b.myLength()) === true? 1:-1;
// unstable sort
return (a.myLength() >= b.myLength()) === true? 1:-1;
// return a.myLength() - b.myLength();
})
var numArr2 = []
for(var i = 0, l = objArr.length; i < l; i++ ){
// console.log(i,l,objArr[i].myLength());
numArr2.push( objArr[i].myLength() )
}
console.log(numArr2.join(" ")) //result

感觉突然自己的想法和别人的有点不同(不好的方向)。

题目四:利用JavaScript打印出Fibonacci数(不使用全局变量)

这个问题,写完之后我看了下其他人的写法,一半一半都没写中间缓存保存,我觉得这也是大叔表明不适用全局变量的原因,我把两种方式都写了进去。

这个是有缓存的,

var fibonacci = (function(){
var s = [];
var fun = function(x) {
if(s[x]){
return s[x];
}
if(x < 0) {
throw "Can't be negative";
return ;
}
else if(x === 0 || x === 1) {
s[x] = s[x] || x;
return s[x];
}
else{
s[x] = ( fun(x - 1) + fun(x - 2) );
return s[x];
}
};
fun.print = function() {
console.log(s.join(" "));
}
fun.printLast = function() {
// console.log(s.length);
return(s[s.length-1]);
}
window.s = s;
return fun; })()
console.time(200);
console.log(fibonacci(200));
console.log(fibonacci.printLast());
console.log(fibonacci.print());
console.timeEnd(200);

测试几百几千位的时间不足1000ms。

这个是递归无缓存的,

var fibonacci2 = function(x){
if(x < 0) {
throw "Can't be negative";
return ;
}
if(x === 0 || x === 1) {
return x;
}
var num = ( fibonacci2(x - 1) + fibonacci2(x - 2) )
return num;
}
console.time(32);
console.log(fibonacci2(32));
console.timeEnd(32);

测试个32位已经4000ms+,时间呈数量级增长,太坑。

题目五:实现如下语法的功能:var a = (5).plus(3).minus(6); //2

这个算是最简单的吧,但是我居然和别人的不一样,都能运行。

Number.prototype.plus = function(x) {
var num = this.valueOf() + x;
return Number(num);
}
Number.prototype.minus = function(x) {
var num = this.valueOf() - x;
return Number(num);
} var a = (5).plus(3).minus(6);
console.log(a);
alert(a);

人家直接返回一个num,我返回一个Number封装的num对象,其实都一样是Number对象。

题目六:实现如下语法的功能:var a = add(2)(3)(4); //9

这个题目算是第一个做出来的题目,因为我觉得这个题目的要求最简单,一看就记得,半夜睡醒了在床上直接脑袋打草稿运行了。

function add(x) {
var mid;
mid = x || 0;
function addObj(x) {
x = x || 0;
mid = mid + x;
return addObj;
}
addObj.valueOf = function() {
return mid;
}
addObj.toString = function() {
return mid;
}
return addObj;
}
//call the obj.valueOf function
console.log(add(2));
console.log(add(2)(3));
console.log(add(2)(3)(4));
console.log(add(2)(3)(4)(5)); //call the obj.toString function
alert(add(2));
alert(add(2)(3));
alert(add(2)(3)(4));
alert(add(2)(3)(4)(5));

能无限调用。

写完上述代码,我参考了下原文评论里面的,看了下自己的代码,和别人的比较下,有好的地方,也有不足之处,不过我的代码比较浅显,不想部分人写的那些看了很久才看明白,特别是那个写了缓存的fibonacci数列的答案。

汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案的更多相关文章

  1. 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解

    介绍 昨天发的<大叔手记(19):你真懂JavaScript吗?>里面的5个题目,有很多回答,发现强人还是很多的,很多人都全部答对了. 今天我们来对这5个题目详细分析一下,希望对大家有所帮 ...

  2. [转载]深入理解JavaScript系列 --汤姆大叔

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  3. 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目

    博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...

  4. 深入理解JavaScript系列(转自汤姆大叔)

    深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...

  5. 我读汤姆大叔的深入理解js(一)

    前言 闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读.记录下自己的学习历程和个人理解.更重要的是作为笔记 高质量JS代码 在看汤姆大叔的这一系列文 ...

  6. 我读汤姆大叔的深入理解js(二)

    继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带 ...

  7. 汤姆大叔的6道javascript编程题题解

    看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4 ...

  8. 看了汤姆大叔的“你真懂JavaScript吗?”的一些感慨

    看了汤姆大叔的“你真懂JavaScript吗?”,里面有5道题目,我都一一作了,然后在chrome的控制台里面运行了一遍,虽然只错了一道,但还是细细读了下答案,在此总结一下,看看是否对大家对这些Jav ...

  9. 汤姆大叔的6道js题目

    汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...

随机推荐

  1. 2014辽宁ACM省赛 Prime Factors

    问题 L: Prime Factors 时间限制: 1 Sec  内存限制: 128 MB [提交][状态][论坛] 题目描写叙述 I'll give you a number , please te ...

  2. ASP.NET文件上传和下载

    大学最近作出相关的需求进行上传和下载文件的网站(求为:站点发布的通知,在后台要能给每一个通知加入附件.在前台要能显示并下载附件),之前仅仅是学习过关于上传的 理论知识,这里实践了一下下,与大家分享一下 ...

  3. SQL 2008执行语句遇到内存不足(1)——error 701

    原文:SQL 2008执行语句遇到内存不足(1)--error 701 转自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/17/sql-2008-e ...

  4. Hsql中In没有1000的限制

    SELECT * FROM user , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...

  5. CocoaChina 第四个测试

    1. iOS同意近期本地通知数量最大为多少? A.64 B.32 C.128 D.16 2. int x = 1; int y = 2; int z = x^y*y; NSLog(@"%d& ...

  6. Java存储区域——JVM札记&lt;一个&gt;

    Java当虚拟机数据区域 执行数据区主要包括:方法区.堆.VM栈.本地方法栈.程序计数器. 当中方法区和栈是线程共享的区域,另外三块区域是每一个线程私有的区域.各个数据区的功能简单说明例如以下: 程序 ...

  7. printf交替使用

    今天附带printf一些替代实现. 转载请注明出处:http://blog.csdn.net/u010484477谢谢^_^ 我们总是用printf做各种输出语句: printf("%d&q ...

  8. 金蝶K3无法创建数据库,请查看该文件夹的错误的解决方法。

    无法创建数据库! 检查你的文件夹C:\XXX\DATA是否存在.并且该系统是不低,或SQL Server服务的启动用户不具备<K3ERP\DBFILE>文件夹的写权限.请改动Windows ...

  9. GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)[转]

    WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块)GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用BD-09:百度坐标偏移标准,Baidu Map ...

  10. C#后台利用正则表达式查找匹配字符

    /// <summary>        /// 发送短信 系统固化短信        /// </summary>        /// <param name=&qu ...