牛客网前端题

479 阅读2分钟

1. 修改this指向

// apply修改this作用域
function bindThis(f, oTarget) {
    return function () {
        return f.apply(oTarget,arguments)
    }
}

// call修改this作用域
function bindThis(f, oTarget) {
    return function (){
        return f.call(oTarget,...arguments)
    }
}
// bind修改this作用域
function bindThis(f, oTarget) {
    return function (){
        return f.bind(oTarget,...arguments)()
    }
}
// 或者直接简写
function bindThis(f, oTarget) {
    return f.bind(oTarget)
}

几种

  1. call 和 apply 返回函数立即执行的结果
  2. bind 不会立即执行
  3. call接收是参数列表, apply接收一个参数数组

2. 获取url参数

获取 url 中的参数

  1. 指定参数名称,返回该参数的值 或者 空字符串
  2. 不指定参数名称,返回全部的参数对象 或者 {}
  3. 如果存在多个同名参数,则返回数组
  4. 不支持URLSearchParams方法
输入:
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe key
输出:
[1, 2, 3]
function getUrlParam(sUrl, sKey) {
    let res = {};
    let params = sUrl.split('?')[1].split('#')[0].split('&');
    
    params.forEach(ele => {
        let [key, val] = ele.split('='); //
        if(res[key]){
            res[key] = [...res[key], val];
        }else{
            res[key] = val;
        }
    })
    
    if(sKey === undefined) return res;
    else{
        if(res[sKey] === undefined) return ''
        else return res[sKey];
    }
}

ES6的写法:

3. dom节点的查找

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

输入描述: oNode1 和 oNode2 在同一文档中,且不会为相同的节点

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

4. 根据包名,在指定空间中创建对象

输入描述: namespace({a: {test: 1, b: 2}}, 'a.b.c.d')

输出描述: {a: {test: 1, b: {c: {d: {}}}}}

function namespace(oNamespace, sPackage) {
    let scope = sPackage.split('.');
    let ns = oNamespace;
    for(let i = 0; i < scope.length; i ++){
        // 如果对象中没有该元素,或者不是对象,那么就置为空对象
        if(!ns.hasOwnProperty(scope[i]) || Object.prototype.toString.call(ns[scope[i]]) !== '[object Object]'){
            ns[scope[i]] = {};
        }
        //继续往下找
        ns = ns[scope[i]];
    }
    return oNamespace;
}

5. 数组去重

// 方法一:终极思路
Array.prototype.uniq = function () {
    return [...new Set(this)]
}
Array.prototype.uniq = function () {
    let arr = [];
    let flag = true;
    this.forEach(value => {
        if(arr.indexOf(value) === -1) { //判断的是arr新数组
            if(value !== value) {
                if(flag) {
                    arr.push(value);
                    flag = false;
                }
            }else{
                arr.push(value)
            }
        }
    })
    return arr;
}

主要判断的是NaN , indexof(NaN) -1

6. 斐波那契

// 递归思路
function fibonacci(n) {
    if(n === 0) return 0
    if(n === 1 || n === 2) return 1
    return fibonacci(n-1) + fibonacci(n-2)
}

7 时间格式化输出

function formatDate(t, str){
    let year = '' + t.getFullYear();
    let month = t.getMonth() + 1;
    let day = t.getDate();
    let hour = t.getHours();
    let minutes = t.getMinutes();
    let second = t.getSeconds();
    let week = ['日', '一', '二', '三', '四', '五', '六'];
    
    let date = {
        'yyyy': year,
        'yy': year.slice(2),
        'MM': ten(month),
        'M': month,
        'dd': ten(day),
        'd': day,
        'HH': ten(hour),
        'H': hour,
        'hh': ten(hour % 12),
        'h': hour % 12,
        'mm': ten(minutes),
        'm': minutes,
        'ss': ten(second),
        's': second,
        'w': week[t.getDay()]
    }
    
    for(let key in date){
        str = str.replace(key, date[key])
    }
    return str;
}
    
    let ten = num => num >= 10 ? num : '0' + num

8 获取字符串的长度

function strLength(s, bUnicode255For1) {
    if(bUnicode255For1) return s.length;
    let len = s.length;
    for(let i = 0; i < s.length; i ++) {
        if(s[i].charCodeAt() > 255) len ++;
    }
    return len;
}

9 邮箱字符串匹配

function isAvailableEmail(sEmail) {
    return /^[\w\.]+@\w+\.\w+/.test(sEmail)
}

10 颜色字符串转换

function rgb2hex(sRGB) {
    let reg = sRGB.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)/)
    if(!reg) return sRGB;
    
    // 字符串拼接
    let str = '#';
    for(let i = 1; i < reg.length; i ++) {
       let m = parseInt(reg[i]);
       if(m >=0 || m <= 255){
           str += (m >= 16 ? m.toString(16) : '0' + m.toString(16));
       }else{
           return sRGB;
       }
    }
    return str;
}