js的作用域链了解吗(我不太明白,以为是要说this指向的一些问题,面试官说全局作用域,我才想起函数作用域,块级作用域这些)
如何创建一个块级作用域(我回答花括号,印象中以为花括号也能创建,面试官提出疑问,谈起C中的for循环和js中的for循环创建的块级作用域是否相同)
块级作用域是花括号创建的吗?继续解释一下(我说起let、var还有const的区别,面试官提醒我是let创建了块级作用域)
那let和const有什么区别(我开始提及栈内存和堆内存,const创建的对象的引用地址不能改变,但是里面的属性的值可以改变)
有了解过栈和堆的区别吗(我认为栈空间小,堆空间大)
为什么要把引用类型数据放在堆内存里呢(我胡乱猜,认为是存放在堆中效率更快,因为通过栈中的指针对内容进行查找应该效率比直接查找引用类型数据快一些)
了解过栈和堆吧,说说堆(我谈起大顶堆小顶堆,堆是完全二叉树,面试官开始提示完全二叉树的搜索效率更高等等,我似乎明白了一点为什么要用堆来存储引用类型数据)
那你知道栈和队列的区别吧(先进先出先进后出不解释)
原型知道吧,说一下(我开始说显式原型和隐式原型,但是说着说着把错误的记忆带进来了,我居然说Function这玩意没有隐式原型)
Function没有隐式原型吗,打开浏览器自己试试(我打开浏览器试了,确实有,当时记岔了,是最顶层的Object没有隐式原型,面试官开始提起一张原型相关的讲解图,我似乎看过哈哈,但是看了和没看差不多,以前一直以为原型链考察次数少,不用记那么详细,看来还是得面面俱到)
闭包用过吗,说一下(我用过,闭包一般用来保存变量,防止函数销毁(面试官突然“嗯?”了一下),我又改口垃圾回收)
闭包有哪些应用场景(我不太清楚,应该挺多,但是我居然无法说出一个具体的场景)
手写,实现一个Prime()函数
const prime1 = Prime(); console.log(prime1()); 2 console.log(prime1()); 3 const prime2 = Prime(); console.log(prime2()); 2 console.log(prime2());
(第一步,我突然遗忘了质数如何用代码判断,这个都想了好久,面试官提醒我用Math.sqrt()求个平方根,for循环到平方根那里就行了,如果这个数字不能整除这所有数时就是质数,这个不是考察重点,主要考我是否理解了刚刚他解释的闭包的应用,我只想到了大概的思路,看来对闭包还不是了解得很深入)
React和Vue框架的区别(已经是几乎我每次面试都必考的了。。。首先是浅层的社区生态啊,api多少啊,编码风格啊之类的,单向数据流和双向数据流,MVVM,函数式编程和响应式编程(正准备接下去讲diff算法的区别,被面试官暂停了)
你刚刚说react是函数式编程,能讲讲什么是函数式编程吗(糟了,我其实根本不懂函数式编程!我开始讲起hooks,虽然我知道它绝对不是绝对意义上的函数式编程,面试官开始谈论起函数是一等公民的说法,然后问我是不是在java和python中都没有见过函数调用函数或者返回一个函数的时候,大概就是函数的用法超级多,函数的应用超级广泛,函数超厉害啥都能干)
你项目的后端用的是啥框架(我说用go写的,go写得快一些,速度也快,面试官认为node写得更快,而且开始困惑我到底是来面前端还是面后端的了哈哈)
nodejs也用过吧,一般用哪些框架(其实我做小练习项目有时候也用node,一般就用轻量的express,koa什么的也试过)
谈谈进程和线程吧,说说node的进程和线程(node的这些原理我确实没那么了解,我说我对浏览器比较了解一些)
那说说浏览器的进程和线程吧(开始吟唱。。。什么GUI、V8、事件循环线程、定时器线程、HTTP异步请求线程,它们都属于浏览器进程)
你说这些线程属于一个进程?属于是什么,能具体解释一下吗(我真不知道属于对应的专业术语是啥,同属于一个CPU调度的空间?(开始胡言乱语))
那你觉得浏览器是单进程还是多进程?(开口回答单进程,如果开了多个页面就是多进程,面试官开始问我确定吗,然后说浏览器的插件和页面渲染是同一个进程吗,进一步解释了浏览器是多进程)
继续谈论闭包,react中的state为什么每次设置一个state它都能保存下来和别的不冲突,它内部的实现原理有想过吗?(我开始猜测是react底层使用多个闭包将这些state保存下来或者是定义了多个私有属性,面试官进一步和我解释了许多)
还有一些题目记不太清了,到了反问环节(技术栈?React和Vue,还有node。日常工作?B端和C端都有?Vue和React哪个使用得更多?差不多。加入我有幸能够加入的话,我还需要加强哪方面的学习?面试官回答底层原理,其实这些框架看我做了这么多项目还有github上提交这么多,框架使用问题不大,主要还是得深究底层,比如天天使用的useState,要去仔细思考它为什么能这样实现,底层的东西才是根本。面试官说其实面试也是双向的,都能互相学到东西。)
我非常感谢今天的面试官,这次面试就像上课一样,一次超级好的面试体验,不会的话,面试官会提醒你,还会给你耐心地讲解,引入更深的层次,带你去探索更多,八股很少,都是要往一些方向去深究,去刨根问底才能够找到答案。这是我在前面所有面试中从未体验到的,不管这次能不能过,这都将是我宝贵的回忆,再次万分感谢这位滴滴的面试官!