看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试。

1、找出数字数组中最大的元素(使用Math.max函数)

var a = [1, 2, 3, 6, 5, 4];
var ans = Math.max.apply(null, a);
console.log(ans);  // 6

  这题很巧妙地用了apply,如果不是数组,是很多数字求最大值,我们知道可以这样:

var ans = Math.max(1, 2, 3, 4, 5, 6);
console.log(ans); // 6

  而apply的第二个参数正是一个数组,都不用进行转换了。

  还有一种用eval+toString的实现:

var a = [1, 2, 3, 6, 5, 4];
var ans = eval( 'Math.max(' + a.toString() + ')');
console.log(ans); // 6

2、转化一个数字数组为function数组(每个function都弹出相应的数字)

var a = [1, 2, 3, 4, 5, 6];
var len = a.length;
for(var i = 0; i < len; i++) {
  var num = a[i];
  (function(num) {
    var f = function() {
      console.log(num);
    };
    a[i] = f;
  })(num);
}

for(var i = 0; i < len; i++)
  a[i]();
// 1
// 2
// 3
// 4
// 5
// 6

  我觉得这跟给n个a标签,弹出相应标签对应的编号是一个类型的题,用闭包保存变量到内存即可。

3、给object数组进行排序(排序条件是每个元素对象的属性个数)

var a = {
  name: 'hanzichi',
  age: 10,
  location: 'china'
};

var b = {
  name: 'curry'
};

var c = {
  name: 'kobe',
  sex: 'male'
};

Object.prototype.getLength =  function() {
  var num = 0;
  for(var key in this) {
    if(this.hasOwnProperty(key))
      num++;
  }
  return num;
};

var arr = [a, b, c];
arr.sort(function(a, b) {
  return a.getLength() > b.getLength();
});
console.log(arr);

  这题不难,数组排序,当然是sort,排序条件是对象的属性个数,可以写个函数计算,注意可能要用hasOwnProperty判断下。

4、利用JavaScript打印出Fibonacci数(不使用全局变量)

(function(a, b) {
  var c = a + b;
  console.log(c);
  if(c > 100) return;
  arguments.callee(b, c);
})(-1, 1);

  这题没看明白,是打出斐波那契数列的前n项么?还是第n项...

function fn(n) {
  var a = [];
  a[0] = 0, a[1] = 1;
  for(var i = 2; i < n; i++)
    a[i] = a[i - 1] + a[i - 2];
  for(var i = 0; i < n; i++)
    console.log(a[i]);
}

fn(5); // 10表示需要的斐波那契数列个数
// 0
// 1
// 1
// 2
// 3

  不使用全局变量,我把它们写在函数里了应该算是局部变量了吧,难道这样就好了?你怎么看?

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

Number.prototype.plus = function(a) {
  return this + a;
};

Number.prototype.minus = function(a) {
  return this - a;
};

var a = (5).plus(3).minus(6);
console.log(a); // 2

  直接在Number对象上加扩展方法即可,传说中这样很不好,but我也想不到更好的办法了...

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

function add(a) {
  var temp = function(b) {
    return add(a + b);
  }
  temp.valueOf = temp.toString = function() {
    return a;
  };
  return temp;
}
var ans = add(2)(3)(4);
console.log(ans); // 9

  对valueOf和toString的考察,具体可以参考《valueOf和toString》

  另看到一种很飘逸的写法(来自Gaubee):

function add(num){
  num += ~~add;
  add.num = num;
  return add;
}
add.valueOf = add.toString = function(){return add.num};
var ans = add(3)(4)(5)(6);  // 18
alert(ans);

  

  大家有什么意见建议的欢迎交流指导~

  

汤姆大叔的6道javascript编程题题解的更多相关文章

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

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

  2. 读汤姆大叔《深入理解javascript系列》笔记一编写高质量代码

    感觉大叔的博文真的是很不错 我打算严格要求自己 按照大叔说的,这样我就会更有规范,更有思想的去工作 去写代码(一入代码深似海)   1,尽可能的少用全局变量(污染全局空间,也会和别人的代码 发生冲突造 ...

  3. 学习汤姆大叔《深入理解JavaScript系列》有感(1) —— 立即调用的函数表达式

    一. 下面代码用于理解函数的声明和调用. function makeCounter() { // 只能在makeCounter内部访问i var i = 0; return function () { ...

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

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

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

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

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

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

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

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

  8. 你必须知道ASP.NET知识------关于动态注册httpmodule(对不起汤姆大叔)

    一.关于动态注册的问题 很多人看过汤姆大叔的MVC之前的那点事儿系列(6):动态注册HttpModule ,其实汤姆大叔没有发现httpmodule动态注册的根本机制在哪里. 亦即:怎么动态注册?为什 ...

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

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

随机推荐

  1. sqlplus: error while loading shared libraries: /u01/app/lib/libclntsh.so.11.1

    成功安装了Oracle 11g后,使用sqlplus登录数据库时遇到下面错误: [oracle@DB-Server ~]$ sqlplus / as sysdba   sqlplus: error w ...

  2. C#解决验证码问题

    string ss = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";            R ...

  3. win7下硬盘安装ubuntu

    首先还是分区,在计算机上右键--管理--磁盘管理.装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,这里请注意,Ubuntu和Windows文件系统完全不同,所以我们划好要给Ubuntu的分区 ...

  4. python爬取并下载麦子学院所有视频教程

    一.主要思路 scrapy爬取是有课程地址及名称 使用multiprocessing进行下载 就是为了爬点视频,所以是简单的代码堆砌 想而未实行,进行共享的方式 二.文件说明 itemsscray字段 ...

  5. SQL Server 中获取字符串拼音的标量函数实现

        工作中时常遇到字符串转换为拼音的需求.特别目前在各大网站平台都可以看到的基于拼音的查询功能.如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德 ...

  6. [原]openstack-kilo--issue(六):Authorization Failed: The resource could not be found. (HTTP 404)

    =======1.问题点:====== 在安装调试openstack-kilo版本的时候,使用keystone endpoint-list的时候出现了问题. 如下: [root@controller ...

  7. db2存储过程

    一. 使用存储过程的好处 1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间 应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起, 从而使得对于每一组S ...

  8. db2服务端安装图解

    一. 准备工作 1. db2服务端安装包,版本:10.1.2 二. 安装图解过程 1. 响应文件是一个包含安装和配置信息的纯英文文本文件.可无需任何用户交互进行db2的批量安装.非必须的. 2. 点击 ...

  9. Linux正则表达式grep

    正则表达式是一种符号表示法,用于识别文本模式.Linux处理正则表达式的主要程序是grep.grep搜索与正则表达式匹配的行,并将结果输送至标准输出. 1. grep匹配模式 grep按下述方式接受选 ...

  10. Apache

    一.简介 Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的A ...