字节跳动_前端实习视频面试_内推二面

前言

一面结束后五分钟hr打来电话,要求今天稍后进行二面(真刺激)。二面是另外一个面试官,基本全部问项目,并且个人感觉比一面更加难受,询问项目里面用到的框架和技术的底层实现,我这方面十分薄弱,基本是拿来主义,这点需要改正。

面试官先询问你的基本情况。可实习时长,工作地点是否冲突。

面试时长:30 分钟


题目

1.我看到你说你用 vue 开发了一个项目,你能说下你这个项目具体做什么的,分了哪几个模块吗?

略。

2.在做这个项目的时候有没有一些让你比较印象深刻的东西

这里我分别说了 富文本编辑器 和 vuex

(1)项目中存在编写博客的部分,要在线编写博客的话就需要一个富文本编辑器了。最后也是在队友的帮助下在网上找到了一个第三方的插件。

(2)其次是在开发的时候发现vue的组件之间的传值很痛苦,如果两个同级组件之间传值会很麻烦。所以在上网查询之后决定使用 vuex ,也成功解决了问题。

3.那么富文本编辑器你有了解过它的实现吗

我说没有,面试官说这些你需要课余时间去了解一下,不要用完就不管了。

我说好的。。。。

富文本编辑器的实现:https://www.jianshu.com/p/5997a90aab64

4.vuex你有了解过它的实现吗,或者说为什么设计vuex

我说了我目前对于vuex 的了解。

一个 store 模式,可以 模块化 存储 需要全局保存的值;其他组件需要拿 这类 值的时候就可以直接从 vuex 中获取,减少组件与组件之间传值耦合。

5.如果不用vuex的话,你一开始是打算怎么解决这个问题的

我说 比如两个同级组件之间进行传值,我会先让父组件接收一个组件 emit 出来的值,然后传给另一个子组件,但是这么写会炸掉。

6.*抛开vuex,为什么不能把数据挂到 window 上呢

我说,将数据挂到 window 上会污染全局变量,而且 vuex 可以分模块化存储数据,在 window 上直接挂 数据会比较麻烦。

面试官追问:其实在 window 上挂 也可以实现模块化开发,vuex 和 vue 的原理都是挂到window上的啊。

其实 vuex 官网有说明 vuex 和 全局对象的区别:vuex

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
  2. 你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

面试官发现我对以上的解决方案和之后的措施之后说,不光是解决问题了就行了,你还要去了解它是怎么实现的,不要停留在会用的地步。

我只能频频点头。。。

7.说说用vue开发和用jq开发的差别,我们为什么要用vue,用vue开发有什么好处?

一开始我说了 vue 开发 是面向组件的,可以 将 html css js 代码集中管理;

这里 vue 的最大的好处应该是 业务代码 可以和 组件代码 分离。

8.*说下vue你了解多少,虚拟DOM和实际DOM说说实现

我说虚拟DOM我知道 是 实际DOM 的js 对象副本,然后实际DOM发生变化的时候进行最小差值比较。

2019 年 11 月 11 日 更新
参考 react 的话,有 react Fiber,WIP 树比较等等:掘金|react fiber
还有 snabbdom 算法,等等

9.为什么你第一个项目用了 vue,第二个项目又退回去用了 jquery

我直接说出了我的难处,把自己的基本情况和面试官说,说技术选型是老师负责,我没办法。。。

把面试官逗笑了。。。

10.*你有个项目用了js和jq做开发,试试写一个js原型链的继承

js继承:

如果现在有 Person 类,Teacher 类继承Person类

var teacher = new Teacher();
teacher instanceof Teacher;  // true

意思就是 teacher 是否是 Teacher 的实例,是的

instanceof 的原理就是 teacher.__proto__(一次或多次隐式原型) 之后能否指向 Teacher.prototype

很明显: teacher.__proto__ === Teacher.prototype;

那么如果要让 Teacher 继承 Person

teacher instanceof Person; // true

也就是说 teacher.__proto__.__proto__ === Person.prototype;

根据①式带入②式可以得到

Teacher.prototype.__proto__ === Person.prototype;

既要把 Teacher.prototype 的隐式原型指向 Person.prototype,方可完成继承;

最终的继承代码:取自 MDN:MDN|继承

function Person(name) {
    this.name = name;
}

Person.prototype.sayName = function() {
    console.log(this.name);
};

function Teacher(name,subject) {
    Person.call(this,name);
    this.subject = subject;
}

// Teacher.prototype.__proto__ = Person.prototype;
Teacher.prototype = Object.create(Person.prototype);
Teacher.prototype.constructor = Teacher;

Teacher.prototype.saySubject = function() {
    console.log(this.subject);
};

var teacher = new Teacher('张三','高数');

teacher.sayName();
teacher.saySubject();
console.log(teacher instanceof Person);

感想

二面官说得对,框架组件拿来用完就算了是不行的,还需要理解其底层实现,否则一直停留在使用的地步,开源就没有什么意义了。

你可能感兴趣的:(javascript,Vue,面试)