2025年Web前端最新前端面试八股文,零基础入门到精通,收藏这篇就够了

文末

技术是没有终点的,也是学不完的,最重要的是活着、不秃。

零基础入门的时候看书还是看视频,我觉得成年人,何必做选择题呢,两个都要。喜欢看书就看书,喜欢看视频就看视频。

最重要的是在自学的过程中,一定不要眼高手低,要实战,把学到的技术投入到项目当中,解决问题,之后进一步锤炼自己的技术。

自学最怕的就是缺乏自驱力,一定要自律,杜绝“三天打鱼两天晒网”,到最后白忙活一场。

高度自律的同时,要保持耐心,不抛弃不放弃,切勿自怨自艾,每天给自己一点点鼓励,学习的劲头就会很足,不容易犯困。

技术学到手后,找工作的时候一定要好好准备一份简历,不要无头苍蝇一样去海投简历,容易“竹篮打水一场空”。好好的准备一下简历,毕竟是找工作的敲门砖。

拿到面试邀请后,在面试的过程中一定要大大方方,尽力把自己学到的知识舒适地表达出来,不要因为是自学就不够自信,给面试官一个好的印象,面试成功的几率就会大很多,加油吧,骚年!

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

+ [9. CSS样式文件引入的方式有哪些? link和@import的区别是?](#9_CSS_linkimport_87)
+ [10.display属性有什么作用?它有哪些值?](#10display_95)
+ [11. 介绍一下页面元素定位中的绝对定位、相对定位、流动定位、浮动定位,并阐述他们的区别](#11__101)
+ [12.谈谈你见过的浏览器不兼容问题?如何使用IETest?](#12IETest_111)
+ [13.display:none和visibility:hidden的区别是](#13displaynonevisibilityhidden_123)
+ [14.html5有哪些新特性,如何处理html5对低版本的兼容问题](#14html5html5_128)

  • Javascript 篇
    • 1.浏览器加载文件(repaint/reflow)
      • 2.cookie、localstorage和sessionStorage的区别
      • 3.浏览器本地存储与服务器端存储之间的区别
      • 4. src和href的区别?
      • 5. bind函数的兼容性
      • 6. 解释下事件代理
      • 7.解释下js中this是怎么工作的?
      • 8.什么是闭包? 闭包有什么作用?
      • 9. 什么是伪数组?
      • 10.undefined和null的区别, 还有undeclared:
      • 11. 简述事件冒泡机制。
      • 12.解释下为什么接下来这段代码不是 IIFE(立即调用的函数表达式):function foo(){ }();?
      • 13. 请指出 document load 和 document ready 两个事件的区别。
      • 15.浏览器端的js包括哪几个部分?
      • 16.DOM包括哪些对象?
        • 16.1 常用的DOM方法:
          • 16.2 常用的DOM属性
      • 17. js有哪些数据类型?
      • 18.基本类型与引用类型有什么区别?
      • 19. 关于js的垃圾回收
      • 20.动画有哪些实现方法?
      • 21.浅拷贝
      • 22.深拷贝
      • 23. 说一下原型链
      • 24. new 操作符具体做了什么?
      • 25.script 标签里的 async 和 defer 有什么区别?
      • 26. setTimeout 最小执行时间是多少?
      • 27. promise 的内部原理是什么?它的优缺点是什么?
      • 28.promise 和 async await 的区别是什么?
      • 29.浏览器的存储方式有哪些?
      • 30.token 存在 sessionstorage 还是 loaclstorage?
      • 31. token 的登录流程。
      • 32.页面渲染的过程是怎样的?
      • 33.DOM 树和渲染树有什么区别?
      • 34.精灵图和 base64 的区别是什么?
      • 35.svg 格式了解多少?
      • 36.HTTP 协议规定的协议头和请求头有什么?
      • 37.说一下什么是“同源策略”?
      • 38.防抖和节流是什么?
      • 39.有没有做过无感登录?
      • 40.大文件上传是怎么做的?
  • Vue篇
    • 1. 生命周期
        • 1.1 有哪些生命周期
          • 1.2首次进入页面或者组件,会执行哪些生命周期
          • 1.3在哪个阶段产生 e l , el, eldata
          • 1.4 第n(n>1)次进入组件会执行哪些生命周期
      • 2.对keep-alive的理解
      • 3.v-if 和 v-show的区别
      • 4.v-if 和v-for优先级
      • 5.ref是什么
      • 6.nextTick是什么
      • 7.scoped 原理
      • 8.CSS样式穿透
      • 9.组件的传值
      • 10.computed,methods,watch有什么区别
      • 11.props 和data 优先级比较
      • 12.Vue设置代理
      • 13. Vue打包路径和路由模式
      • 14.代理和环境变量
      • 15.Vue路由
      • 16.SPA及SPA的缺点
      • 17.如何理解 MVVM 的?
      • 18.v-for 中的 key 值的作用是什么?
      • 19.VUE路径传值
      • 20.vue 中遍历全局的方法有哪些?
      • 21. vue 的过滤器怎么使用?
      • 22.如何封装一个组件?
      • 23.封装一个可复用的组件,需要满足什么条件?
      • 24.路由导航守卫有哪些
      • 25.Vue动态路由
  • Vuex相关
    • 1.Vuex 有哪些属性
      • 2.Vuex的简单使用
        • modules 的使用
      • 3. Vuex中的mutations和actions的区别
      • 4. Vuex是单向还是双向数据流
      • 5. Vuex如何做持久化存储

CSS篇

1.说一下 CSS 的盒模型

在 HTML 页面中的所有元素都可以看成是一个盒子
盒子的组成:内容 content、内边距 padding、边框 border、外边距 margin

盒模型的类型:

标准盒模型
margin + border + padding + content
IE 盒模型
margin + content(border + padding)

控制盒模型的模式:box-sizing:content-box(默认值,标准盒模型)、border-box(IE
盒模型);


2.CSS 选择器的优先级?
  1. CSS 的特性:继承性、层叠性、优先级
  2. 优先级:当同一个元素同时有多个样式可以对其进行作用时,按优先级最高的来。优先级低的可以覆盖优先级高的没写过的样式,其并非不生效
  3. 标签、类/伪类/属性、全局选择器、行内样式、id、!important

!important > 行内样式 > id > 类/伪类/属性 > 标签 > 全局选择器


3.隐藏元素的方法有哪些?
  1. display:none;
    元素在页面上消失,不占据空间
  2. opacity:0;
    设置了元素的透明度为 0,元素不可见,占据空间位置
  3. visibility:hidden;
    让元素消失,占据空间位置,一种不可见的状态
  4. position:absolute;
    使用绝对定位将元素定位到可视区域外,因为其已经脱离文档流,不影响其他dom布局和窗口布局
  5. clip-path
    裁切图片,可以将图片裁切得啥也不剩。

4.px 和 rem 的区别是什么?
  1. px 是像素,显示器上给我们呈现画面的像素,每个像素的大小是一样,绝对单位
    长度
  2. rem是相对单位,相对于 html 根节点的 font-size 的值,给 html节点的添加属性font-size:62.5%;时,
    1rem = 10px; (16px*62.5%=10px)

5.重绘重排有什么区别?
  1. 重排(回流):布局引擎会根据所有的样式计算出盒模型在页面上的位置和大小
  2. 重绘:计算好盒模型的位置、大小和其他一些属性之后,浏览器就会根据每个盒模型的特性进行绘制
  3. 浏览器的渲染机制
    对 DOM 的大小、位置进行修改后,浏览器需要重新计算元素的这些几何属性,就叫重排
    对 DOM 的样式进行修改,比如 color 和 background-color,浏览器不需要重新计算几何属性的时候,直接绘制了该元素的新样式,那么这里就只触发了重绘

6.让一个元素水平垂直居中的方式有哪些?
  1. 定位+margin
  2. 定位+transform
  3. flex 布局
  4. grid 布局
  5. table 布局
  6. display:fixed

7.CSS 的哪些属性哪些可以继承?哪些不可以继承?

CSS 的三大特性:继承、层叠、优先级
子元素可以继承父类元素的样式

  1. 字体的一些属性:font
  2. 文本的一些属性:line-height
  3. 元素的可见性:visibility:hidden
  4. 表格布局的属性:border-spacing
  5. 列表的属性:list-style
  6. 页面样式属性:page
  7. 声音的样式属性

8.有没有用过预处理器?

预处理语言增加了变量、函数、混入等强大的功能
SASS LESS


9. CSS样式文件引入的方式有哪些? link和@import的区别是?

link连接方式和import导入方式,两者区别如下:

  1. link链接时,不用写
  2. 一般而言,链接的效率要高于导入(因为导入样式表相当于是将所有的样式规则原样复制到当前源文件中,增加了代码量,从而影响了加载的速度)

10.display属性有什么作用?它有哪些值?
  1. display:none 隐藏标签元素
  2. display:inline 在同一行显示
  3. display:block 以块状方式独占一行显示

11. 介绍一下页面元素定位中的绝对定位、相对定位、流动定位、浮动定位,并阐述他们的区别
  1. 流动定位:
    保持在标准文档流中原有的位置,元素是按从左往右,从上往下的顺序摆放, left,top等属性无效
  2. 相对定位:
    相对定位是指相对于盒子元素原有的位置进行偏移,不会脱离标准文档流,也不对其他元素产生任何影响。需设定垂直方向和水平向的偏移量,分别是left、top、right、bottom。
  3. 绝对定位:
    绝对定位是以某一个点为基准进行偏移。绝对定位是以最近的一个已定位的父级元素为基准,如果父级元素没有定位或没有父级元素,则以浏览器窗口为基准;会脱离标准文档流,不影响同一级的盒子元素位置。
  4. 浮动定位:只能设置水平方向上的定位,指内容停靠在容器的左边还是右边。垂直方向上不能设浮动定位。

12.谈谈你见过的浏览器不兼容问题?如何使用IETest?
  1. 以火狐代表的浏览器不支持如下用法:
    (1)document.all
    (2)unload事件
    (3)innerText属性
  2. 很多版本的浏览器不支持clear:both来清除浮动
  3. 各浏览器默认的margin和padding不同。解决方法: *{margin:0;padding:0;}
  4. 对盒子的解析标准不同

IETest安装之后,即可以使用,可用来检查当前代码在不同浏览器版本中的兼容性


13.display:none和visibility:hidden的区别是
  1. display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素;
  2. 使用visibility:hidden比display:none性能上要好,display:none切换显示时visibility,页面产生回流(当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流。所有页面第一次加载时需要产生一次回流),而visibility切换是否显示时则不会引起回流。
  3. visibility:hidden和opacity:0 有类似效果
14.html5有哪些新特性,如何处理html5对低版本的兼容问题

新特性:

  1. 拖拽释放(Drag and drop) API
  2. 语义化更好的内容标签(header,nav,footer,aside,article,section)
  3. 音频、视频API(audio,video)
  4. 画布(Canvas) API
  5. 地理(Geolocation) API
  6. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
  7. sessionStorage 的数据在浏览器关闭后自动删除
  8. 表单控件,calendar、date、time、email、url、search
  9. 新的技术webworker, websocket, Geolocation

Javascript 篇


1.浏览器加载文件(repaint/reflow)

浏览器加载页面上引用的CSS、JS文件、图片时,是按顺序从上到下加载的,每个浏览器可以同时下载文件的个数不同,因此经常有网站将静态文件放在不同的域名下,这样可以加快网站打开的速度。

  1. reflow
    在加载JS文件时,浏览器会阻止页面的渲染,因此将js放在页面底部比较好。因为如果JS文件中有修改DOM的地方,浏览器会倒回去把已经渲染过的元素重新渲染一遍,这个回退的过程叫reflow。
    CSS文件虽然不影响js文件的加载,但是却会造成js执行的阻塞。因为js代码执行前,浏览器必须保证css文件已下载和解析完成。
    办法:当js文件不需要依赖css文件时,可以将js文件放在头部css的前面。
  2. repaint
    repaint(重绘)和reflow相似,但是在元素改变样式的时候触发,这个比reflow造成的影响要小,所以能触发repaint解决的时候就不要触发reflow。

2.cookie、localstorage和sessionStorage的区别

一、存储的时间有效期不同

  1. cookie的有效期是可以设置的,默认的情况下是关闭浏览器后失效
  2. sessionStorage的有效期是仅保持在当前页面,关闭当前会话页或者浏览器后就会失效
  3. localStorage的有效期是在不进行手动删除的情况下是一直有效

二、存储的大小不同

  1. cookie的存储是5kb左右,存储量较小,一般页面最多存储20条左右信息
  2. localStorage和sessionStorage的存储容量是5Mb(官方介绍,可能和浏览器有部分差异性)

三、与服务端的通信

  1. cookie会参与到与服务端的通信中,一般会携带在http请求的头部中,例如一些关键密匙验证等。
  2. localStorage和sessionStorage是单纯的前端存储,不参与与服务端的通信

四、读写操作程度

  1. cookie操作繁琐 localStorage和sessionStorage 更简单些

3.浏览器本地存储与服务器端存储之间的区别
  1. 服务器端保存数据占用服务器端的资源,而浏览器端保存则把不同用户需要的数据分布保存在用户各自的浏览器中。
  2. 浏览器端一般只用来存储小数据,而服务器则可以存储大数据。
  3. 服务器存储数据安全性高,浏览器只适合存储对安全不敏感的一般数

4. src和href的区别?
  1. src指向外部资源的位置, 用于替换当前元素, 比如js脚本, 图片等元素
  2. href指向网络资源所在的位置, 用于在当前文档和引用资源间确定联系, 比如加载css

5. bind函数的兼容性

用法:
bind()函数会创建一个新函数, 为绑定函数。当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.
一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。


6. 解释下事件代理

事件代理又称之为事件委托。是JavaScript中绑定事件的常用技巧,“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown…)委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡


7.解释下js中this是怎么工作的?

this 在 JavaScript 中主要有以下五种使用场景。

  1. 作为函数调用,this 绑定全局对象,浏览器环境全局对象为 window 。
  2. 内部函数的 this 也绑定全局对象,应该绑定到其外层函数对应的对象上,这是 JavaScript的缺陷,用that替换。
  3. 作为构造函数使用,this 绑定到新创建的对象。
  4. 作为对象方法使用,this 绑定到该对象。
  5. 使用apply或call调用 this 将会被显式设置为函数调用的第一个参数

8.什么是闭包? 闭包有什么作用?

闭包是指有权访问另一个函数作用域中的变量的函数. 创建闭包常见方式,就是在一个函数内部创建另一个函数.
作用:

  1. 匿名自执行函数 (function (){ … })(); 创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。
  2. 缓存, 可保留函数内部的值
  3. 实现封装
  4. 实现模板

9. 什么是伪数组?
  1. 具有length属性
  2. 按索引方式存储数据
  3. 不具有数组的方法
  4. 伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法

我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象: 返回新数组而不会修改原数组
Array.prototype.slice.call(“abc”) ==> [‘a’,‘b’,‘c’]


10.undefined和null的区别, 还有undeclared:
  1. null表示没有对象, 即此处不该有此值. 典型用法:
    (1) 作为函数的参数,表示该函数的参数不是对象。
    (2) 作为对象原型链的终点。
    (3)null可以作为空指针,只要意在保存对象的值还没真正保存对象,就应该明确地让该对象保存null值.
  2. undefined表示缺少值, 即此处应该有值, 但还未定义.
    (1)变量被声明了,但没有赋值时,就等于undefined。
    (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
    (3)对象没有赋值的属性,该属性的值为undefined。
    (4)函数没有返回值时,默认返回undefined。
  3. undeclared即为被污染的命名, 访问没有被声明的变量, 则会抛出异常, 终止执行. 即undeclared是一种语法错误

11. 简述事件冒泡机制。

从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。


12.解释下为什么接下来这段代码不是 IIFE(立即调用的函数表达式):function foo(){ }();?

以function关键字开头的语句会被解析为函数声明,而函数声明是不允许直接运行的。
只有当解析器把这句话解析为函数表达式,才能够直接运行

(function foo(){
    // code..
})()



13. 请指出 document load 和 document ready 两个事件的区别。
  1. 执行时间不同
    eady,表示文档结构已经加载完成(不包含图片等非文字媒体文件)
    onload,指示页面包含图片等文件在内的所有元素都加载完成
  2. 可以被执行的次数不同
    ready()可以在JavaScript代码中出现多次
    load()只能在JavaScript代码中出现一次
  3. 执行的效率不同
    如要在dom的元素节点中添加onclick属性节点,这时用 ( d o c u m e n t ) . r e a d y ( ) 就要比用 (document).ready()就要比用 (document).ready()就要比用(window).load()的效率高

15.浏览器端的js包括哪几个部分?

核心( ECMAScript) , 文档对象模型(DOM), 浏览器对象模型(BOM)


16.DOM包括哪些对象?

DOM是针对HTML和XML文档的一个API(应用程序编程接口). DOM描绘了一个层次化的节点树, 允许开发人员添加, 移除和修改页面的某一部分.

  1. Document对象
  2. Node对象
  3. NodeList对象
  4. Element对象
  5. attribute对象
16.1 常用的DOM方法:
  1. getElementById(id)
  2. getElementsByTagName()
  3. appendChild(node)
  4. removeChild(node)
  5. replaceChild()
  6. insertChild()
  7. createElement()
  8. createTextNode()
  9. getAttribute()
  10. setAttribute()
16.2 常用的DOM属性
  1. innerHTML 节点(元素)的文本值
  2. parentNode 节点(元素)的父节点
  3. childNodes
  4. attributes 节点(元素)的属性节点

17. js有哪些数据类型?

原始数据类型:

  1. number
  2. bigint
  3. boolean
  4. symbol
  5. string
  6. undefined
  7. null

引用数据类型:
Math,Date,Array…


18.基本类型与引用类型有什么区别?
  1. 存储
    1.1 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存
    1.2 引用类型的值是对象, 保存在堆内存中. 包含引用类型的变量实际上包含的并不是对象本身, 而是一个指向改对象的指针
    1.3 但是对象的变量名是保存在栈内存中,而变量名的值则是引用子堆内存
  2. 复制
    2.1 从一个变量向另一个变量复制基本类型的值, 会创建这个值的一个副本
    2.2 从一个变量向另一个变量复制引用类型的值, 复制的其实是指针, 因此两个变量最终都指向同一个对象
  3. 检测类型
    3.1 确定一个值是哪种基本类型可以用typeof操作符
    3.2 确定一个值是哪种引用类型可以使用instanceof操作符

19. 关于js的垃圾回收

js是一门具有自动垃圾回收机制的编程语言,开发人员不必关心内存分配和回收问题

  1. 离开作用域的值将被自动标记为可以回收, 因此将在垃圾收集期间被删除
  2. **“标记清除”**是目前主流的垃圾收集算法, 这种算法的思路是给当前不使用的值加上标记, 然后再回收其内存
  3. 另一种垃圾收集算法是**“引用计数”,** 这种算法的思想是跟踪记录所有值被引用的次数. js引擎目前都不再使用这种算法, 但在IE中访问非原生JS对象(如DOM元素)时, 这种算法仍然可能会导致问题
  4. 当代码中存在循环引用现象时, “引用计数” 算法就会导致问题
  5. 解除变量的引用不仅有助于消除循环引用现象, 而且对垃圾收集也有好处. 为了确保有效地回收内存, 应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用

20.动画有哪些实现方法?
  1. Js
    setTimeout、setInterval、requestAnimationFrame
    requestAnimationFrame方法是h5提供的一种专门解决动画更新的API,浏览器会自动以最合适的频率去刷新动画
    jQuery中动画也比较实用
  2. css
    animation
  3. canvas元素结合JS
  4. 插件
    例如 jQuery

21.浅拷贝

浅拷贝对原对象或副本的更改可能也会导致其他对象的更改。它实际上只拷贝了一层,并且只当数组和对象包的值是原始值时才会进行拷贝

  1. 赋值运算符 =
	let a=[1,2,3]
	let b=a;
	console.log(b==a)//true


  1. 扩展运算符 …
	let a=[1,2,3]
	let b=[...a]//把数组a的内容 挨个取出 放到b数组中
	console.log(b===a) //true


  1. slice方法
	let a=[1,2,3]
	let b=a.slice()
	console.log(a===b) //false 
	a[0]=4;
	console.log(a)//4 2 3
	console.log(b) //1 2 3


  1. assign方法
let a=[1,2,3]
let b=[]
Object.assign(b,a);
a[0]=4
console.log(a)//4 2 3
console.log(b) //1 2 3


  1. Array.from
let a=[1,2,3]
let b=Array.from(a)
a[0]=4
console.log(a)//4 2 3
console.log(b) //1 2 3



22.深拷贝

Javascript对象和数组如果深度嵌套,浅拷贝只能实现第一层的拷贝,但是深度的值依然和原对象共享引用。

let a=[ [1],[2], [3]]
let b=[...a] //浅拷贝

a[0][0]= 4
console.log(a) // [[4],[2],[3]]
consle.log(b) // [[4],[2],[3]] 对象b也被改变了 这时浅拷贝的弊端体现出来了



  1. 使用JSON
let a=[ [1],[2], [3]]
let b=JSON.parse(JSON.stringfy(a));
a[0][0]=4;
console.log(a) // [ [4],[2], [3]]
console.log(b) // [ [1],[2], [3]]


  1. structuredClone
let a=[ [1],[2], [3]]
let b=structuredClone(a);
a[0][0]=4;
console.log(a) // [ [4],[2], [3]]
console.log(b) // [ [1],[2], [3]]


  1. 第三方库 lodasg、rfdc
  2. 自定义函数实现
const deepCopy=(obj)=>{
	if(typeof obj !=='object' || obj == null){
		return obj;
	}
	const newObj= Array.isArray(obj) ? []:{};
	Object.keys(obj).forEach((key)=>{
		newObj[key]=deepCopy(obj[key]);
	})
	return newObj;
}


上述代码只能处理对象和数组的深度拷贝

注意理解深拷贝和浅拷贝的区别


23. 说一下原型链

原型就是一个普通对象,它是为构造函数的实例共享属性和方法;所有实例中引用
的原型都是同一个对象
使用 prototype 可以把方法挂在原型上,内存值保存一份
__proto__可以理解为指针,实例对象中的属性,指向了构造函数的原型(prototype)


24. new 操作符具体做了什么?
  1. 先创建一个空对象
  2. 把空对象和构造函数通过原型链进行链接
  3. 把构造函数的 this 绑定到新的空对象身上
  4. 根据构建函数返回的类型判断,如果是值类型,则返回对象,如果是引用类型,
    就要返回这个引用类型

25.script 标签里的 async 和 defer 有什么区别?

当没有 async 和 defer 这两个属性的时候,浏览器会立刻加载并执行指定的脚本

  1. 有 async
    加载和渲染后面元素的过程将和 script 的加载和执行并行进行(异步)
  2. 有 defer
    加载和渲染后面元素的过程将和 script 的加载并行进行(异步),但是它的执行事件要等
    所有元素解析完成之后才会执行

26. setTimeout 最小执行时间是多少?

HTML5 规定的内容:
setTimeout 最小执行时间是 4ms
setInterval 最小执行时间是 10ms


27. promise 的内部原理是什么?它的优缺点是什么?

Promise 对象,封装了一个异步操作并且还可以获取成功或失败的结果
Promise 主要就是解决回调地狱的问题,之前如果异步任务比较多,同时他们之间
有相互依赖的关系,就只能使用回调函数处理,这样就容易形成回调地狱,代码的可读性差,可维护性也很差

有三种状态:pending 初始状态 fulfilled 成功状态 rejected 失败状态

状态改变只会有两种情况,
pending -> fulfilled; pending -> rejected 一旦发生,状态就会凝固,不会再变

首先就是我们无法取消 promise,一旦创建它就会立即执行,不能中途取消
如果不设置回调,promise 内部抛出的错误就无法反馈到外面
若当前处于 pending 状态时,无法得知目前在哪个阶段。

原理:

构造一个 Promise 实例,实例需要传递函数的参数,这个函数有两个形参,分
别都是函数类型,一个是 resolve 一个是 reject
promise上还有then方法,这个方法就是来指定状态改变时的确定操作,resolve
是执行第一个函数,reject 是执行第二个函数


28.promise 和 async await 的区别是什么?
  1. 都是处理异步请求的方式
  2. promise 是 ES6,async await 是 ES7 的语法
  3. async await 是基于 promise 实现的,他和 promise 都是非阻塞性的
    优缺点:
  4. promise 是返回对象我们要用 then,catch 方法去处理和捕获异常,并且书写方式
    是链式,容易造成代码重叠,不好维护,async await 是通过 tra catch 进行捕获异常
  5. async await 最大的优点就是能让代码看起来像同步一样,只要遇到 await 就会立
    刻返回结果,然后再执行后面的操作
    promise.then()的方式返回,会出现请求还没返回,就执行了后面的操作

29.浏览器的存储方式有哪些?
  1. cookies
    H5 标准前的本地存储方式
    兼容性好,请求头自带 cookie
    存储量小,资源浪费,使用麻烦(封装)
  2. localstorage
    H5 加入的以键值对为标准的方式
    操作方便,永久存储,兼容性较好
    保存值的类型被限定,浏览器在隐私模式下不可读取,不能被爬虫
  3. sessionstorage
    当前页面关闭后就会立刻清理,会话级别的存储方式
  4. indexedDB
    H5 标准的存储方式,,他是以键值对进行存储,可以快速读取,适合 WEB 场
30.token 存在 sessionstorage 还是 loaclstorage?

token:验证身份的令牌,一般就是用户通过账号密码登录后,服务端把这些凭证
通过加密等一系列操作后得到的字符串

  1. 存 loaclstorage 里,后期每次请求接口都需要把它当作一个字段传给后台
  2. 存 cookie 中,会自动发送,缺点就是不能跨域
  3. 如果存在 localstorage 中,容易被 XSS 攻击,但是如果做好了对应的措施,那么是
    利大于弊
  4. 如果存在 cookie 中会有 CSRF 攻击

31. token 的登录流程。
  1. 客户端用账号密码请求登录
  2. 服务端收到请求后,需要去验证账号密码
  3. 验证成功之后,服务端会签发一个 token,把这个 token 发送给客户端
  4. 客户端收到 token 后保存起来,可以放在 cookie 也可以是 localstorage
  5. 客户端每次向服务端发送请求资源的时候,都需要携带这个 token
  6. 服务端收到请求,接着去验证客户端里的 token,验证成功才会返回客户端请求
    的数据

32.页面渲染的过程是怎样的?
  1. DNS 解析
  2. 建立 TCP 连接
  3. 发送 HTTP 请求
  4. 服务器处理请求
  5. 渲染页面
    5.1 浏览器会获取 HTML 和 CSS 的资源,然后把 HTML 解析成 DOM 树
    5.2 再把 CSS 解析成 CSSOM
    5.3 把 DOM 和 CSSOM 合并为渲染树
    5.4 布局
    5.5 把渲染树的每个节点渲染到屏幕上(绘制)
  6. 断开 TCP 连接

33.DOM 树和渲染树有什么区别?
  1. DOM 树是和 HTML 标签一一对应的,包括 head 和隐藏元素
  2. 渲染树是不包含 head 和隐藏元素

34.精灵图和 base64 的区别是什么?
  1. 精灵图:把多张小图整合到一张大图上,利用定位的一些属性把小图显示在页面上,
    当访问页面可以减少请求,提高加载速度
  2. base64:传输 8Bit 字节代码的编码方式,把原本二进制形式转为 64 个字符的单位,
    最后组成字符串
    base64 是会和 html css 一起下载到浏览器中,减少请求,减少跨域问题,但是一些
    低版本不支持,若 base64 体积比原图片大,不利于 css 的加载。

35.svg 格式了解多少?

基于 XML 语法格式的图像格式,可缩放矢量图,其他图像是基于像素的,SVG 是
属于对图像形状的描述,本质是文本文件,体积小,并且不管放大多少倍都不会失真

  1. SVG 可直接插入页面中,成为 DOM 一部分,然后用 JS 或 CSS 进行操作
    <svg></svg>
  2. SVG 可作为文件被引入
    <img src="pic.svg" />
  3. SVG 可以转为 base64 引入页面

36.HTTP 协议规定的协议头和请求头有什么?
  1. 请求头信息:
    Accept:浏览器告诉服务器所支持的数据类型
    Host:浏览器告诉服务器我想访问服务器的哪台主机
    Referer:浏览器告诉服务器我是从哪里来的(防盗链)
    User-Agent:浏览器类型、版本信息
    Date:浏览器告诉服务器我是什么时候访问的
    Connection:连接方式
    Cookie
    X-Request-With:请求方式
  2. 响应头信息:
    Location:这个就是告诉浏览器你要去找谁
    Server:告诉浏览器服务器的类型
    Content-Type:告诉浏览器返回的数据类型
    Refresh:控制了的定时刷新

37.说一下什么是“同源策略”?

http:// www. aaa.com:8080/index/vue.js
协议 子域名 主域名 端口号 资源
同源策略是浏览器的核心,如果没有这个策略就会遭受网络攻击
主要指的就是协议+域名+端口号三者一致,若其中一个不一样则不是同源,会产生
跨域
三个允许跨域加载资源的标签:img link script
跨域是可以发送请求,后端也会正常返回结果,只不过这个结果被浏览器拦截了!

  1. JSONP
  2. CORS
  3. websocket
  4. 反向代理

38.防抖和节流是什么?

都是应对页面中频繁触发事件的优化方案

  1. 防抖:避免事件重复触发
    使用场景:1.频繁和服务端交互 2.输入框的自动保存事件
  2. 节流:把频繁触发的事件减少,每隔一段时间执行
    使用场景:scroll 事件

39.有没有做过无感登录?
  1. 在相应其中拦截,判断 token 返回过期后,调用刷新 token 的接口
  2. 后端返回过期时间,前端判断 token 的过期时间,去调用刷新 token 的接口
  3. 写定时器,定时刷新 token 接口
    流程:
  4. 登录成功后保存 token 和 refresh_token
  5. 在响应拦截器中对 401 状态码引入刷新 token 的 api 方法调用
  6. 替换保存本地新的 token
  7. 把错误对象里的 token 替换
  8. 再次发送未完成的请求
  9. 如果 refresh_token 过期了,判断是否过期,过期了就清楚所有 token 重新登

40.大文件上传是怎么做的?
  1. 分片上传:
    1.1把需要上传的文件按照一定的规则,分割成相同大小的数据块
    1.2 初始化一个分片上传任务,返回本次分片上传的唯一标识
    1.3 按照一定的规则把各个数据块上传
    1.4 发送完成后,服务端会判断数据上传的完整性,如果完整,那么就会把数据库合并成原始文件
  2. 断点续传:
    服务端返回,从哪里开始 浏览器自己处理

Vue篇


1. 生命周期
1.1 有哪些生命周期

系统自带:

  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted
  5. beforeUpdate
  6. updated
  7. beforeDestroy
  8. destroyed

如果给组件加上keep-alive,会额外多

  1. activated
  2. deactivated

1.2首次进入页面或者组件,会执行哪些生命周期
  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted

若组件添加keep-alive属性

  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted
  5. acitivated

1.3在哪个阶段产生 e l , el, el,data
  1. $el (根节点dom) 产生阶段 : mounted
  2. $data产生阶段:created

1.4 第n(n>1)次进入组件会执行哪些生命周期

普通组件

  1. beforeCreate
  2. created
  3. beforeMount
  4. mounted

组件【添加keep-alive属性】

  1. activated
  2. 若离开,则执行deactivated

2.对keep-alive的理解
  1. 是什么
    Vue自带的一个组件
    功能:用来缓存组件的 【提升性能】
  2. 使用场景【尽量减少发送网络请求与后端交互+反复访问的组件减少其创建次数】
    缓存详情页【组件】->在详情页的activated方法中判断之前刷新的参数与当前接收的参数是否一致,如果一致就不刷新数据,否则就发送网络请求刷新数据

3.v-if 和 v-show的区别
  1. dom元素的加载区别

v-if 是创建了一个dom节点 如果值为true时 值为false时不创建或者移除该节点
v-show 是直接创建 display:none 隐藏了

  1. 使用场景不同
  1. 初次加载v-if比v-show好 页面不会多加载dom盒子
  2. 频繁切换 v-show比v-if好 创建和删除开销太大,显示和隐藏开销小
  3. 如果都是值为true,首次加载v-if比v-show快,相同的节点v-show会多加一个display:none=的css属性

4.v-if 和v-for优先级

v-forv-if 优先级更高 vue.js源码中可以看到 v-for 的分支在v-if之前

  1. 如果同一个组件 既加了v-for 也加了 v-if 那么速度会下降许多,是先执行v-for渲染列表数据,然后再每个子项都进行v-if判断,增大开销。
  2. 如果需要判断v-if成立,再执行v-for渲染子项,那么可以使用template模板
<template v-if="condition">
	<div v-for="item in list"></div>
</template>



5.ref是什么
  1. 作用: 用来快速获取dom的,而不用document.getElement*()
  2. 使用示例:
<img ref="imgref"  src="\*\*"  id= "img" >


原生js:
document.getElementById("img")
vue:
this.$refs.imgs


6.nextTick是什么
  1. 作用:获取更新后的dom内容
    例如:
    <div ref="box" @click="change">{{content}}</div>
...
data(){
	return {
		content:"old"
	}
}
methods:{
	change(){
		this.str="new";
		console.log(this.$refs.box.innerText);//输出old ref中的dom数据未来得及更新
		this.$nextTick(()=>{
			console.log(this.$refs.box.innerText);//输出new


### 文末

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。



个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

![](https://img-blog.csdnimg.cn/img_convert/3e0d5b0f6a97b823cc1ef22ff1a18191.png)



第二阶段:移动端开发技术

![](https://img-blog.csdnimg.cn/img_convert/fc21db0a800494796dc6408ce1486031.png)

第三阶段:前端常用框架

![](https://img-blog.csdnimg.cn/img_convert/644efd4ddd0f8d43535f1982ec0da6e4.png)



**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.youkuaiyun.com/topics/618166371)**

*   推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;

*   大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。




2025开年,AI技术打得火热,正在改变前端人的职业命运:

阿里云核心业务全部接入Agent体系;

字节跳动30%前端岗位要求大模型开发能力;

腾讯、京东、百度开放招聘技术岗,80%与AI相关……

大模型正在重构技术开发范式,传统CRUD开发模式正在被AI原生应用取代!

最残忍的是,业务面临转型,领导要求用RAG优化知识库检索,你不会;带AI团队,微调大模型要准备多少数据,你不懂;想转型大模型应用开发工程师等相关岗,没项目实操经验……这不是技术焦虑,而是职业生存危机!

曾经React、Vue等热门的开发框架,已不再是就业的金钥匙。如果认为会调用API就是懂大模型、能进行二次开发,那就大错特错了。制造、医疗、金融等各行业都在加速AI应用落地,未来企业更看重能用AI大模型技术重构业务流的技术人。

如今技术圈降薪裁员频频爆发,传统岗位大批缩水,相反AI相关技术岗疯狂扩招,薪资逆势上涨150%,大厂老板们甚至开出70-100W年薪,挖掘AI大模型人才!

在这里插入图片描述

不出1年 “有AI项目开发经验”或将成为前端人投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!

大模型目前在人工智能领域可以说正处于一种“炙手可热”的状态,吸引了很多人的关注和兴趣,也有很多新人小白想要学习入门大模型,那么,如何入门大模型呢?

下面给大家分享一份2025最新版的大模型学习路线,帮助新人小白更系统、更快速的学习大模型!

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

### 常见问题及答案 #### 对SPA单页面的理解及优缺点 SPA(单页面应用)是指整个应用程序只有一个HTML页面,所有的内容都通过异步加载或动态生成的方式在这个页面中进行展示。SPA通常基于前端框架(如Vue.js、React等)来实现,通过前端路由来控制页面的展示和切换,从而实现快速、流畅的用户体验。 优点:用户体验好,页面切换迅速;前后端分离,开发效率高;可维护性强。缺点:首屏加载时间长;不利于SEO。[^1] #### 对渲染引擎的理解 渲染引擎负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。[^3] #### JavaScript相关问题 1. **对js的理解**:JavaScript 是一种轻量级的、解释型的编程语言,广泛用于网页开发,可实现网页的交互效果、动态内容展示等。 2. **请说出以下代码输出的值**:由于未给出具体代码,无法给出答案。 3. **把以下代码,改写成依次输出0 - 9**:由于未给出具体代码,以下是一个简单示例: ```javascript for (let i = 0; i < 10; i++) { setTimeout(() => { console.log(i); }, i * 1000); } ``` 4. **如何区分数组对象,普通对象,函数对象**: - 数组对象可以使用 `Array.isArray()` 方法判断。 - 普通对象可以使用 `typeof` 结合 `instanceof` 判断,`typeof obj === 'object' && obj instanceof Object` 且不是数组对象和函数对象。 - 函数对象可以使用 `typeof` 判断,`typeof func === 'function'`。 5. **面向对象、面向过程**:面向过程是一种以过程为中心的编程思想,将问题分解为一个个步骤,按顺序执行;面向对象是一种以对象为中心的编程思想,将数据和操作数据的方法封装在对象中。 6. **面向对象的三大基本特性**:封装、继承、多态。 7. **XML和JSON的区别**:XML 是一种标记语言,用于存储和传输数据,有严格的标签结构;JSON 是一种轻量级的数据交换格式,语法简洁,更适合用于数据传输。 8. **Web Worker 和webSocket**:Web Worker 允许在浏览器中创建后台线程,执行耗时的脚本而不影响主线程;WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,用于实现服务器和客户端的实时通信。 9. **Javascript垃圾回收方法**:常见的有标记清除和标记整理。 10. **new操作符具体干了什么呢**:创建一个新对象;将新对象的原型指向构造函数的原型;执行构造函数,并将 `this` 指向新对象;如果构造函数返回一个对象,则返回该对象,否则返回新创建的对象。 11. **js延迟加载的方式有哪些**:使用 `defer` 和 `async` 属性;动态创建 `script` 标签;使用懒加载库。 12. **WEB应用从服务器主动推送Data到客户端有那些方式**:长轮询、服务器发送事件(SSE)、WebSocket 等。 [^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值