三道JS试题(遍历、创建对象、URL解析)
最近在网上看到了三道不错的JS试题,还是很基础(一直认为学好前端基本功很重要。。。),现在记录如下:
原帖地址:http://www.w3cfuns.com/forum.php?mod=viewthread&tid=2264&extra=page%3D1%26filter%3Dtypeid%26typeid%3D177%26typeid%3D177
前两道有人答的不错,这里借用下,最后一道题自己码的,没有用正则
//Q1:实现一个遍历数组或对象里所有成员的迭代器。
var each = function(obj, fn){
//+++++++++++答题区域+++++++++++
if(obj instanceof Array){
for(var i=0,j=obj.length;i<j;i++){
var temp=fn.call(obj[i],i+1);
if(temp===false){
break;
};
}
}else{
if(! obj instanceof Object) return false;
for( e in obj){
fn.call(obj[e],obj[e],e);
}
}
//+++++++++++答题结束+++++++++++
};
try{
var data1 = [4,5,6,7,8,9,10,11,12];
var data2 = {
"a": 4,
"b": 5,
"c": 6
};
each(data1, function(o){
if( 6 == this )
return true;
else if( 8 == this )
return false;
console.log(o + ": \"" + this + "\"");
});
/*------[执行结果]------
1: "4"
2: "5"
4: "7"
------------------*/
each(data2, function(v, n){
if( 5 == this )
return true;
console.log(n + ": \"" + v + "\"");
});
/*------[执行结果]------
a: "4"
c: "6"
------------------*/
}catch(e){
console.error("执行出错,错误信息: " + e);
}
//Q2:实现一个叫Man的类,包含attr, words, say三个方法。
var Man;
//+++++++++++答题区域+++++++++++
Man = function (info) {
if (!(this instanceof Man)) {
// Man方法作为普通函数被调用
return new Man(info);
}
else {
// Man方法作为构造函数被调用
this.attr(info);
}
} Man.prototype = {
attr : function(a, v) {
// 如果是一个键值集合, 则遍历该集合, 逐个调用attr().
if (typeof a === 'object')
for (var i in a)
this.attr(i, a[i]);
else {
// 通过attr获取或设置的变量都为私有变量, 私有变量的变量名具有'_'前缀.
a = '_' + a; // 设置参数的值
if (arguments.length === 2)
this[a] = v; // 访问参数的值
var r = this[a];
if (r === undefined || r === null)
r = '<用户未输入>'; return r;
}
},
words : function(word) {
// 获取对象中的短语集合, 如果不存在了, 就创建一个.
var w = this._wordArray;
if (!w) {
this._wordArray = w = [];
} if (word) {
w.push(word);
}
},
say : function() {
var name = this['_fullname'];
var words = this['_wordArray'];
var limit = this['_words-limit'];
var emote = this['_words-emote'] || '说'; var r = name + emote + ': "';
for (var i = 0; i < words.length && (typeof limit === 'number' ? i < limit : true); i++) {
r += words[i];
}
r += '"'; return r;
} } //+++++++++++答题结束+++++++++++ try{ var me = Man({ fullname: "小红" });
var she = new Man({ fullname: "小红" }); console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender"));
/*------[执行结果]------ 我的名字是:小红
我的性别是:<用户未输入> ------------------*/ me.attr("fullname", "小明");
me.attr("gender", "男");
me.fullname = "废柴";
me.gender = "人妖";
she.attr("gender", "女"); console.info("我的名字是:" + me.attr("fullname") + "\n我的性别是:" + me.attr("gender"));
/*------[执行结果]------ 我的名字是:小明
我的性别是:男 ------------------*/ console.info("我的名字是:" + she.attr("fullname") + "\n我的性别是:" + she.attr("gender"));
/*------[执行结果]------ 我的名字是:小红
我的性别是:女 ------------------*/ me.attr({
"words-limit": 3,
"words-emote": "微笑"
});
me.words("我喜欢看视频。");
me.words("我们的办公室太漂亮了。");
me.words("视频里美女真多!");
me.words("我平时都看优酷!"); console.log(me.say());
/*------[执行结果]------ 小明微笑:"我喜欢看视频。我们的办公室太漂亮了。视频里美女真多!" ------------------*/ me.attr({
"words-limit": 2,
"words-emote": "喊"
}); console.log(me.say());
/*------[执行结果]------ 小明喊:"我喜欢看视频。我们的办公室太漂亮了。" ------------------*/ }catch(e){
console.error("执行出错,错误信息: " + e);
}
//Q3:实现一个URI解析方法,把url里#之后的参数解析成指定的数据结构。
function urlParser(s){
//+++++++++++答题区域+++++++++++
var formatUrl = [];
var obj = {};
if(typeof s == "string" || Object.prototype.toString.call(s).slice(8,-1).toLowerCase() == "string"){
//判断是否含有“#”
if(s.split("#")[1] != null) {
var argArr = s.split("#")[1].split("?");
var hasFlag = (argArr[argArr.length-1].indexOf("&") == -1);
//含有?时
if(argArr.length > 1 || hasFlag){
var temp1 = argArr[0].split("/");
for(var i in temp1) (temp1[i] == '') || formatUrl.push(temp1[i]);
} if(!hasFlag){
var temp2 = argArr[argArr.length-1].split("&");
for(var i in temp2){
obj[temp2[i].slice(0,temp2[i].indexOf("="))] = temp2[i].slice(temp2[i].indexOf("=")+1);
}
formatUrl.push(JSON.stringify(obj));
}
}
} return formatUrl;
//+++++++++++答题结束+++++++++++
} 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";
var url4 = "http://www.abc.com/m/s/#page/2"; console.log( urlParser(url1) );
console.log( urlParser(url2) );
console.log( urlParser(url3) );
console.log( urlParser(url4) );
/*------[执行结果]------ ["page", "2", { "type": "latest_videos", "page_size": 20 }]
[{ "type": "latest_videos", "page_size": 20 }]
["page", { "type": "latest_videos", "page_size": 20 }]
["page", "2"]
------------------*/ }catch(e){
console.error("执行出错,错误信息: " + e);
}
三道JS试题(遍历、创建对象、URL解析)的更多相关文章
- node.js基础 1之 URL网址解析的好帮手
URL和URI的区别: URL是统一资源定位符 URI是统一资源标识符 URL是URI的子集(URL一定是URI,但URI不一定是URL) node中的URL中的url.parse protocol: ...
- 经典面试题:从 URL 输入到页面展现到底发生什么?
前言 打开浏览器从输入网址到网页呈现在大家面前,背后到底发生了什么?经历怎么样的一个过程?先给大家来张总体流程图,具体步骤请看下文分解! 本文首发地址为GitHub 博客,写文章不易,请多多支持与关注 ...
- Node.js:path、url、querystring模块
Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...
- JS中将JSON的字符串解析成JSON数据格式《转》
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...
- [JavaScript] JS中对Base64的解析
JS中对Base64的解析 <script type="text/javascript"> /** * UTF16和UTF8转换对照表 * U+00000000 – U ...
- ThinkPHP中URL解析原理,以及URL路由使用教程!
几个概念: THINKPHP 是一个MVC框架,使用PATHINFO解析出分组名,模块名,方法名,以及参数. PATHINFO:就是 http://localhost/index.php/Home/I ...
- 11、js 数组详细操作方法及解析合集
js 数组详细操作方法及解析合集 前言 在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总结,很多时候就算用过几次这个api,在开发中也很容易 ...
- js递归遍历多维数组并在修改数组的key后返回新的多维数组
我司最近正在用VUE做一个基于用户权限显示不同左侧菜单的后台管理系统,接口会根据用户的权限不同返回不同的菜单名称.URL等,前端要将这些菜单名称及URL动态添加到系统的左侧,这里就用到了vue-rou ...
- js对象遍历输出顺序错乱的问题
一.js对象遍历顺序错乱的原因 下边就来实践一下: var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',hobby:'dsf ...
随机推荐
- Photoshop:热气球的制作方法
大致流程: 1.做等宽色块,加内发光 2.变形->膨化,弯曲20% 3.加高光和投影层,增加立体感 4.制作多列,合并后,滤镜->扭曲->球面化100%2次(注意放在在正方形画布中间 ...
- arcgis api for javascript 出现 undefinedModule错误
一般都是script代码里面语法错误,如. .;:之类的
- 一个不错的log4j.properties例子
# Set root logger level to WARN and append to stdout #在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error log4j.ro ...
- linux下centos安装android sdk最新全面教程【可行】
1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新ja ...
- Java API —— 反射
1.类加载器 1)类的加载 · 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. · 加载 :就是 ...
- Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported
打开navigator,修改下面的classpath文件: 将<classpathentry kind="con" path="org.maven.ide.ecli ...
- Java连接MySQL数据库及简单操作代码
1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...
- java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat
Bug: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Dra ...
- poj 2948 Martian Mining (dp)
题目链接 完全自己想的,做了3个小时,刚开始一点思路没有,硬想了这么长时间,想了一个思路, 又修改了一下,提交本来没抱多大希望 居然1A了,感觉好激动..很高兴dp又有所长进. 题意: 一个row*c ...
- 函数flst_remove
移除 node, node->prev直接指向node->next /*********************************************************** ...