牛课--前端题

一、 封装函数 f,使 f 的 this 指向指定的对象

function bindThis(f, oTarget) {
    return f.bind(oTarget)
}

二、 获取 url 参数
1. 指定参数名称,返回该参数的值 或者 空字符串
2. 不指定参数名称,返回全部的参数对象 或者 {}
3. 如果存在多个同名参数,则返回数组
输入: http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe
输出: [1,2,3]

	function getUrlParam (url, key) {
		url = url.split('#')[0]; // 去除#后面的内容
		var args = url.split('?');
		if (args[0] === url) {
			return url;
		}
		var obj = {};
		var arg = args[1].split('&');
		for (var i in  arg) {
			var a = arg[i].split('=');
			if (obj[a[0]]) { //重复键的值用数组存放
				obj[a[0]] = [].concat(obj[a[0]], a[1]);
			} else {
				obj[a[0]] = a[1];
			}
		}
		if (key || key === '') { //有参数
			return obj[key] || '';
		} 
		if (key === undefined) { //无参数
			return obj;
		}
	}

三、 查找两个节点的最近的一个共同父节点,可以包括节点自身

function commonParentNode(oNode1, oNode2) {
    for (; oNode1; oNode1=oNode1.parentNode) {
		if (oNode1.contains(oNode2)) {
			return oNode1;
		}
	}
}

四、根据包名,在指定空间中创建对象
1. 输入:namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
2. 输出:{a: {test: 1, b: {c: {d: {}}}}}

function namespace (oNamespace, sPackage) {
	var a = sPackage.split('.');
	var o = oNamespace;
	a.forEach(function (v) {
		if (typeof o[v] === 'undefined') {
			o[v] = {}
		}
		o = o[v];
	})
	return o;
}

五、 为 Array 对象添加一个去除重复项的方法
1. 输入:[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
2. 输出:[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']

Array.prototype.uniq = function () {
    var a = [];
    var flag = true;
    this.forEach(function (v) {
    	if (a.indexOf(v) === -1) {
    		if (v !== v) {
    			if (flag) {
    				a.push(v);
    				flag = false;
    			}
    		} else {
    			a.push(v);
    		}
    	}
    })
    return a;
}

六、 用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等

function fibonacci(n) {
   if (n == 1 || n == 2) {
       return 1;
   }
   return fibonacci(n-2) + fibonacci(n-1);
}

七、按所给的时间格式输出指定的时间
格式说明
对于 2014.09.05 13:14:20
yyyy: 年份,2014
yy: 年份,14
MM: 月份,补满两位,09
M: 月份, 9
dd: 日期,补满两位,05
d: 日期, 5
HH: 24制小时,补满两位,13
H: 24制小时,13
hh: 12制小时,补满两位,01
h: 12制小时,1
mm: 分钟,补满两位,14
m: 分钟,14
ss: 秒,补满两位,20
s: 秒,20
w: 星期,为 [‘日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’] 中的某一个,本 demo 结果为 五
输入:formatDate(new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w')
输出:2014-09-05 13:14:20 星期五

function formatDate (t,str) {
	var obj = {
		yyyy: t.getFullYear(),
		yy: (''+t.getFullYear()).slice(-2),
		MM: ('0'+(t.getMonth()+1)).slice(-2),
		M: t.getMonth()+1,
		dd: ('0'+t.getDate()).slice(-2),
		d: t.getDate(),
		HH: ('0'+t.getHours()).slice(-2),
		H: t.getHours(),
		hh: ('0'+t.getHours()%12).slice(-2),
		h: t.getHours()%12,
        m:t.getMinutes(),
        mm:("0" + t.getMinutes()).slice(-2),
		ss: ('0'+t.getSeconds()).slice(-2),
		s: t.getSeconds(),
		w: ['日', '一', '二', '三', '四', '五', '六'][t.getDay()]
	}
	return str.replace(/([a-z]+)/ig, function($1) { return obj[$1] } );
}

八、获取字符串的长度
如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1否则如果字符 Unicode 编码 > 255 则长度为 2

function strLength (str, bUnicode255For1) {
	if ( bUnicode255For1) {
		return str.length;
	}
	var count = 0
 	for (var i=0, len=str.length; i<len; i++) {
 		if (str.charCodeAt(i) > 255) {
 			count += 2;
 		} else {
 			count += 1;
 		}
	}
	return count;
}

九、 判断输入是否是正确的邮箱格式

function isAvailableEmail(sEmail) {
    var reg = /^(\w+)(\.\w+)*@(\w+)(\.\w{2,3}){1,3}/;
    return reg.test(sEmail);
}

十、 将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入

function rgb2hex(sRGB) {
    var r = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)/g;
    return sRGB.replace(r, function (a, r, g, b) {
    	return '#' + hex(r) + hex(g) + hex(b);
    })
    function hex (x) {
    	return x = x > 16 ? (+x).toString(16) : '0'+(+x).toString(16);
    }
}

十一、 css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
2. -webkit-border-image 转换后的结果为 webkitBorderImage

function cssStyle2DomStyle(sName) {
    if (sName[0] === '-') {
        sName = sName.slice(1)
    }
    var i=0, len=sName.length, str='';
    for (i; i < len; i++) {
        if (sName[i] === '-') {
            str += sName[i+1].toUpperCase()
            i += 2;
        }
        str += sName[i]
    }
    return str;
}

十二、 统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
1. 不限制 key 的顺序
2. 输入的字符串参数不会为空
3. 忽略空白字符

function count(str) {
    var obj = {};
    var i=0, len=str.length;
    for (i; i<len; i++) {
        if (obj[str[i]]) {
            obj[str[i]] ++
        } else {
            obj[str[i]] = 1;
        }
    }
    return obj;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值