汤姆大叔 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 后六道题答案
原题目地址: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吗?》答案详解 后六道题答案的更多相关文章
- 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解
介绍 昨天发的<大叔手记(19):你真懂JavaScript吗?>里面的5个题目,有很多回答,发现强人还是很多的,很多人都全部答对了. 今天我们来对这5个题目详细分析一下,希望对大家有所帮 ...
- [转载]深入理解JavaScript系列 --汤姆大叔
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 汤姆大叔 javascript 系列 第20课 最后的5到javascript题目
博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html 原题: 大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4 ...
- 深入理解JavaScript系列(转自汤姆大叔)
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 我读汤姆大叔的深入理解js(一)
前言 闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读.记录下自己的学习历程和个人理解.更重要的是作为笔记 高质量JS代码 在看汤姆大叔的这一系列文 ...
- 我读汤姆大叔的深入理解js(二)
继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带 ...
- 汤姆大叔的6道javascript编程题题解
看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4 ...
- 看了汤姆大叔的“你真懂JavaScript吗?”的一些感慨
看了汤姆大叔的“你真懂JavaScript吗?”,里面有5道题目,我都一一作了,然后在chrome的控制台里面运行了一遍,虽然只错了一道,但还是细细读了下答案,在此总结一下,看看是否对大家对这些Jav ...
- 汤姆大叔的6道js题目
汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...
随机推荐
- redhat6.3已安装was6.1你可以不弹出安装程序
这在为期两天的课程redhat6.3安装was6.1 使用Xmanager打开图形界面.进入/WAS夹,跑./install 它有一个直接跳转,不管是什么反应,起初我以为这个问题的图形界面,搜索了半天 ...
- 佛祖保佑,从来没有Bug
<span style="font-size:14px;">// _ooOoo_ // o8888888o // 88" . "88 // (| - ...
- iOS中通讯录电话号码空格问题
今天在读取通讯录的时候,读取到的手机号码格式为* (***) ***-****的,乍看下,数字中间有空格."-".(.)的非数字字符. 然后我就打算替换这些非数字字符,结果替换完, ...
- [Erlang危机](4.5)第四章练习
原创文章.转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 联系邮箱:cto@188.com Exercises 练习 Review Qu ...
- css Tab选项卡1
利用 锚点原理 以及overflow:hiden 结合,实现纯 css tab 方式 兼容ie6 + 适合单个tab 不需要js 注意点 红色方框的 a 对应a ...
- 熟人UML
UML,全名Unified Modeling Language.模语言.它是软件和系统开发的标准建模语言.主要是以图形的方式对系统进行分析.设计. 同一时候,UML不是一个程序设计语言,也不是一个形式 ...
- 【cocos2d-js公文】十八、Cocos2d-JS v3.0物业风格API
1. 新的API风格 我们直接来看看你能够怎样使用Cocos2d-JS v3.0: 曾经的API 新的API node.setPosition(x, y); node.x = x; node.y = ...
- 使用方便git命令检查记录的版本号
现在开始git大多数用户都经历过subversion,对于这两种开关的版本控制系统需要一段时间去适应.本文旨在帮助恢复一些,这些用户都熟悉的日志记录买家的习惯. 我们要熟悉一个详细的例子git中log ...
- NSOJ Constructing Roads(图论)
There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...
- c#有关udp可靠传输(包传输数据包) 升级
在c#有关udp可靠传输(包传输数据包)我们讨论,UDP包的发送,可是上一个程序有一个问题.就是数据比較大.一个Message类序列化后都有2048B,而实际的数据量也就只是 50B罢了,这就说明当中 ...