2021面试题栏 -- 手写代码部分

1,手写快排;

let ary = [3,5,1,2,7,9,6]

let temp = null;

for(let i = 0; i < ary.length; i++){
    for(let j = 0; j < ary.length - 1; j++){
        if(ary[j] > ary[j+1]){
            temp = ary[j];
            ary[j] = ary[j+1]
            ary[j+1] = temp
        }
    }
}

console.log(ary)

2,手写深拷贝;

    var obj1 = {
        name:'aaaaa',
        age:'10',
        sex:'girl',
        scorl:{
            math:'100',
            chinese:'99',
            english:'98'
        }

    function deepClone(obj){
        let cloneObj = Array.isArray(obj) ? [] : {}
        if(obj && typeof obj == 'object'){
            for( key in obj ){
                if(obj.hasOwnProperty(key)){
                    if(obj[key] && typeof obj[key] == 'object'){
                        cloneObj[key] = deepClone(obj[key])
                    }else{
                        cloneObj[key] = obj[key]
                    }
                }
            }
        }
        return cloneObj
    }
 
    var obj2 = deepClone(obj1);

3,手写防抖和节流;

函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,
如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
// 防抖
function debounce(func, wait=0) {    
   if (typeof func !== 'function') {
    throw new TypeError('need a function arguments')
   }
   let timeid = null;
     let result;
 
   return function() {
    let context = this;
    let args = arguments;

    if (timeid) {
      clearTimeout(timeid);
    }
    timeid = setTimeout(function() {
      result = func.apply(context, args);
    }, wait);
 
    return result;
   }
}
// 处理函数
function handle() {    
    console.log(Math.random()); 
}
// 滚动事件
window.addEventListener('scroll', debounce(handle, 1000));

函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。
// 节流throttle代码(时间戳+定时器):
var throttle = function(func, delay) {     
    var timer = null;     
    var startTime = Date.now();     
    return function() {             
        var curTime = Date.now();             
        var remaining = delay - (curTime - startTime);             
        var context = this;             
        var args = arguments;             
        clearTimeout(timer);              
        if (remaining <= 0) {                    
            func.apply(context, args);                    
            startTime = Date.now();              
        } else {                    
            timer = setTimeout(func, remaining);              
        }      
    }
}
function handle() {      
    console.log(Math.random());
} 
window.addEventListener('scroll', throttle(handle, 1000));

4,手写call / apply;

call: 

    var name = "张三"
    var obj = {
        name:"李四"
    }

    function fn(a,b,c){
        console.log(a+b+c+this.name)
    }

    Function.prototype.myCall = function (obj){
        obj = obj ? Object(obj) : window;
        obj.fn = this
        var argumentsAry = []
        for(let i = 1,len = arguments.length; i < len; i++){
            argumentsAry.push("arguments["+i+"]")
        }
        var result = eval("obj.fn("+argumentsAry+")")
        delete obj.fn
        return result
    }

    fn.myCall(obj,"我的","名字","是") // 我的名字是李四

apply:

    var name = "张三"
    var obj = {
        name:"李四"
    }

    function fn(a,b,c){
        console.log(a+b+c+this.name)
    }

    Function.prototype.myApply = function (obj,ary){
        obj = obj ? Object(obj) : window;
        var result;
        obj.fn = this
        if(!ary){
            result = obj.fn
        }else{
            var argumentsAry = []
            for(let i = 0,len = ary.length; i < len; i++){
                argumentsAry.push("ary["+i+"]")
            }
            result = eval("obj.fn("+argumentsAry+")")
        }
        delete obj.fn
        return result
    }

    fn.myApply(obj,["我的","名字","是"]) // 我的名字是李四

5,手写括号匹配

var moduleJson = {//括号匹配模板,你可以增加别的匹配,比如“{}”,“<>”,等,只需写入moduleJson里面去    
    ")":"(",    
    "]":"["    
    
}    
    
var testStr = "([()]())()()";//测试字符串    
var tempSaveArray = [];//用于存储字符串的数组    
for(var i = 0;i<testStr.length;i++){//如果存在括号字符,就加入数组    
    for(var key in moduleJson){    
        if(testStr[i] == key||testStr[i]==moduleJson[key]){//如果字符串中存在json中的key 和value字符,就加入数组    
            tempSaveArray.push(testStr[i]);    
        }    
    }    
}    
if(tempSaveArray.length){    
    if((tempSaveArray.length%2)!=0){//如果括号的长度为奇数,肯定不匹配    
        console.log("括号不匹配");    
    }else{//如果字符串括号长度为偶数,就进行遍历数组,进行判断 12345  0 4    
  
        for(var j = 0;j<tempSaveArray.length;j++){  
            //(((())))  
            if(moduleJson[tempSaveArray[j]]){//如果是右括号,就和前一个进行匹配。  
                //拿到数组前一位的字符,是否与自己匹配  
                if(j>0){  
                    console.log("前一个元素:"+j+tempSaveArray[j-1]+" 后一个元素"+moduleJson[tempSaveArray[j]]);   
                    console.log(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]);  
                    if(moduleJson[tempSaveArray[j]]==tempSaveArray[j-1]){//说明两个括号进行了匹配,让其出栈  
                            tempSaveArray.splice(j-1,2);  
                            j=0;//从新遍历数组  
                    }  
                }    
            }  
        }   
  
        if(tempSaveArray.length){//没有移除完毕  
            console.log("括号不匹配");  
        } else{  
            console.log("括号匹配,恭喜你语法正确!");   
        }  
    }    
}else{    
    console.log("你输入的字符串不存在括号");    
}

