要求
- 只能在指定的位置填写自己的代码,本文件里的其他代码不能修改
- 所有题目都不允许添加全局变量名
- 本文件应该能在firebug的console里正常执行,并输出结果
- 代码最优化,效率最高
- 代码注释明确
练习1
实现一个遍历数组或对象里所有成员的迭代器。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
var each = function(obj, fn){ //+++++++++++答题区域+++++++++++ //+++++++++++答题结束+++++++++++ }; try{ var data1 = [4,5,6,7,8,9,10,11,12]; var data2 = { "a": 4, "b": 5, "c": 6 }; console.group(data1); each(data1, function(o){ if( 6 == this ) return true; else if( 8 == this ) return false; console.log(o + ": \"" + this + "\""); }); console.groupEnd(); /*------[执行结果]------ 1: "4" 2: "5" 4: "7" ------------------*/ console.group(data2); each(data2, function(v, n){ if( 5 == this ) return true; console.log(n + ": \"" + v + "\""); }); console.groupEnd(); /*------[执行结果]------ a: "4" c: "6" ------------------*/ }catch(e){ console.error("执行出错,错误信息: " + e); } |
练习2
实现一个叫Man的类,包含attr, words, say三个方法。
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
var Man; //+++++++++++答题区域+++++++++++ //+++++++++++答题结束+++++++++++ try{ var me = Man({ fullname: "小红" }); var she = new Man({ fullname: "小红" }); console.group(); console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); console.groupEnd(); /*------[执行结果]------ 我的名字是:小红 我的性别是:<用户未输入> ------------------*/ me.attr("fullname", "小明"); me.attr("gender", "男"); me.fullname = "废柴"; me.gender = "人妖"; she.attr("gender", "女"); console.group(); console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender")); console.groupEnd(); /*------[执行结果]------ 我的名字是:小明 我的性别是:男 ------------------*/ console.group(); console.info("我的名字是:" + she.attr("fullname") + "\n我的性别是:" + she.attr("gender")); console.groupEnd(); /*------[执行结果]------ 我的名字是:小红 我的性别是:女 ------------------*/ me.attr({ "words-limit": 3, "words-emote": "微笑" }); me.words("我喜欢看视频。"); me.words("我们的办公室太漂亮了。"); me.words("视频里美女真多!"); me.words("我平时都看优酷!"); console.group(); console.log(me.say()); /*------[执行结果]------ 小明微笑:"我喜欢看视频。我们的办公室太漂亮了。视频里美女真多!" ------------------*/ me.attr({ "words-limit": 2, "words-emote": "喊" }); console.log(me.say()); console.groupEnd(); /*------[执行结果]------ 小明喊:"我喜欢看视频。我们的办公室太漂亮了。" ------------------*/ }catch(e){ console.error("执行出错,错误信息: " + e); } |
练习3
实现一个URI解析方法,把url里#之后的参数解析成指定的数据结构。
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 |
function urlParser(s){ //+++++++++++答题区域+++++++++++ //+++++++++++答题结束+++++++++++ } try{ var url1 = "http://www.abc.com/m/s/#page/2/?type=latest_videos&page_size=20"; var url2 = "http://www.abc.com/m/s/#type=latest_videos&page_size=20"; var url3 = "http://www.abc.com/m/s/#page?type=latest_videos&page_size=20"; console.group(); console.info( urlParser(url1) ); console.info( urlParser(url2) ); console.info( urlParser(url3) ); console.groupEnd(); /*------[执行结果]------ ["page", "2", { "type": "latest_videos", "page_size": 20 }] [{ "type": "latest_videos", "page_size": 20 }] ["page", { "type": "latest_videos", "page_size": 20 }] ------------------*/ }catch(e){ console.error("执行出错,错误信息: " + e); } |
第一题和第二题参考答案
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
/** * ================================================================== * 题1: 实现一个遍历数组或对象里所有成员的迭代器 * ================================================================== */ var toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty; var each = function(obj, fn){ //+++++++++++答题区域+++++++++++ var hasFn = toString.call(fn) === '[object Function]', type = toString.call(obj); if(typeof obj === undefined || !hasFn) return false; if(type === '[object Object]') { for(var key in obj) { if(hasOwn.call(obj, key)) { if(!fn.call(obj[key], obj[key], key)) break; } } } else if(type === '[object Array]') { for(var i = 0, len = obj.length; i<len; i++) { if(!fn.call(obj[i], i)) break; } } //+++++++++++答题结束+++++++++++ }; /** * ================================================================== * 题2: 实现一个叫Man的类,包含attr, words, say三个方法 * ================================================================== */ var Man; //+++++++++++答题区域+++++++++++ Man = function(o) { if(!(this instanceof Man)) { return new Man(o); } this.attrObj = o || {}; this.wordArr = []; }; Man.prototype.attr = function(name, value) { var defaultValue = '用户未输入', that = this; if(name === undefined) return false; if(toString.call(name) === '[object Object]') { each(name, function(i, j) { that.attr(j, i); return true; }) } else { defaultValue = this.attrObj[name] || defaultValue; value !== undefined && (defaultValue = this.attrObj[name] = value); } return defaultValue; }; Man.prototype.words = function(word) { word != undefined && this.wordArr.push(word); }; Man.prototype.say = function() { var str = '', limit = this.attr('words-limit'), len = this.wordArr.length; if(typeof limit !== 'number' || len <= limit) return false; for(var i = 0; i<limit; i++) { str += this.wordArr[i]; } return this.attr('fullname') + this.attr('words-emote') + ':' + str; }; //+++++++++++答题结束+++++++++++ |
此文章发表于2011-9-16,由轩枫阁转载自w3cfuns
暂无评论