三道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 ...
随机推荐
- PHP魔术方法小结.md
说明 魔术方法就是在特定场景下不需要调用而自动执行的方法.因为有魔术方法,所以我们的类可以写得很灵活~ __construct #构造方法,在类被实例化时自动调用,一般用于初始化操作; __destr ...
- Loongnix 系统(MIPS Linux)
电脑上的x86,手机上的ARM,在各自领域都是很成熟的CPU架构了,龙芯也参与进去竞争是很难的,就算是Intel,挤破头皮疯狂补贴自家的Atom x86还是在手机领域无法立足. 所以说,个人觉得龙芯可 ...
- Could not connect to SMTP host: smtp.***.com, port: 465, response: -1
背景 在使用javamail进行邮件发送的时候,报错: Could not connect to SMTP host: smtp.***.com, port: 465, response: -1 原因 ...
- 1、Web容器的理解&Tomcat的安装与配置
Web容器的理解 <Java Web开发实战经典——基础篇>一书中对Web容器这一概念阐述得很好,借用其观点对Web容器加以理解: 想要运行一个Java Web的程序,则必须有相应的Web ...
- class_create()
#define class_create(owner, name) \({ \ ...
- hibernate--lazy(懒加载)属性
关联映射文件中<class>标签中的lazy(懒加载)属性 Lazy(懒加载):只有在正真使用该对象时,才会创建这个对象 Hibernate中的lazy(懒加载):只有我们在正真使用时,它 ...
- 自定义View(5)Paint常用的一些绘制滤镜,特效等介绍
Shader 返回绘图过程中重复色块的基类 相关方法:Paint::setShader(Shader shader) BitmapShader 从位图加载重复色块 LinearGradient, Ra ...
- 将SQLServer2005中的数据同步到Oracle中
有时由于项目开发的需要,必须将SQLServer2005中的某些表同步到Oracle数据库中,由其他其他系统来读取这些数据.不同数据库类型之间的数据同步我们可以使用链接服务器和SQLAgent来实现. ...
- 使用Quartz创建定时任务
项目开发中经常需要定时循环执行某些任务 比如定时发送报表,定时发送邮件,亦或者定时清理缓存,定时更新数据等等 有些时候可以简单地利用Windows Server的计划任务执行程序 Linux也有相应的 ...
- bzoj3275: Number
最小割...然后推一下可知不能的情况必定为一奇一偶,于是s->奇->偶->t.跑最小割即可. #include<cstdio> #include<cstring&g ...