6,手写数组去重

var testAry = [..."1235sahdhhhsygyw5555"]
var newAry = new Set(testAry)

console.log(newAry) //["1","2","3","5","s","a","h","d","y","g","w",]

 7,将奇数排在前面,偶数排在后面。要求时间复杂度O(n)。

    var testAry = [..."123456789"]
    var newAry = []
    testAry.forEach((item,i) => {
        let n = Number(item)
        if(n%2 == 0){
            newAry.push(n)
        }else{
            newAry.unshift(n)
        }
    })

    console.log(newAry) //["9","7","5","3","1","2","4","6"]

 8,解析出URL中所有的部分

获取当前URL对象:window.location

通过URL对象获取详细的内容:

地址:window.location.href
协议:window.location.protocol
主机名:window.location.hostname
端口:window.location.port
主机:window.location.host
来源:window.location.origin
pathname:window.location.hostname
锚点:window.location.hash
查询参数:window.location.search

 9,实现一个compare函数,比较两个对象是否相同

isObjectValueEqual(a, b) {
     var aProps = Object.getOwnPropertyNames(a);
     var bProps = Object.getOwnPropertyNames(b);
      if (aProps.length != bProps.length) {
           return false;
      }
      for (var i = 0; i < aProps.length; i++) {
        var propName = aProps[i]

        var propA = a[propName]
        var propB = b[propName]
        if ((typeof (propA) === 'object')) {
          if (this.isObjectValueEqual(propA, propB)) {
              return true
            } else {
              return false
            }
        } else if (propA !== propB) {
          return false
        } else { }
      }
    return true
    },

10,找出出现次数最多的英语单词

    let str = "asdfssaaasasasasaa";
    function findMax(data){
        data = data || ""
        let obj = {};
        if(data.length == 0){
            return undefined
        }else{
            for(let i=0; i<data.length; i++){
                let key = data[i]
                if(obj[key]){
                    obj[key]++
                }else{
                    obj[key] = 1
                }
            }
        }
        let max = 0;
        let result = "";
        for(let item in obj){
            if(max < obj[item]){
                max = obj[item]
                result = item
            }
        }
        console.log("字符串中出现次数最多的字符是"+result+",次数是"+max)
    }
    findMax(str);

伙伴们在面试过程中还遇到过其他的写代码的题目吗?

欢迎在评论区评论,分享,

我们随时更新博文内容哦!

拜了个拜!迪迦。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值