关于字节手写的面试题

195 阅读1分钟

一、实现一个圣杯布局

<div class="header" >header</div>
<div class="main">
    <div class="left">left</div>
    <div class="center">center</div>
    <div class="right">right</div>
</div>
<div class="bottom">bottom</div>
/* code here */
 .main {
        overflow: hidden;
        padding: 0px 200px;
      }
      .center,
      .left,
      .right {
        float: left;
        position: relative;
        min-height: 130px;
      }

      .left {
        margin-left: -100%;
        width: 200px;
        left: -200px;
      }
      .right {
        width: 200px;
        margin-left: -200px;
        right: -200px;
      }
      .center {
        width: 100%;
      }
      .bottom {
        width: 100%;
      }

二、手动实现一个Promise.all()方法

function myPromiseAll(promiseArr) {
    // code here
    var result = [];
    return new Promise((resolve)=>{
       if(promiseArr.length === 0){
         resolve(promiseArr)
       }
       let count = 0;
       for(let i = 0;i<promiseArr.length;i++){
          Promise.resolve(promiseArr[i]).then(value =>{
              result[i] = value;
              if(++count === promiseArr.length){
                  resolve(result);
              }
          }).catch(err=>{console.log('promise报错了~~~')})
       }
    })

}

// 调用参考
const promise1 = new Promise(resolve => resolve(1));
const promise2 = new Promise(resolve => resolve(2));
const promise3 = new Promise(resolve => resolve(3));
const promiseAll = myPromiseAll([promise1, promise2, promise3]);
promiseAll.then(function(res) {
  console.log(res); // 输出:[1,2,3]
});

三、实现一个 EventBus 类,至少拥有on,emit两个方法

class EventBus {
     constructor(){
         this.events = {};
     }
    // on 用于注册事件
    // emit 用于触发事件
    on(eventName, cb) {
        // code here
        if(!this.events[eventName]){
            this.events[eventName] = [];
        }
        this.events[eventName].push(cb);
    }
    emit(eventName, arg) {
        // code here
        if(this.events[eventName]){
            this.events[eventName].forEach(cb => cb(arg));
        }    
    }
}

// 调用参考
const bus = new EventBus();
bus.on('event01', (eventArg) => console.log('event01', eventArg));
bus.emit('event01', 123); //输出:event01 123

四、实现url字符串转json,json转url字符串的两个方法

function urlToObj(url) {
    // code here
    let path = url.split('?')[0];
    let params = url.split('?')[1];
    let paramsObj = params.split('&');
    let obj = {query:{}}
    obj.path = path;
    for(let i = 0; i<paramsObj.length;i++){
        let objStr = paramsObj[i].split('=')
        obj.query[objStr[0]] = objStr[1];
    }
    return obj;
} 

function objToUrl(obj) {
    // code here
    var path = obj.path;
    let strArr = [];
    for(let i in obj.query){
        strArr.push(i+'='+obj.query[i]);
    }
    strArr.join('&')
    return path + '?' + strArr;
    
}

// 调用参考
const url = 'https://www.douyin.com/abc?foo=1&bar=2';
const urlObj = urlToObj(url); 
console.log(urlObj);
// 输出
// {
//     path: 'https://www.douyin.com/abc',
//     query: {
//         foo: '1',
//         bar: '2'
//     }
// }
urlObj.query.coo = '3'
const newUrl = objToUrl(urlObj); 
console.log(newUrl);
// 输出 https://www.douyin.com/abc?foo=1&bar=2&coo=3

五、实现一个节流函数

// 节流:函数每一段时间内只会执行一次
function throttle(fn, wait) {
    // code here
    let timeId = null;
    return function(args){
       if(!timeId){
          timeId = setTimeout(()=>{
          fn.apply(this,args);
          timeId = null;
          },wait)
       }
    }    
}

// 调用参考
const throttleFn = throttle((arg) => {console.log(arg)}, 1000);
throttleFn(1) // 1
throttleFn(1)

六、实现一个方法以比较两个版本号的大小

// 版本号格式参考如:1.0.0
function compareVersion(source, target) {
    // code here
    var sourceArr = source.split('.');
    var targetArr = target.split('.');
    for(var i = 0;i < Math.max(sourceArr.length,targetArr.length);i++){
       var num1 = +(sourceArr[i] || 0);
       var num2 = +(targetArr[i] || 0);
       if(num1 < num2){
           return -1;
       }else if(num1 > num2){
           return 1;
       }
    }
    return 0;
}

// 调用参考
compareVersion('1.0.3', '1.0.5'); // 返回 -1
compareVersion('1.0.7', '1.0.5'); // 返回 1
compareVersion('1.1.3', '1.0.5'); // 返回 1