前端面试官: React我就问这些问题!能不能刷到我就看你的造化了(2)

  • react利用key来识别组件,它是一种身份标识标识,相同的key react认为是同一个组件,这样后续相同的key对应组件都不会被创建

  • 有了key属性后,就可以与组件建立了一种对应关系,react根据key来决定是销毁重新创建组件还是更新组件。

  • key相同,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。

  • key值不同,则react先销毁该组件(有状态组件的componentWillUnmount会执行),然后重新创建该组件(有状态组件的constructor和componentWillUnmount都会执行)

2.调用 setState 之后发生了什么?

  • 在代码中调用 setState 函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程。

  • 经过调和过程,React会以相对高效的方式根据新的状态构建React元素树并且着手重新渲染整个 UI 界面。

  • 在 React 得到元素树之后,React 会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染

  • 在差异计算算法中,React 能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。

3.触发多次setstate,那么render会执行几次?

  • 多次setState会合并为一次render,因为setState并不会立即改变state的值,而是将其放到一个任务队列里,最终将多个setState合并,一次性更新页面。

  • 所以我们可以在代码里多次调用setState,每次只需要关注当前修改的字段即可。

[补充] react中如何对state中的数据进行修改?setState为什么是一个异步的?

  • 修改数据通过this.setState(参数1,参数2)

  • this.setState是一个异步函数

  • 参数1 : 是需要修改的数据是一个对象

  • 参数2 : 是一个回调函数,可以用来验证数据是否修改成功,同时可以获取到数据更新后的DOM结构等同于componentDidMount

  • this.setState中的第一个参数除了可以写成一个对象以外,还可以写成一个函数 ,函数中第一个值为prevState 第二个值为prePprops this.setState((prevState,prop)=>({}))

为什么建议传递给 setState的参数是一个callback而不是一个对象?
  • 因为this.props 和this.state的更新可能是异步的,不能依赖它们的值去计算下一个state
为什么setState是一个异步的?(请看3)
  • 当批量执行state的时候可以让DOM渲染的更快,也就是说多个setstate在执行的过程中还需要被合并

4.this.setState之后react做了哪些操作?

  • shouldComponentUpdate

  • componentWillUpdate

  • render

  • componentDidUpdate

5.简述一下virtual DOM (虚拟dom)如何工作?(4 & 5 取一回答)

  • 当数据发生变化,比如setState时,会引起组件重新渲染,整个UI都会以virtual dom的形式重新渲染

  • 然后收集差异也就是diff新的virtual dom和老的virtual dom的差异

  • 最后把差异队列里的差异,比如增加节点、删除节点、移动节点更新到真实的DOM上

5.为什么虚拟 dom 会提高性能?

  • 虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom 操作,从而提高性能。

  • 用 JavaScript 对象结构表示 DOM 树的结构

  • 然后用这个树构建一个真正的 DOM 树,插到文档当中当状态变更的时候,重新构造一棵新的对象树。

  • 然后用新的树和旧的树进行比较,记录两棵树差异把 2 所记录的差异应用到步骤 1 所构建的真正的 DOM 树上,视图就更新了。

6.react diff 原理

  • 把树形结构按照层级分解,只比较同级元素。

  • 给列表结构的每个单元添加唯一的 key 属性,方便比较。

  • React 只会匹配相同class的component(这里面的class指的是组件的名字)

  • 合并操作,调用 component 的 setState 方法的时候, React 将其标记为 dirty.到每一个事件循环结束, React检查所有标记 dirty 的 component 重新绘制.

  • 选择性子树渲染。开发人员可以重写 shouldComponentUpdate 提高 diff 的性能。

7.React 中 refs 的作用是什么?(详细版本)

  • Refs 是 React 提供给我们的安全访问DOM元素或者某个组件实例的句柄。

  • 是父组件用来获取子组件的dom元素的

  • 我们可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回

class CustomForm extends Component {

handleSubmit = () => {

console.log("Input Value: ", this.input.value)

}

render () {

return (

<input

type=‘text’

ref={(input) => this.input = input} />

Submit

)

}

}

  • 上述代码中的 input 域包含了一个 ref 属性,该属性声明的回调函数会接收 input 对应的 DOM 元素,我们将其绑定到 this 指针以便在其他的类函数中使用。

  • 另外值得一提的是,refs 并不是类组件的专属,函数式组件同样能够利用闭包暂存其值

