三道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 ...
随机推荐
- C语言中volatile关键字的作用
http://blog.csdn.net/tigerjibo/article/details/7427366#comments 一.前言 1.编译器优化介绍: 由 于内存访问速度远不及CPU处理速度, ...
- 计算XX年的某月某日是当年的第多少天?是星期几?
/** * 编写程序,计算2013年的某月某日是当年的第多少天?是星期几?已知2013年元旦是星期二. */ import java.util.Scanner; public class Date { ...
- 【原创】Leetcode -- Reverse Linked List II -- 代码随笔(备忘)
题目:Reverse Linked List II 题意:Reverse a linked list from position m to n. Do it in-place and in one-p ...
- Android中LayoutParams
LayoutParams are used by views to tell their parents how they want to be laid out. See ViewGroup Lay ...
- BZOJ 2339 卡农(组合数学)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2339 题意: 思路: i64 Pow(i64 a,i64 b,i64 mod){ ...
- C++STL 之排列
固然我们可以自己使用递归编写全排列程序,但是既然STL里面已将有了这个功能为什么不直接用呢,下面就写一下直接使用C++ STL生成全排序的程序 函数名:next_permutation 包含头文件:a ...
- 面试题_31_to_47_JVM 底层与GC(Garbage Collection)的面试问题
31)64 位 JVM 中,int 的长度是多数?Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位.意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类 ...
- GIT使用教程与基本原理
转自:http://blog.csdn.net/wengpingbo/article/details/8985132 说明:该教程全部图片都来自于<pro git>.以下所有的操作,除非特 ...
- 使用stringstream时的清空操作
在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要先继续清空,而清空很容易想到是clear方法,而在stringstr ...
- bzoj2794
这题我得到一个经验,bool型的dp一定要想办法把bool去掉来表示更多的东西(1933也是这个道理) 暴力大家都会,这里有两个限制条件 一个限制条件我们可以排序不断加入,另一个呢 我们可以用f[i] ...