欧科云链前端面试

1,202 阅读3分钟

朋友研究生一年经验,base北京某大厂

一面

时间:20220517
状态:未知

1. 箭头函数和普通函数的区别,下面的输出

var name = "global";
var obj = {
    name: "ngnce",
    log:()=> {
        console.log(this.name);
    }
}
obj.log()

区别:

  • 箭头函数无arguments对象
  • 箭头函数内部的this与其自身的调用无关系,与它上层(声明位置)this指向相同。
  • 箭头函数无prototype属性,无法作为构造函数

输出
global,log函数里面的this与它外层的this相同,所以指向window

2. promise

  • Promise.all、Promise.allSettled的区别 两者主要是在遇到什么情况就返回上的区别。 Promise.all 在全部给定promise全部resolve或者某个reject的时候就会返回结果。更适合彼此次昂户以来或者任何一个reject时理解结束。
    Promsie.allSettled在所有给丁的promise都已经fullfilled或rejeced后的promise,并带有一个数组,每个对象对应promise的结果。
    看示例:

  • Promise.all 给定promise全部resolve

const p = Promise.all([1,2,3]);
// p是一个promise对象,状态是fulfilled

image.png Promise.all 给定的promise其中一个reject

// 此时会报错,因为没有对异常进行处理
const p2 = Promise.all([1,Promise.reject(2),3]);

const p2 = Promise.all([1,Promise.reject(2),3]).catch(err => console.log(err));

image.png

Promise.allSettled 给定promise全部resolve

// p3是一个promise对象,状态是fulfilled
const p3 = Promise.allSettled([1,2,3]);

image.png

Promise.allSettled 给定的promise其中一个reject

// p4是一个promise对象,状态是fulfilled
const p4 = Promise.allSettled([1, Promise.reject(2), 3]);

image.png

  • promise.all中第2个promise,reject,第3个promise还会执行么? 会执行。
const p1 = new Promise(resolve => {
    console.log('promise1');
    resolve('promise1')
});
const p2 = new Promise((resolve, reject) => {
    console.log('promise2');
    reject('promise2 error')
});
const p3 = new Promise(resolve => {
    console.log('promise2');
    resolve('promise3')
});
Promise.all([p1, p2, p3]);

image.png

3. Vue

vue里component  { data: function() {return {} }},data可以返回对象也可以返回函数,为什么?
【其实看到这个题,我不知道该怎么回答,说说我的理解吧】
如果说为什么可以对象也可以返回函数,这个就和vue框架设计有关了,vue源码对data处理的时候,就支持两种方式。
如果我们传入的是对象的时候,如果这个组件被多个地方使用的时候,data将会共享。

4. 谷歌插件通信

chrome插件background.js和content.js通信用什么,popup.js和content.js通信用什么?
【没看懂这个题要考察啥,有知道的兄弟可以评论解答下】

5. 盒模型

标准盒模型:box-sizing: content-box(默认),盒子的实际所占据的宽度为 width+padding

怪异盒模型(又称IE和模型):box-sizing: border-box,盒子的实际占据的宽度为width

6. 协商缓存

协商缓存,是说我们在第一次请求时,(无强缓存的情况),响应头会返回Last-Modified或者Last-Match两个字段和值,后者优先级更高。第二次请求的相同资源的时候,请求头会带上If-Modifed-Since或者If-None-Match字段,值为前面服务端返回的值,如果命中协商缓,则本次请求http code状态码为304,并更新前面两个字字段的值;如果没有命中状态,状态码200,并返回资源。

更多内容:强缓存和协商缓存

7. 写深拷贝,如果有循环引用,怎么解决?

function deepClone(obj, hash = new WeakMap()) {
    if(typeof obj !== 'object' || obj === null) {
        return obj;
    }
    if(hash.has(obj)) {
        return hash.get(obj);
    }
    let res = Array.isArray(obj) ? [...obj] : {...obj};
    hash.set(obj, res);
    Reflect.ownKeys(res).forEach(key => {

        let item = res[key];
        res[key] = deepClone(item, hash);
    });
    return res;
}