最近一些面试题

96 阅读2分钟

高度塌陷的原因?

 父元素没有设置高度,子元素浮动后,会脱离文档流,导致子元素无法撑开父元素的高度,就会出现高度塌陷。

 延伸问题
 why ->   overflow: hidden; 可以解决高度塌陷
 because ->   计算高度的时候会把浮动元素的高度计算进去

解决高度塌陷问题的方法自行查找,这里不做过多陈述。

var 和 let 区别

 声明变量 letconst -> let/const/var 的区别?
    let & const区别
        a. let/const 声明的变量都存在当前上下文的AO/VO 变量对象中
        b. const 声明的变量必须赋初始值
        c. let 声明的变量,可以改变 '变量''值' 之间的指针指向,const 不可

    let & var 的区别
        a. var 存在变量提升,let 不可以
        b. let 申明 的变量存在在 VO/AO 中, var 声明的变量存在 GO
        c. let 存在暂时性死区
        d. var 可以重复声明
        e. 在JS 代码执行过程中,如果大括号(除对象和函数的)
            中出现let/const/function/class 等关键词,
            则大括号所在的代码块,会产生一个「私有块级上下文」var 不会产生块级上下文,且对 var 没有任何作用

Promise/async/await

这里放个阮一峰大佬的写的es6具体可参考 es6.ruanyifeng.com/

useMemo & useCallback的区别?

输出题

var name = "hh";
var obj = {
    name : "kk",
    func1: function () {
        console.log(this.name)
    },
    func2: function () {
        setTimeout(function () {
            this.func1()

        }, 1000);
    }
};
obj.func2();

// 扩展 输出 kk ,怎么实现?

手写实现 reduce

function _reduce(fn, init) {
    let self = this, result;
    if(init) {
        result = init;
    }else {
        result = self[0];
        self.splice(0, 1);
    }
    self.map((item, index) => {
        result = fn(result, item, index, this);
    })
    return result;
}

不新建数组的前期下实现数组的反转

 function _reverse(arr) {
 if(Array.isArray(arr)) Throw Error('...');
 let reft = 0; // 左指针
 let right = arr.length - 1; // 右指针
 for(let i = 0; i < arr.length; i++) {
     if(left < right) {
         let temp = arr[left];
         arr[left] = arr[right];
         arr[right] = temp;
         left++;
         right--;
     }
 }
 return arr;
 }

手写Promise.all

 Promise._all(promiseAry) {
     let arr = [];
     return new Promise((resolve, reject) => {
         PromiseAry.map((item, index) => {
             Promise.resolve(item).then(res => {
                 arr[index] = res;
                 if(arr.length === promiseAry.length) {
                     resolve(arr);
                 }
             }).catch(err => reject(err))
         
         })
     })
 }

实现 usePrevious

function usePrevious(value) {
    const ref = useRef();
    useEffect(() => {
        ref.current = value;
    });

   return ref;
}

给定是字符串,输出指定格式

{ a: [1,2,3], b: 2, c: 3 }

let str = 'a=1&b=2&c=3&a=2&a=3'
function fn(str) {
    let obj = {};
    str = str.split('&');
    str.map(item => {
      let [key, value] = item.split('=');
      if(obj[key]) {
        obj[key] = [[obj[key]]].concat([value]).flat(Infinity);
      }else {
        obj[key] = value;
      }
    })

    return obj;
    }
console.log(fn(str));