一、起因
面试了两天,喉咙快快快哑了......
因为疫情还有距离的原因,都是线上面试。我举几个我碰到的比较多的问题:
- 盒子水平垂直居中的方式?
- js 的数据类型?检测数据类型的方式?
- 数组去重的方式?
- 如何清空一个数组?
- 防抖和节流?
- 深拷贝和浅拷贝有哪些?
- slice 和 splice 的区别?
- 说说你对原型链的理解?
- Promise/async await
- 说说 webpack ?
- vue 双向数据绑定原理?
- vue 组件传值的方式
- vue3 新特性
- TS 和 JS
- react hooks(useState、useEffect、useRef 等)
- redux 和 vuex
- 你遇到过哪些兼容问题?
当然还有一些细节问题,我就不“枚举”了哈......
今天的重点是说说“原型链”,因为面试了两天,接了十几个面试电话,大概有四五位面试官问过我:说说你对原型链的理解。 我的回答一定不是最专业的,也不大佬级别的,但一定是生动形象,通俗易懂,令面试官耳目一新的。不急,且听我细细道来。
二、经过
我挑其中一位面试官的问法,来还原一个场景吧!括号里面是我补充的心理活动,也许有误差,但无伤大雅。
面试官(先来个简单的吧): 你说说 js 数据检测类型的方式?
我(小 case): 嗯,有 typeof 、instanceof、还有一个万能检测数据类型,很长的那个......
面试官(一脸疑问):嗯,很长的那个是啥,你说呀?
我(迅速脑补): 嗯,就是那个 Object.prototype.toString.call()
面试官(看来有两下子): 哦哦,原型链的那个......
我(幸亏我记得): 嗯嗯,对对对!
面试官(顺势而为): 那你说说原型链吧!
我(强忍窃喜): 嗯,好的。原型链呀,原型链就是多个对象之间通过__proto__ 连接而成的链式结构,我们就把它称作原型链。
面试官(什么鬼,这就完啦): ......
空气大概沉默了半秒......
我(小心翼翼地试探): 额,是太简洁了吗?要不我再详细说说?
面试官(正有此意): 嗯,继续说说,太简单了。
我(摩拳擦掌,蓄势待发): 嗯嗯,好的。说到原型链呀,我可以给你讲一个故事。我的理解是这样的:如果一定要说原型链的话,那就得说说构造函数、原型对象和实例对象之间的三角关系。我把它们看做作是一家三口的关系。其中,构造函数呢就是爸爸,原型对象呢就是妈妈,实例对象呢就是它们的儿子。通常呀,儿子饿了就会看看家里有没有吃的,家里有现成的就吃,家里没有的话,它就通过__proto__去找(访问)它的妈妈要吃的。但是,妈妈(原型对象)也没做饭呢?不要忘啦,妈妈也有她的妈妈呀,妈妈这时就会通过__proto__去找她的妈妈要吃的。这样一层层地往上找,就形成了所谓的原型链。如果一直找到原型链的顶端都没有找到吃的话,就是 null。额这样,我说清楚了吗?
面试官(饶有兴致,若有所思): 挺生动形象的嘛!
如果面试官还想继续挖,他可能会问,那你说说原型链有哪些应用,你要会说哦。
三、总结
其实面试最忌讳的就是照本宣科,给面试官的感觉像在背书一样,有时候你背出来了,可能你都不懂背的是啥。这种最经不住深挖了。一定要理解了,然后结合自己的语言表达特点来说。
面试,我认为是更像是一场技术的交流、分享与学习,而不是博弈。你太强势了,完全不给面试官留活路啊。所以不要担心自己答不上来,你不可能什么都知道。但是你什么都不知道那是万万不行的。不懂的不要瞎说,不知道就不知道,如果你知道替代方案,就会是加分项。你若不知其所以然,总得知其然吧。
我记得有一场面试,面试官很强势,是我感觉答得最差的一个,挂完电话就感觉凉凉了,结果竟然当晚就给我发 offer 了;还有一场面试,是持续了49分钟的腾讯会议,虽然感觉答得一般,但不至于初试都没过吧,结果还真挂了。所以啊,生活总是这样,处处充满惊喜和惊讶。