阿里社招两年前端面经(1),2024年最新腾讯前端开发面试记录

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

const objB = deepClone(objA);

console.log(objA === objB); // 打印 false

console.log(objA, objB); // 对象内容一样

优化后的代码:

// 深拷贝:对对象内部进行深拷贝,支持 Array、Date、RegExp、DOM

const deepCopy = (sourceObj) => {

// 如果不是对象则退出(可停止递归)

if(typeof sourceObj !== ‘object’) return;

// 深拷贝初始值:对象/数组

let newObj = (sourceObj instanceof Array) ? [] : {};

// 使用 for-in 循环对象属性(包括原型链上的属性)

for (let key in sourceObj) {

// 只访问对象自身属性

if (sourceObj.hasOwnProperty(key)) {

// 当前属性还未存在于新对象中时

if(!(key in newObj)){

if (sourceObj[key] instanceof Date) {

// 判断日期类型

newObj[key] = new Date(sourceObj[key].getTime());

} else if (sourceObj[key] instanceof RegExp) {

// 判断正则类型

newObj[key] = new RegExp(sourceObj[key]);

} else if ((typeof sourceObj[key] === ‘object’) && sourceObj[key].nodeType === 1 ) {

// 判断 DOM 元素节点

let domEle = document.getElementsByTagName(sourceObj[key].nodeName)[0];

newObj[key] = domEle.cloneNode(true);

} else {

// 当元素属于对象(排除 Date、RegExp、DOM)类型时递归拷贝

newObj[key] = (typeof sourceObj[key] === ‘object’) ? deepCopy(sourceObj[key]) : sourceObj[key];

}

}

}

}

return newObj;

}

// deepCopy 函数测试效果

const objA = {

name: ‘jack’,

birthday: new Date(),

pattern: /jack/g,

body: document.body,

others: [123,‘coding’, new Date(), /abc/gim,]

};

const objB = deepCopy(objA);

console.log(objA === objB); // false

console.log(objA.others === objB.others); // false

console.log(objA, objB); // 对象内容一样

1.2 自我介绍

面试官你好,我叫XXX,XXXX年毕业于XXXX大学XXXXXXXX专业,(在校实习经历),(目前就职于),(当前岗位职责)。

XXXXXXXXXX…(围绕当前就职公司项目展开,可以初步介绍简历上的项目经验)

XXXXXXXXXX…(围绕自己在当前就职公司做的贡献,体现你的个人价值)

XXXXXXXXXX…(介绍一下在当前就职公司的绩效情况)

XXXXXXXXXX…(简单介绍一下跳槽的原因)

1.3 简历问答

1.3.1 工作经历

基于自我介绍提及,扩展回答。

1.3.2 绩效情况

基于自我介绍提及,扩展回答。

1.3.3 为何在 Vue 和 Angular 和 React 中选了 Vue?

刚入职的时候XXXX有用 Vue 的有用 Angular 的,以前坐我隔壁的XXXX就是用 Angular。

在2020年初的时候我们团队决定统一前端技术栈,当时我也跟领导就是有交涉交流过一些想法。目前市面上三大前端框架 Vue、React、Angular,三个框架本质上没有优劣之分,但技术选型主要考虑合适的场景。选 Vue 第一个是:

  1. Vue 好上手,对新手友好,人员变动情况下能够更快地承接项目。

  2. Vue 技术栈在市场占有率比较高,在招聘上能够选择的人员更多。

  3. Vue 技术社区更新迭代快,社区活跃度高,遇到问题方便查。

1.3.4 JavaScript 和 TypeScript 有什么区别?在技术选型的时候什么因素使你考虑用?

TypeScript 是 JavaScript 的一个超集,它本质上其实是在 JavaScript 上添加了可选的静态类型基于类的面向对象编程

TypeScript 的特点:

  • 解决大型项目的代码复杂性

  • 可以在编译期间发现并纠正错误

  • 支持强类型、接口、模块、范型

最开始技术选型的时候,主要考虑是XXX这个项目它不算特别大但是也不算小,而且行内系统可以起到一个试验性参考性的示范。它又是包含了桌面端和移动端,后面有团队想在自己的团队内推广这样的技术选型,都是参考XXX的项目设计。

