三道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 ...
随机推荐
- 【mysql的设计与优化专题(6)】mysql索引攻略
所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如二叉树的算法和哈希算法,哈希算法是通过建立特征值,然后根据特征值来快速查找,而用的最多,并且是mysql默认的就是二叉树算法 BTREE, ...
- java如何得到GET和POST请求URL和参数列表
转载:http://blog.csdn.net/yaerfeng/article/details/18942739 在servlet中GET请求可以通过HttpServletRequest的getRe ...
- Simple Factory 简单工厂模式(静态工厂)
基本概念: 1) Simple Factory模式属于创建型模式, 2) 简单工厂模式是由一个工厂(注意是一个!)对象决定创建出哪一种产品类的实例(例如你到肯德基说你要鸡腿,要薯条,要饮料还是,,,这 ...
- java对称加密(AES)
java对称加密(AES) 博客分类: Java javaAES对称加密 /** * AESHelper.java * cn.com.songjy.test * * Function: TODO * ...
- 通过数据库表自动生成POJO(JavaBean)对象
主类: package bqw.tool; import java.util.ResourceBundle;import java.sql.DriverManager;import java.sql. ...
- px,dp,sp单位转换工具类
在layout中使用dp 在代码中getWidth系列得到的是px 设置字体大小时使用的是sp /** * Android大小单位转换工具类 */ public class PxDpSpUtil { ...
- HTML 中的meta标签中的http-equiv与name属性使用介绍
meta是html语言head区的一个辅助性标签.也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,meta标签的作用有:搜索引擎优化(SEO),定义页面使用语言, ...
- Android开发之执行定时任务AlarmManager,Timer,Thread
1.Thread:使用线程方式2.Timer是java的特性3.AlarmManager:AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过Alarm ...
- uva 1642 Magical GCD
很经典的题目,愣是没做出来.. 题意:给出一个序列,求一子序列,满足其GCD(子序列)* length(子序列)最大. 题解: 类似单调队列的思想,每次将前面所得的最大公约数与当前数进行GCD,若GC ...
- parseInt和valueOf
.parseInt和valueOf.split static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析. static Integer valueOf( ...