function CustomForm ({handleSubmit}) {

let inputElement

return (

<input

type=‘text’

ref={(input) => inputElement = input} />

Submit

)

}

[详细易懂版本(推荐)]

1. ref设置为普通字符串

  • 元素定义ref属性,后续可以通过 this.refs.myBtn 来获取这个真实DOM对象

  • 组件定义ref属性,后续可以通过 this.refs.myBtn 来获取这个组件的实例对象

2. ref设置为箭头函数

  • 元素定义ref属性,后续可以通过 this.myBtn 来获取这个真实DOM对象

  • 组件定义ref属性,后续可以通过 this.myBtn 来获取这个组件的实例对象

8.React 中有哪些构建组件的方式?

有什么区别?

  • 函数组件看似只是一个返回值是DOM结构的函数,其实它的背后是无状态组件的思想。

  • 函数组件中,你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑

  • 函数组件中没有this

  • 函数组件更容易理解。当你看到一个函数组件时,你就知道它的功能只是接收属性,渲染页面,它不执行与UI无关的逻辑处理,它只是一个纯函数。而不用在意它返回的DOM结构有多复杂。

9.事件处理函数的this指向问题

[补充] 事件处理函数如何传递参数?

  • 可以使用 bind 传递参数

  • 将事件处理函数交给箭头函数,然后在箭头函数里面调用我自己开始想要调用的那个方法,这时我已经是个普通函数了。

[注意!!!]

  • 如果一个事件处理函数传递了额外的参数,那么事件对象会摸摸的放置在最后一个里面

2.十万个为什么篇


1.为什么列表循环渲染的key最好不要用index?

  • 举例说明

变化前数组的值是[1,2,3,4],key就是对应的下标:0,1,2,3 变化后数组的值是[4,3,2,1],key对应的下标也是:0,1,2,3

  • 那么diff算法在变化前的数组找到key =0的值是1,在变化后数组里找到的key=0的值是4

  • 因为子元素不一样就重新删除并更新

  • 但是如果加了唯一的key,如下:

变化前数组的值是[1,2,3,4],key就是对应的下标:id0,id1,id2,id3

变化后数组的值是[4,3,2,1],key对应的下标也是:id3,id2,id1,id0

  • 那么diff算法在变化前的数组找到key =id0的值是1,在变化后数组里找到的key=id0的值也是1

  • 因为子元素相同,就不删除并更新,只做移动操作,这就提升了性能

2.什么是状态提升?

3.什么是高阶组件?

4.什么是受控组件和非受控组件?

5.什么是纯函数?

6.什么是上下文Context?

7.react中的Portal是什么?

8.react16的错误边界(Error Boundaries)是什么?

除了React之外,我整理的这份《前端校招面试真题解析大全》还包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

文章中所列主要为大纲部分,详细内容可以在文末自行获取哈!

HTML


  • HTML5新特性,语义化

  • 浏览器的标准模式和怪异模式

  • xhtml和html的区别

  • 使用data-的好处

  • meta标签

  • canvas

  • HTML废弃的标签

  • IE6 bug,和一些定位写法

  • css js放置位置和原因

  • 什么是渐进式渲染

  • html模板语言

  • meta viewport原理