在实际的使用中,最大的好处还是:第一个是强类型,规范大型工程中变量声明,可控可预知,减少不同开发人员引入的隐性 bug。第二个是接口,在XXX里面的接口,其实主要是用于定义数据结构,也是规范数据结构的作用。第三个是继承,避免重复实现一些功能,protectedpublicprivate 等关键字也可以实现方法的隔离。

1.3.5 关于桌面端 UI 框架选型的思考:为何在 Element 和 iView 中选了 Element?

前端技术框架在选定 Vue 的情况下,当时我在跟领导敲定室内桌面端框架的选择有两个:一个是 iView、一个是 Element。最初我是比较青睐 iView 的,因为整个 UI 设计看起来比 Element 更加清爽,然后在最初XXX重构的时候直接 iView 用上去。

最初使用的时候就发现有个地方其实两个框架有很大区别,Element 的 Table 倾向于元素展示在 HTML 结构上,iView 的 Table 倾向于 template 模式,只有一个 table 标签,所有的数据和内部行列结构都放在 data 里面。(虽然 iView 现在也支持非 template 结构了)

我个人是比较倾向于 Element 的 Table 展示形式,一目了然能看清整个数据结构,而无需把结构类相关的东西绑定到数据里面,使得数据是数据,展示是展示。

有趣的是,当我使用 iView 开发了一个 Table 的时候,发现 IE 浏览器展示不出表格,查了一下发现它不支持 IE,所以我就用了一个周末两天的时间把 iView 整个替换成 Element,这是一个惨痛的教训哈哈。

说回正题,最后敲定 Element 而不选用 iView 的原因:

  1. 从 GitHub 上看,Element 50.7k Star,iView 23.9k Star。Element 的用户群更大。

  2. Element 是饿了么开发开源 UI 组件框架,背后靠着阿里;iView 已经进行商业化了,有一些付费定制化的组件出现。如若是没有采购预算的情况下,Element 的全开源性质和文档清爽度会更有优势一些。

  3. iView 的向下兼容性会差一点。

1.3.6 关于移动端 UI 框架选型的思考:为何在 Vant 和 Cube 中选了 Vant?

前端技术框架在选定 Vue 的情况下,在移动端框架选型上也走了一些弯路。在 2019 年刚进XX的时候做完新员工项目之后开始做票据移动端,当时选用的框架是 cube-ui。后面在做XXX移动端的时候基本已经敲定室内统一使用 Vant 了。

选用 Vant 而不选用 cube-ui 的原因:

  1. 从 GitHub 上看,Vant 18k Star,cube-ui 8.8k Star。Vant 的用户群更大。

  2. Vant 属于有赞自己开发的开源 UI 框架,cube-ui 属于滴滴自己开发的开源 UI 框架,cube-ui 官网经常打不开,更新活跃度在逐渐下降。Vant 的社区更加活跃一些。

  3. Vant 样式设计风格更加通用,cube 设计风格统一黄灰色比较明显的滴滴风。

1.3.7 互联网公司和金融科技公司在开发流程上的区别
  • 互联网公司:产品经理+交互设计+UI设计 -> 前端开发+后端开发 ->测试

  • 金融科技公司:业务 -> 开发 -> 测试

1.4 工作方式:当需求方在开发周期内临时改动需求时怎么办?

  • 首先是对改动点的评估,前端人员初步进行评估,假设是“改动按钮颜色”之类的小改动,可以直接更改但是要做好需求登记。

  • 其次当改动点较大时,举个例子假如是“新增加一个金融推广活动页面”,前端后端测试共同评估是否对开发周期造成影响,若是超过开发周期太大的时间可以跟需求方提出将改动放到下个迭代;若是需求改动要求比较急,在请示上级领导评估之后,可以加急改动。

1.5 vue2 双向绑定原理

双向绑定是什么?

首先明确一下双向绑定和响应式的概念,双向绑定是双向的,表示数据改变驱动视图改变,视图反过来也可以改变数据。响应式是单向的,只代表数据改变驱动视图改变,响应式的主要原理是数据劫持观察者模式,是 Vue 最核心的模块。

Vue 双向绑定和 React 单向绑定

