汤姆大叔 javascript 系列 第20课 最后的5到javascript题目
博客链接:http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html
原题:
大叔注:这些题目也是来自出这5个题目的人,当然如果你能答对4个及以上并且想拿高工资的话,请联系我。
- 找出数字数组中最大的元素(使用Match.max函数)
- 转化一个数字数组为function数组(每个function都弹出相应的数字)
- 给object数组进行排序(排序条件是每个元素对象的属性个数)
- 利用JavaScript打印出Fibonacci数(不使用全局变量)
- 实现如下语法的功能:var a = (5).plus(3).minus(6); //2
- 实现如下语法的功能:var a = add(2)(3)(4); //9
以前一直是写.net后台,对js的操作,只是出于dom和ajax之间,对jquery的也只是存在能使用(还不算熟练)
后来在网上找到了tom大叔的javascript系列,发现写的真好.真的是我这种dom能操作,ajax能写,jquery会用.但是希望更深入下去的采纳哦.
于是就花了一些时间来学习博客里的内容.[本文最后回附上javascript系列文章的目录列表]
现在开始答题,用我自己的思路,(因为我本身算不上一个前端,只是偶尔前端忙的时候,我就写一下dom操作,和ajax.jquery里的ajax函数都没记清,还要去查API)
所以出现纰漏和错误的地方还希望大家指出,学习.
第一题:
找出数字数组中最大的元素(使用Match.max函数).
答题思路:首先,我之前没有用过这个函数,js自带的参数提示也是一坨shit,况且弱类型语言,啥玩意都能往里面传,能不能执行就另说.
于是我就百度了一下Match.max函数,发现里面的参数是以Math.max(1,2,3,4,5,6,7) 这种模式.
去掉数组左右小括号里面的"内容"的格式就刚好满足max参数的要求.
于是:
- <script type="text/javascript">
- var int_array = [1,2,3,4,5,6];
- var str_array ="";
- for(var i = 0; i < int_array.length; i++){
- str_array += int_array[i] + ",";
- }
- str_array = str_array.subString(0,str_array.length-1);//这里没有找到一个string内置的去掉特定尾字符的函数(trim(),trimRight)//可能是我参数没调对
- eval("Math.max("+str_array+")");
- </script>
第一条还算顺利,不算太难.
第二题:转化一个数字数组为function数组(每个function都弹出相应的数字)
答题思路:将一个数字转化成function数组,并且每个函数输出对应的数字.
关键在于"弹出相对应的数字."
明显就是一个闭包的操作.(为什么说"明显",因为我花了2天时间去理解和学习闭包)....
- <script type="text/javascript">
- var int_array = [1,2,3,4,5,6,7];
- var fn_array = [];
- for(var i = 0; i < int_array.length;i++){
- var f = (function(lockitem){
- return function(){
- console.log("当前是函数fn_"+ lockitem +" ---- 对应的数字是:" + lockitem);
- }
- })(int_array[i]);
- fn_array.push(f);
- }
- for(var j = 0 ; j < fn_array.length;j++){
- console.log(fn_array[j]());
- }
- </script>
第三题:给object数组进行排序(排序条件是每个元素对象的属性个数)
答题思路:首先给一个对象的数组 比如(var obj_array = [{},{},{}]);
然后写一个函数,计算每个对象的属性个数(不包括原型属性),并返回新的对象,这个新的对象有2个属性 var newObj = {obj:obj,count:count};//Obj就是之前计算属性个数的那个对象本身,count是数量
然后在根据count属性排序,并把这个对象的obj属性返回出来.
- var obj_array = [
- {
- name:"张三"
- },
- {
- name:"张三",
- age:25
- },
- {
- name:"张三",
- age:25,
- address:"湖北武汉"
- }
- ];
- function propertyCount(obj){
- if(typeof obj !== "object"){
- throw new Error("参数类型错误!");
- }
- var count = 0;
- for(var prop in obj){
- if(obj.hasOwnProperty(prop)){
- count++;
- }
- }
- var obj_instance = {
- target:obj,
- count:count
- }
- return obj_instance;
- }
- //删除数组的指定索引元素
- function removeAtIndex(array,index){
- array.splice(index,1);
- }
- var obj_whit_propertyCount = [];
- var sort_object = [];
- var i_array = [];
- for (var x = 0;x < obj_array.length;x++) {
- obj_whit_propertyCount.push(propertyCount(obj_array[x]));
- i_array.push(propertyCount(obj_array[x]).count);
- i_array.sort();
- }
- for (var s = i_array.length - 1; s >=0;s-- ) {
- sort_object.push(returnObj(s+1));
- }
- console.log(obj_whit_propertyCount);
- console.log(sort_object);
- function returnObj(count){
- for (var q = 0;q < obj_whit_propertyCount.length;q++) {
- if(obj_whit_propertyCount[q].count == count){
- return obj_whit_propertyCount[q].target;
- }
- }
- }
第三体肯定不是好的思路,不过跌跌撞撞也算是做出来了.
第四题: 利用JavaScript打印出Fibonacci数(不使用全局变量)
我只做出了递归计算,对于打印出1,1,2,3,5,8....这样的数字还没思路,如果读者,请留言告诉我.
- function Fibonacii(num){
- if(num == 1 || num == 2){
- return 1;
- }
- return Fibonacii(num-1) + Fibonacii(num-2);
- }
- console.log(Fibonacii(5)); //第五个数
第五题:实现如下语法的功能:var a = (5).plus(3).minus(6); //2
答题思路:我一开始看到第一个(5),说是实话,真的懵了...怎么会有这么奇特的语法?只有函数调用的时候在会有f()啊!!
后来一想:(1+2)*4 ,(9/3)-1..()就很普通了,不就是一个expression么.
然后在控制台里输出:console.log((5));//返现结果和我预期一样.
于是,就开始琢磨add和minus两个函数.
既然(5)返回就是一个number类型,那我直接就在Number的prototype属性扩展这两个方法好了.(不是老有人老生常谈不要去修改系统的原型对象)
- Number.prototype.add = function(num1){
- return this + a;
- }
- Number.prototype.minus = function(num1){
- return this - a;
- }
- console.log((5).add(3).minus(6));
其实解答这题的时候,还有另外一个思路
因为Number.prototype._ptoto_ : Object.prototype的,那我在Object.prototype元素上扩展add和minus不一样也可以吗?
这是我写的代码
- Object.prototype.add = function(num1){ //
- // if(typeof this != "number"){
- // throw new Error("必须是数字类型");
- // }
- // if(parseInt(this) == NaN){
- // throw new Error("必须是数字");
- // }
- return parseInt(this) + num1;
- }
- Object.prototype.minus = function(num1){
- // if(typeof this != "number"){
- // throw new Error("必须是数字!");
- // }
- // if(parseInt(this) == NaN){
- // throw new Error("必须是数字");
- // }
- return parseInt(this) - num1;
- }
- var result = (5).add(100).minus(5);
- console.log(result);
大家注意注释的地方.
第六题:实现如下语法的功能:var a = add(2)(3)(4);
答题思路,返回每次调用完毕之后,返回此函数本身.但做到的要求估计不是题目要求的那样.
因为题目的要求可能是add(2)(3)(4) 只返回一个结果.我是add(2)一次 add(2)(3)一次 add(2)(3)(4)一次.
- var sum_array = [];
- var sum = 0;
- var add = function(a){
- sum_array.push(a);
- if(sum_array.length==1){
- console.log(a);
- return this.add;
- }else if(sum_array.length > 1){
- for (var y = 0;y < sum_array.length;y++) {
- sum+=sum_array[y];
- }
- }
- console.log(sum);
- return this.add;
- }
- add(1)(2)(3);
到这里,6道题算是马马虎虎的做出来了,肯定有错误的位置.但我会慢慢学习和思考,尽快的把javascript基础知识巩固起来.
ps:公司一同事,看我写这些代码,说你这是要转前台的节奏阿,闭包都懂..
然后我模拟了一个场景:
面试官:闭包,函数作用于,执行上下文你都懂,不错,明天来上班吧. 对了,你随便写一个模态弹出层吧.
我:...不会.....
汤姆大叔博客地址:http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
汤姆大叔 javascript 系列 第20课 最后的5到javascript题目的更多相关文章
- [转载]深入理解JavaScript系列 --汤姆大叔
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 深入理解JavaScript系列(转自汤姆大叔)
深入理解JavaScript系列文章,包括了原创,翻译,转载,整理等各类型文章,如果对你有用,请推荐支持一把,给大叔写作的动力. 深入理解JavaScript系列(1):编写高质量JavaScript ...
- 汤姆大叔的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 ...
- 你必须知道ASP.NET知识------关于动态注册httpmodule(对不起汤姆大叔)
一.关于动态注册的问题 很多人看过汤姆大叔的MVC之前的那点事儿系列(6):动态注册HttpModule ,其实汤姆大叔没有发现httpmodule动态注册的根本机制在哪里. 亦即:怎么动态注册?为什 ...
- 我读汤姆大叔的深入理解js(一)
前言 闲来看看javascript,在圆子里发现了汤姆大叔的文章,先是整体瞄了几眼,感觉不错,然后细细研读.记录下自己的学习历程和个人理解.更重要的是作为笔记 高质量JS代码 在看汤姆大叔的这一系列文 ...
- 我读汤姆大叔的深入理解js(二)
继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带 ...
- 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点
深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...
随机推荐
- 极路由2(极贰)ROOT并刷了OpenWrt
绕过官方的ROOT 查了一下root教程, 如果还需要保留保修, 则需要自己想办法回退版本, 下载搜狐插件到sd卡, 找个linux系统修改sd卡上程序的执行权限, 然后才能开启ssh, 具体的方法可 ...
- C语言学习 第十次作业总结
同学们终于学到最有意思的东西:指针了.有人说指针是C语言的灵魂.虽然有点夸大,但是事实的确是如此.很多的时候,使用指针,会让过程变得简洁和精巧.这个在以后同学们深入学习使用C语言进行编程的时候就可以理 ...
- FilenameFilter过滤文件名
前言: 文件IO是程序设计语言的一个特点,本文将针对Java的File文件名过滤进行测试. 测试目录截图: 测试结果: data.txt output-.txt output-.txt output- ...
- [转]别再抱怨了,国内这么多优秀的Android资源你都知道吗?
因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...
- oracle 修改字符集支持中文
1.登录sys关闭服务 [oracle@t-e ~]$ export ORACLE_SID=kamiltest1 [oracle@t-e ~]$ sqlplus / as sysdba SQL> ...
- C#面向对象设计模式纵横谈——3.Abstract Factory 抽象工厂(创建型模式)
动机(Motivation) 在软件系统中经常面临着“一系列相互依赖的对象”的创建工作,同时,由于需求变化,往往存在更多系列对象的创建工作.如何应对这种变化?如何绕过常规对象的创建,提供一种“封装机制 ...
- 换肤系统(oocss方式)
近期想做一个换肤系统,参考过Bootstrap系统,思前想后,内容不难,但就是理不清楚,主要是换肤系统的css如何设计,怎样设计可重用性最好,后期更方便修改和维护,还有一个最头疼的就是怎么给css进行 ...
- oracle一次给多表添加相同字段
遇到一个需求:在已经建好的数据库中,为每一个数据表都添加相同的3个字段. 分析:数据库中的数据表较多,一一手动修改耗时低效,是否可以用程序遍历每一张表,然后为遍历到的当前表添加字段? 查询当前用户的所 ...
- ebay api接口开发基本步骤
因公司项目需求,要进行ebay api开发,网上很多资料已过时,自己记录一下. 准备工作 一.注册账号 1开发者账号注册 https://developer.ebay.com/signin?retur ...
- python3 安装scrapy
twisted(网络异步框架) wget https://pypi.python.org/packages/dc/c0/a0114a6d7fa211c0904b0de931e8cafb5210ad82 ...