牛客网-前端大挑战-题解
牛客网-前端大挑战-(1-15)题解
本文章尽量用简洁的代码去完成题目要求,话不多说,上代码
1.修改 this 指向
题目描述 :封装函数 f,使 f 的 this 指向指定的对象
function bindThis(f, oTarget) {
//方法1 apply() 注:直接f.apply(oTarget,arguments)不对,
//因为题中说的是封装函数f,使用apply方法,会立即执行这个函数,
return function(){
return f.apply(oTarget,arguments);
};
//方法2 bind() bind可以直接返回这个更换this的函数
//只是改变了执行的上下文,并未立即执行而是回调执行。
return f.bind(oTarget);
//方法3 call() apply、call是传参数形式的区别,
//前者是参数数组,后者是参数项
return function(x,y){
return f.call(oTarget,x,y);
};
}
2.获取 url 参数
题目描述:获取 url 中的参数
- 指定参数名称,返回该参数的值 或者 空字符串
- 不指定参数名称,返回全部的参数对象 或者 {}
- 如果存在多个同名参数,则返回数组
function getUrlParam(sUrl, sKey) {
let str = sUrl.split('?')[1].split('#')[0].split('&'); // 取出每个参数的键值对放入数组
let obj = {
};
str.forEach(element => {
let [key, value] = element.split('='); // 取出数组中每一项的键与值
if(obj[key] === undefined ){
// 表示第一次遍历这个元素,直接添加到对象上面
obj[key]=value
}else{
obj[key]=[].concat(obj[key],value); // 表示不是第一次遍历说明这个键已有,通过数组存起来。
}});
return sKey=== undefined ? obj:obj[sKey]||'' // 如果该方法为一个参数,则返回对象。
//如果为两个参数,sKey存在,则返回值或数组,否则返回空字符。
}
3.dom 节点查找
题目描述:查找两个节点的最近的一个共同父节点,可以包括节点自身.
输入描述:oNode1 和 oNode2 在同一文档中,且不会为相同的节点
function commonParentNode(oNode1, oNode2) {
while(oNode1){
if(oNode1.contains(oNode2))