其中 Vue 和 React 的区别之一就是:Vue 是双向绑定;React 是单向绑定,因为 React 视图的改变需要手动执行 this.$setState() 来改变数据

1.6 Vue2 数据劫持的原理

数据劫持核心是 defineReactive 函数,里面主要使用 Object.defineProperty 来对对象访问器 getter 和 setter 进行劫持。数据变更时 set 函数里面可以通知视图更新。

在使用 Object.defineProperty 进行数据劫持的时候,对象和数组是分开处理的:对象是遍历对象属性之后进行递归劫持;数组是重写数组的原型方法比如 splice。这个我看了一些源码和资料。Object.defineProperty 本身是可以监控到数组下标的变化的,但尤大在 github issue 回复过从性能/体验的性价比考虑弃用了这种对数组的劫持方案。举例子就是对象属性通常比较少对每一个属性劫持不会消耗太多性能,但数组可能有成千上万个元素,如果每一个元素都劫持,无疑消耗过多性能。

1.7 Vue2 数据劫持的缺陷

第一个缺陷是由于 Vue2 数据劫持底层是用 ES5 的 Object.defineProperty 实现的,所以不兼容 IE8 以下。

第二个缺陷是 Vue2 数据劫持无法检测数组和对象的变化,只会劫持一开始存在 data 选项里面的数据,这就是官网建议我们把可能要使用的数据一开始声明在 data 里面并提供初始值。对象新增属性可以通过 Vue.$set() 进行数据劫持,数组新增元素也可以通过 Vue.$set(),或者因为数组原型方法已经被重写了可以用 splice、push、unshift 等方法新增元素。

1.8 Vue3 数据劫持的优势

Vue3 数据劫持底层主要是使用 ES6 的 Proxy 实现。

Proxy 的优势如下:

  • Proxy 可以直接监听对象(const proxy = new Proxy(target, handler));defineProperty 需要遍历对象属性进行监听。

  • Proxy 可以直接监听对象新增的属性;defineProperty 只能劫持一开始就存在的属性,新增属性需要手动 Observer。

  • Proxy 可以直接监听数组的变化;defineProperty 无法监听数组的变化。

  • Proxy 有多达 13 种拦截方法:不限于 getsethasdeletePropertyapplyownKeysconstruct 等等;除开 getset 其他都是 defineProperty 不具备的。

  • Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的;defineProperty 只能遍历对象属性直接修改;

Proxy 的劣势如下:

  • ES6 的 Proxy 的存在浏览器兼容性问题。

Proxy 和 Reflect 结合实现 Vue3 底层数据劫持原理。Reflect 设计的目的是为了优化 Object 的一些操作方法以及合理的返回 Object 操作返回的结果,对于一些命令式的 Object 行为,Reflect 对象可以将其变为函数式的行为。比如 ('name' in obj) = Reflect.has(obj, 'name')

1.9 Vue3 有什么新特性

Vue2.x 的组织代码形式,叫 Options API,而 Vue3 最大的特点是 Composition API 中文名是合成函数以函数为载体,将业务相关的逻辑代码抽取到一起,整体打包对外提供相应能力。可以理解它是我们组织代码,解决逻辑复用的一种方案。

其中 setupComposition API 的入口函数,是在 beforeCreate 声明周期函数之前执行的。还提供了 ref 函数定义一个响应式的数据,reactive 函数定义多个数据的响应式等等。

1.10 面试官建议

  1. 简历上项目的深度分析,回答的时候要有逻辑条理和准备。

  2. 工作上的沉淀和积累可以在掘金平台以文章的形式输出。

二面 (45min)


2.1 假设团队内从 Vue 转为 React,你认为要做什么准备?

  1. 从团队角度上考虑:主要是做好技术培训、技术分享、建立可参考性的模版工程。

  2. 从个人角度上考虑:从技术细节、底层原理上对 vue 和 react 进行对比。然后在现有的工程上面结合技术和业务进行学习,快速成长。

总结一下

面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。

还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。

万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。

为了帮助大家更好更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。

前端面试题汇总

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
.cn/img_convert/621960a57eb42479e02d6d64c0c81891.png)

前端面试题汇总

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-ezoLpbrq-1713100949693)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值