CSS


  • 盒模型,box-sizing

  • CSS3新特性,伪类,伪元素,锚伪类

  • CSS实现隐藏页面的方式

  • 如何实现水平居中和垂直居中。

  • 说说position,display

  • 请解释*{box-sizing:border-box;}的作用,并说明使用它的好处

  • 浮动元素引起的问题和解决办法?绝对定位和相对定位,元素浮动后的display值

  • link和@import引入css的区别

  • 解释一下css3的flexbox,以及适用场景

  • inline和inline-block的区别

  • 哪些是块级元素那些是行级元素,各有什么特点

  • grid布局

  • table布局的作用

  • 实现两栏布局有哪些方法?

  • css dpi

  • 你知道attribute和property的区别么

  • css布局问题?css实现三列布局怎么做?如果中间是自适应又怎么做?

  • 流式布局如何实现,响应式布局如何实现

  • 移动端布局方案

  • 实现三栏布局(圣杯布局,双飞翼布局,flex布局)

  • 清除浮动的原理

  • overflow:hidden有什么缺点?

  • padding百分比是相对于父级宽度还是自身的宽度

  • css3动画,transition和animation的区别,animation的属性,加速度,重力的模拟实现

  • CSS 3 如何实现旋转图片(transform: rotate)

  • sass less

  • 对移动端开发了解多少?(响应式设计、Zepto;@media、viewport、JavaScript 正则表达式判断平台。)

  • 什么是bfc,如何创建bfc?解决什么问题?

  • CSS中的长度单位(px,pt,rem,em,ex,vw,vh,vh,vmin,vmax)

  • CSS 选择器的优先级是怎样的?

  • 雪碧图

  • svg

  • 媒体查询的原理是什么?

  • CSS 的加载是异步的吗?表现在什么地方?

  • 常遇到的浏览器兼容性问题有哪些?常用的hack的技巧

  • 外边距合并

  • 解释一下“::before”和“:after”中的双冒号和单冒号的区别

JS


  • js的基本类型有哪些?引用类型有哪些?null和undefined的区别。

  • 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)

  • Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?

  • JS常见的dom操作api

  • 解释一下事件冒泡和事件捕获

  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?

  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?

  • this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?

  • call,apply,bind

  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链

  • 创建对象的多种方式

  • 实现继承的多种方式和优缺点

  • new 一个对象具体做了什么

  • 手写Ajax,XMLHttpRequest

  • 变量提升

  • 举例说明一个匿名函数的典型用例

  • 指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?

  • attribute和property的区别

  • document load和document DOMContentLoaded两个事件的区别

  • === 和 == , [] === [], undefined === undefined,[] == [], undefined == undefined

  • typeof能够得到哪些值

  • 什么是“use strict”,好处和坏处

  • 函数的作用域是什么?js 的作用域有几种?

  • JS如何实现重载和多态

  • 常用的数组api,字符串api

  • 原生事件绑定(跨浏览器),dom0和dom2的区别?

  • 给定一个元素获取它相对于视图窗口的坐标

  • 如何实现图片滚动懒加载

  • js 的字符串类型有哪些方法? 正则表达式的函数怎么使用?

  • 深拷贝

  • 编写一个通用的事件监听函数

  • web端cookie的设置和获取

  • setTimeout和promise的执行顺序

  • JavaScript 的事件流模型都有什么?

  • navigator对象,location和history

  • js的垃圾回收机制

  • 内存泄漏的原因和场景

  • DOM事件的绑定的几种方式

  • DOM事件中target和currentTarget的区别

  • typeof 和 instanceof 区别,instanceof原理

  • js动画和css3动画比较

  • JavaScript 倒计时(setTimeout)

  • js处理异常

  • js的设计模式知道那些

  • 轮播图的实现,以及轮播图组件开发,轮播10000张图片过程

  • websocket的工作原理和机制。

  • 手指点击可以触控的屏幕时,是什么事件?

  • 什么是函数柯里化?以及说一下JS的API有哪些应用到了函数柯里化的实现?(函数柯里化一些了解,以及在* 函数式编程的应用,最后说了一下JS中bind函数和数组的reduce方法用到了函数柯里化。)

  • JS代码调试

框架


  • 使用过哪些框架?

  • zepto 和 jquery 是什么关系,有什么联系么?

  • jquery源码如何实现选择器的,为什么$取得的对象要设计成数组的形式,这样设计的目的是什么

  • jquery如何绑定事件,有几种类型和区别

  • 什么是MVVM,MVC,MVP

  • Vue和Angular的双向数据绑定原理

  • Vue,Angular组件间通信以及路由原理

  • react和vue的生命周期

  • react和vue的虚拟dom以及diff算法

  • vue的observer,watcher,compile

  • react和angular分别用在什么样的业务吗?性能方面和MVC层面上的区别

  • jQuery对象和JS的Element有什么区别

  • jQuery对象是怎么实现的

  • jQuery除了它封装了一些方法外,还有什么值得我们去学习和使用的?

  • jQuery的$(‘xxx’)做了什么事情

  • 介绍一下bootstrap的栅格系统是如何实现的

