3.07-北京某通-一面总结

132 阅读6分钟

面试流程

面试时长:63min

1.自我介绍

讲了实习经历+项目经历

用过哪些数组方法?

我的回答: foreach,map,reduce。

又问: 讲一下ruduce方法

我的回答: 可以迭代做累加累积,第一个参数是函数,第二个参数是默认值(如果没有默认值为1)

总结: reduce()方法的第一个参数,就是每次遍历都会执行的匿名函数,当前函数的返回值就会传给下一次执行函数的第一个值。也就是prev。

了解原型吗?

我的回答: new一个构造函数实例化一个对象,实例有一个隐式原型,构造函数有一个显式原型,然后这个隐式原型指向显式原型。

总结:

  • 每一个对象都天生自带一个属性: __proto__, 属性值是当前实例所属类的原型(protopype)
  • 在prototype对象中,存储了需要给其实例使用的公有的属性和方法
  • prototype这个对象,在这个堆内存中天生自带一个属性constructor,这个属性指向实例所对应的构造函数

作用域

我的回答: 可以访问到变量的范围

总结: 作用域,由两个成员组成:

  • 变量对象(VO)
  • 父级作用域的指针[[scope]]

知道哪些实现继承的方法?

我的回答:

  1. 原型继续
  2. 拷贝继承
  3. 寄生组合继承

又问: 怎么实现原型继续?

我的回答: 调用父类的属性和方法,然后就乱讲一通xxxx。

总结: 根据原型的特性,js中继承的本质是一种委托机制,对象可以将需要的属性和方法委托给原型,需要用的时候就去原型上拿,这样多个对象就可以共享一个原型上的属性和方法,这个过程中是没有复制操作的。

javascript中的继承主要还是依靠于原型链,原型处于原型链中时即可以是某个对象的原型也可以是另一个原型的实例,这样就能形成原型之间的继承关系。

直接利用原型链特征实现的继承:子类构造函数的prototype指向父类构造函数的实例。

function Person() {
    this.head = 1;
    this.hand = 2;
}

function YellowRace() {

}

// 实现继承
YellowRace.prototype = new Person();

const hjy = new YellowRace();

console.log(hjy.head); // 1
console.log(hjy.hand); // 2
根据原型链的特性,当我们查找hjy实例的head和hand属性时,由于hjy本身并没有这两个属性,引擎就会去查找hjy的原型,还是没有,继续查找hjy原型的原型,也就是Person原型对象,结果就找到了。就这样,YellowRacePerson之间通过原型链实现了继承关系。

根据原型链的特性,当我们查找hjy实例的head和hand属性时,由于hjy本身并没有这两个属性,引擎就会去查找hjy的原型,还是没有,继续查找hjy原型的原型,也就是Person原型对象,结果就找到了。就这样,YellowRace和Person之间通过原型链实现了继承关系。

你知道哪些改变this的方法

我的回答: call,bind,apply

又问 讲一下他们的区别

我的回答: call和bind传参是一个一个逐一传入,apply 传参是数组方式传入的。call和apply是改变后页面加载之后就立即执行,是同步代码。bind是异步代码,改变后不会立即执行;而是返回一个新的函数。

用过防抖和节流吗?

我的回答: 自己的项目用过,防抖就是停止操作一段时间后执行,搜索框用过防抖。节流就是单位时间内只执行一次,一般都是button,防止用户疯狂点击,发出大量请求。

又问 讲一下怎么实现防抖?

我的回答: 我知道的有2种方法,第一种是时间戳实现,第二种是定时器实现,时间戳是怎么实现的记不得了,我讲一下定时器实现的方式, 每次执行debounce函数的时候,给函数内部的timer为null,然后重新开始计时,直到定时器时间到了触发方法。

回流和重绘

我的回答: 元素节点发生删除增加这些会发生回流,元素样式如颜色这些改变发生重绘。

你在工作中有写深拷贝吗?

我的回答: 写过,通过JSON的序列化和反序列化实现的。

又问 你知道这样实现的局限性吗?

我的回答: 好像有些对象这样深拷贝要出问题...额...其他不知道了

又问 递归拷贝了解过吗?

我的回答: 我说不了解,然后这里尴尬了很长一会,最后还是面试官打破僵局。说自己下去了解下,尬哟。

你刚刚数据类型讲到symbol,有使用吗?

我的回答: 没有使用

又问 知道怎么使用吗?

我的回答: let xixi = Symbol(),和使用对象是一样的

讲一下comput和watch区别

我的回答: computed依赖其他属性值,有缓存,只有依赖的属性值改变,才会重新计算。watch是监听的嘛。每当监听的数据发生变化时都会执行回调后续操作。

面完才想起,补充一下:

  1. computed:多个数据影响一个数据 ( 购物车 )
  2. watch:一个数据影响多个数据 ( 搜索 )

有一个table有10多行10多列,只有标签,其他什么都没有,点击其中一个块,让父元素知道是哪一个元素点击的。

我的回答: 阻断冒泡来实现

总结: 通过event.target实现

vue2和vue3区别

我的回答:

  1. 生命周期
  2. 响应式实现方式
  3. OptionsAPI和CompositionAPI
  4. setup
  5. mixins

又问: 用过mixins吗?

我的回答: mixins是混入嘛,可以写一些公共的方法。。

了解发布订阅模式吗?

我的回答: 在数据发生变化的时候,发布消息给事件中心Dep,去通知订阅者Watcher。

还有一些简单的面试题

  • 讲一下flex:1
  • 父元素宽度700,设置display:flex,四个子元素宽都都是200,怎么排列。
  • 实现水平垂直居中方式
  • a router.push到b,b router.replate c,点击浏览器左上方箭头在哪个页面

还有一些简单的面试题没写上去,关键的都是上面这些了。

总结

     给我的感受就是,前端已死,今年春招真难, 时隔6天收到了二面通知,我以为挂了。