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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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数组进行排序(排序条件是每个元素对象的属性个数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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数(不使用全局变量)

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
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

1
2
3
4
5
6
7
8
9
10
11
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):

1
2
3
4
5
6
7
8
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道js题目的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. TOM大叔的几道Javascript题目与解答

    几道JS题目 之前没有深入研究js语言,最近几年前端越来越工程化,需要扎实的js基础,看到博客园上有很多大牛分享JS学习文章,幸运看到tom大叔的blog,抽时间潜心学习了其文章,遇到到其出的几道题目 ...

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

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

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

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

  9. 之前见汤姆大叔 写过一系列的 js 深入理解 呢 很是感觉经典

    最近要把这些给翻个遍 加油  js 隐式全局变量 读后感 1:js 没有变量名称是否重复定义的检查,在cshrp里有这样的检查, 没有变量名称重复的检查,这样 当变量名称 重复定义的时候 相同命名的变 ...

随机推荐

  1. advanced dom scripting dynamic web design techniques Chapter 2 CREATING YOUR OWN REUSABLE OBJECTS

    JavaScript is all about objects. Objects are the foundation of everything, so if you’re unfamiliar w ...

  2. seaJs学习笔记之javascript的依赖问题

    之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...

  3. struts2标签 遍历map集合

    首先我们来构造几个map集合.    假设如下代码 都是在ssh配置环境下搭建好,(至少struts2开发环境搭建好) (1).java 代码          下面的student对象包含的字段为 ...

  4. 通过DAC来连接SQL Server

    最早知道能够使用专用管理员连接.来连接到sql server.可是一直没有成功连接过.今天又看到这个,于是想再试试. 1.通过在ssms中的"连接到server对话框"中的serv ...

  5. Oracle DB 备份和恢复的概念

    • 确定Oracle DB 中可能发生的故障类型 • 说明优化实例恢复的方法 • 说明检查点.重做日志文件和归档日志文件的重要性 • 配置快速恢复区 • 配置ARCHIVELOG模式   部分工作内容 ...

  6. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  7. delegate和event

    经过查阅资料和自己的理解整理出来的,欢迎大家指教. delegate和event 何时使用: 异步的时候,比如加载完成通知. 需要回调的时候,比如按钮点击.动画播放结束等. 发送事件通知的时候. 比如 ...

  8. hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block

    错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYY ...

  9. apache kafka技术分享系列(目录索引)--转载

    原文地址:http://blog.csdn.net/lizhitao/article/details/39499283 kafka开发与管理: 1)apache kafka消息服务 2)kafak安装 ...

  10. 设计模式之Facade模式

    Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用.他是为子系统中的一组接口所提供的一个一致的界面. 在遇到以下情况使用Facad ...