浏览器相关


  • 跨域,为什么JS会对跨域做出限制

  • 前端安全:xss,csrf…

  • 浏览器怎么加载页面的?script脚本阻塞有什么解决方法?defer和async的区别?

  • 浏览器强缓存和协商缓存

  • 浏览器的全局变量有哪些

  • 浏览器同一时间能够从一个域名下载多少资源

  • 按需加载,不同页面的元素判断标准

  • web存储、cookies、localstroge等的使用和区别

  • 浏览器的内核

  • 如何实现缓存机制?(从200缓存,到cache到etag再到)

  • 说一下200和304的理解和区别

  • 什么是预加载、懒加载

  • 一个 XMLHttpRequest 实例有多少种状态?
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取

前端面试题宝典

前端校招面试题详解

帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-Bhcn4Fk8-1713730221980)]

[外链图片转存中…(img-m0tIQKz3-1713730221980)]

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

[外链图片转存中…(img-X7O9IgDC-1713730221981)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-47yZWp3i-1713730221981)]

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取

[外链图片转存中…(img-WsLzPpYP-1713730221981)]

[外链图片转存中…(img-t51bALqp-1713730221982)]

[外链图片转存中…(img-GMW5os2j-1713730221982)]

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一个前端开发者,我认为自己具备良好的前端技术。我熟悉HTML、CSS、JavaScript等基础技术,并且掌握了常用的前端框架和工具,如React、Vue、Webpack等。我对前端开发的趋势和新技术保持着持续的学习和关注,以便更好地适应市场的需求。同时,我也注重代码的可维护性和可扩展性,采用模块化的开发方式来提高代码的复用性和可读性。总的来说,我相信我具备良好的前端技术能力,并且能够胜任相关的工作。 ### 回答2: 如果面试我:“你觉得你前端技术怎么样?” 我会这样回答: 首先,我对我的前端技术非常自信。我有坚实的HTML、CSS和JavaScript基础,并且对前端开发的各种技术和工具都有一定的了解和应用经验。 我注重学习和保持对最新前端技术的敏感性,积极关注业界的发展趋势和新兴技术。我经常阅读相关的博客、文章和书籍,不断提升自己的技术水平。 我还熟悉常用的前端框架,例如React和Vue,能够灵活地运用它们来构建用户友好的界面和交互体验。 在项目开发中,我能够编写结构清晰、可维护和可扩展的代码。我了解前端性能优化的重要性,注重页面加载速度和响应性能方面的优化。 我对团队合作非常热衷,能够与设计师和后端开发人员紧密合作,高效地完成项目。我也有良好的沟通技巧,能够与非技术背景的人员进行有效的沟通。 虽然我的前端技术已经达到了一定的水平,但我相信学习永无止境。我会不断学习新的技术和提升自己的技能,以满足日益变化的前端行业需求。 总结起来,我认为我的前端技术扎实且有潜力,我准备在工作中充分发挥我的技术能力,与团队共同努力,创造出优秀的产品和用户体验。 ### 回答3: 面试:你觉得你前端技术怎么样。 回答:非常感谢您的提。我对自己的前端技术有一定的自信。在过去的工作经验中,我参与并负责了多个前端项目的开发,积累了一定的技术经验和实践经验。我熟悉HTML5、CSS3、JavaScript前端技术,并能熟练运用各类前端框架和工具,如Vue.jsReact等。 我注重用户体验和界面设计,擅长将设计稿转化为高质量的页面代码,并能够根据产品需求进行页面优化和响应式开发。同时,我对前端性能优化也有一定的了解,能够通过优化网页加载速度和资源的使用来提升用户访体验。 我还具备良好的团队合作能力和沟通能力。在团队中,我能够与设计师、后端工程师和产品经理紧密配合,理解并满足他们的需求。我也积极参加技术交流活动,不断学习新知识和掌握新技术,以保持对行业的敏感度和追求卓越的态度。 当然,前端技术是一个不断发展和涵盖多个领域的领域,我还有继续提升的空间。我会持续关注前端技术的最新动态,并愿意学习和应用新的技术来解决实际问题。我相信,通过我的努力和坚持,我能够在前端领域取得更好的成长和发展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值