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

2024-05-09 12:18

本文主要是介绍汤姆大叔的6道javascript编程题题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

 
  1. var ans = Math.max(123456); 
  2. console.log(ans); // 6 

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

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

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

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

 
  1. var a = [123456]; 
  2. var len = a.length; 
  3. for(var i = 0; i < len; i++) { 
  4.   var num = a[i]; 
  5.   (function(num) { 
  6.     var f = function() { 
  7.       console.log(num); 
  8.     }; 
  9.     a[i] = f; 
  10.   })(num); 
  11.   
  12. for(var i = 0; i < len; i++) 
  13.   a[i](); 
  14. // 1 
  15. // 2 
  16. // 3 
  17. // 4 
  18. // 5 
  19. // 6 

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

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

 
  1. var a = { 
  2.   name: 'hanzichi'
  3.   age: 10
  4.   location: 'china' 
  5. }; 
  6.   
  7. var b = { 
  8.   name: 'curry' 
  9. }; 
  10.   
  11. var c = { 
  12.   name: 'kobe'
  13.   sex: 'male' 
  14. }; 
  15.   
  16. Object.prototype.getLength =  function() { 
  17.   var num = 0
  18.   for(var key in this) { 
  19.     if(this.hasOwnProperty(key)) 
  20.       num++; 
  21.   } 
  22.   return num; 
  23. }; 
  24.   
  25. var arr = [a, b, c]; 
  26. arr.sort(function(a, b) { 
  27.   return a.getLength() > b.getLength(); 
  28. }); 
  29. console.log(arr); 

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

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

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

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

 
  1. function fn(n) { 
  2.   var a = []; 
  3.   a[0] = 0, a[1] = 1
  4.   for(var i = 2; i < n; i++) 
  5.     a[i] = a[i - 1] + a[i - 2]; 
  6.   for(var i = 0; i < n; i++) 
  7.     console.log(a[i]); 
  8.   
  9. fn(5); // 10表示需要的斐波那契数列个数 
  10. // 0 
  11. // 1 
  12. // 1 
  13. // 2 
  14. // 3 

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

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

 
  1. Number.prototype.plus = function(a) { 
  2.   return this + a; 
  3. }; 
  4.   
  5. Number.prototype.minus = function(a) { 
  6.   return this - a; 
  7. }; 
  8.   
  9. var a = (5).plus(3).minus(6); 
  10. console.log(a); // 2 

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

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

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

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

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

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

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

这篇关于汤姆大叔的6道javascript编程题题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973390

相关文章

嵌入式C和汇编混合编程规则——ATPCS规则

ATPCS规则  为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。 一.ATPCS概述 ATPCS规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,对这些基本的调用规则进行一些修改得到几种不

Java的foreach语句

foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。 foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。 foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解fo

Linux网络编程之五

每日一结 组播: ​ 网络地址: 一些特殊的组播地址:   一 组播包收和发 1.发送方 (1)创建用户数据报套接字 (2)填充组播地址和端口  (3)发送数据到组播地址 2.接收方  (1)创建用户数据报套接字 (2)加入组播组  struct ip_mreq mreq; mreq.imr_m

Linux网络编程之四

每日一结 一 UDP并发  核心思想:父进程接收到客户端的数据,就创建子进程,在子进程中创建一个新的套接字  和客户端交互  int do_client(接受客户端地址,数据,数据长度) { 1.创建用户数据报套接字  2.自动分配地址  3.处理数据[例如:输出数据内容] 4.通过新创建的套接字将数据回发给客户端  w

Linux网络编程之三

每日一结 Tftp服务器的实现: server.c ​       client.c     代码分析如下:     一 Linux IO模型  (1)阻塞IO  (2)非阻塞IO  非阻塞IO

Linux网络编程之二

每日一结   一 TCP 函数接口  int listen(int sockfd, int backlog); 功能:设置流式套接字为监听模式  参数: @sockfd    流式套接字的fd  @backlog   请求队列的长度,最大128  返回值: 成功返回0,失败返回-1    int accept(i

Linux网络编程之一

每日一结 一 网络基础知识 (一)IP地址 1.IP   :网络中一台主机唯一标识  2.组成 :网络号 + 主机号  3.IP 分类 最高位    第一个字节 A  1 + 3     0        [0-127]     B  2 + 2    10        [128-191]

关于Java的数组的使用

关于一维数组的使用 代码示例一如下: package com;public class test_array {public static void main(String[] args){//1.如何定义 一个 数组//1.1数组的声明String[] names;int[] scores;//1.2数组的初始化://1.2.1静态初始化:初始化数组与数组元素赋值同时进行nam

关于Java的URL编程

前言: 1> URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。 浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。  2> URL的基本结构由5部分组成: <传输协议>://<主机名>:<端口号

Java的clone()方法使用详解

前言: 我们知道,在java的object类中,有这么一个方法clone(),这个方法有什么用呢?怎样才能正确地使用这个方法呢? 下面一一来进行阐述一下 clone()方法详解: 1>clone()方法的作用 顾名思义,clone()方法的作用就是克隆的意思,引入这个方法,这样就便于我们构建属于自己的一些本地对象副本。 这样我们就不用担心因为副本对象的引用而使原生的对象发生改变。