2023前端常见面试题大全

1. 什么是作用域?

变量 产生作用的区域就叫做作用域

2. 作用域的分类

全局作用域

局部作用域

3.局部作用域的分类

函数作用域

块级作用域

4.作用域链

作用域链的本质是变量查找机制

5.作用域链查找规则是什么?

a. 会优先查找自己的作用域

b. 自己的作用域查找不到的话会往上查找父级直到全局作用域

6.什么是垃圾回收机制

JS 中一种自动回收或释放内存的机制 简称 GC

7.垃圾回收机制有几种算法?

引用计数法:IE采用的引用计数算法, 定义“内存不再使用”的标准很简单,就是看一个对象是否有指向它的引用

如果这个值的被引用了一次,那么就记录次数1 , 如果减少一个引用就减1。 如果引用次数是0 ,则释放内存。但它却存在一个致命的问题:嵌套引用

标记清除法:就是从根部(在JS中就是全局对象)出发定时扫描内存中的对象。 凡是能从根部到达的对象,都是还需要使用的。

无法由根部出发触及到的对象被标记为不再使用,稍后进 行回收

8.什么是闭包?

就是有权访问另一个函数作用域中变量的函数

9.闭包的表现形式?

在一个函数内部创建另外一个函数

10.闭包有什么作用?

封闭数据,实现数据私有,防止数据被意外修改

11.闭包的弊端

容易导致内存泄露

12.什么是变量提升?

使用 var 声明的变量,会被提升到函数或全局作用域的顶部,这个现象叫做变量提升。

13.用哪个关键词会产生变量提升?

var会存在变量提升,let/const 声明的变量不存在变量提升

14.什么是构造函数

是一种特殊的函数,主要用来初始化对象 ,同时可以用构造函数来快速创建多个类似的对象。

15.构造函数创建对象的过程

  1. 创建新对象
  2. 构造函数this指向新对象
  3. 执行构造函数代码,修改this,添加新的属性
  4. 返回新对象

16.伪数组转真数组的方法

1.Array.from

2.Array.prototype.slice.call( )

3…展开运算符

17.什么是JavaScript 中的包装类型

JavaScript 中,基本类型是没有属性和方法的,但是为了便于操作基本类型的值,在调用基本类型的属性或方法时 JavaScript 会在后台地将基本类型的值转换为对象,这些对象就是包装类型

18. JavaScript有哪些数据类型,它们的区别?

JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt

其中 SymbolBigInt 是 ES6 中新增的数据类型

Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。

BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

这些数据可以分为原始数据类型和引用数据类型:

栈:原始数据类型(Undefined、Null、Boolean、Number、String、Symbol 、BigInt

堆:引用数据类型(对象、数组和函数)

19.isNaN 和 Number.isNaN 函数的区别

重点在于判断 是不是NaN,而不是 数字

  1. 函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。
  2. 函数 Number.isNaN 只会判断 传入的数据 是不是 一个 NaN,并且不会帮你做类型转换。

20.对原型、原型链的理解

原型,也叫原型对象,构造函数的一个属性,名字是 prototype,它本身也是一个对象类型。在构造函数的原型所添加的成员可以被实例所共享。

原型链,指的基于原型继承的那些对象中,它们是通过 原型 prototype 将彼此联系在一起的,这个关系就叫做原型链。

21.原型链-查找规则

① 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。
② 如果没有就查找它的原型(也就是 proto 指向的 prototype 原型对象)
③ 如果还没有就查找原型对象的原型(Object的原型对象)
④ 依此类推一直找到 Object 为止(null)
proto 对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线

22.什么是递归

函数内部自己调用自己, 这个函数就是递归函数,往往都需要添加终止递归的条件。

23.什么是深拷贝 什么是浅拷贝

  1. 浅拷贝只是针对引用类型数据中的属性做了一层复制,如果被拷贝的属性也是引用类型,那么这个属性只是复制了这个引用地址。

    做了浅拷贝的对象之间可能会相互影响

  2. 深拷贝是针对引用类型数据中的属性做无限层级的复制,不管属性是值类型还是引用类型,会完整复制一份。 其在堆内存中完全开辟了一块内存地址,并将原有的对象完全复制过来存放

    做了深拷贝的两个对象之间相互不会影响

  3. 除了 递归克隆对象、JSON.stringify 两种方式做的拷贝,其他方法全部都是浅拷贝

24.call、apply、bind的区别

  1. 他们三都可以修改 this 指向,
  2. call、apply 在修改 this 指向的同时也会调用原函数、bind 只会返回修改 this 指向后的函数
  3. callapply 接收参数的方式不一样,call 类似普通函数一样接收参数、apply 接收的参数必须都放在一个数组内。

25.什么是防抖和节流

  1. 所谓节流,就是在连续触发的行为中控制它在 n 秒中只执行一次 可以用在 轮播图点击效果 、 鼠标移动、页面尺寸缩放 resize、滚动条滚动 等场景
  2. 所谓防抖,在单位时间内,某个动作只能执行一次,如果在单位时间内多次触发,那么只有最后一次有效,可以用在 搜索框 业务中

二、Ajax面试题

26.HTTP 状态码

成功(2XX)

状态码 原因短语 说明
200 OK 表示从客户端发来的请求在服务器端被正确处理
201 Created 请求已经被实现,⽽且有⼀个新的资源已经依据请求的需要⽽建⽴
通常是在POST请求,或是某些PUT请求之后创建了内容, 进行的返回的响应
202 Accepted 请求服务器已接受,但是尚未处理,不保证完成请求
适合异步任务或者说需要处理时间比较长的请求,避免HTTP连接一直占用
204 No content 表示请求成功,但响应报⽂不含实体的主体部分
206 Partial Content 进⾏的是范围请求, 表示服务器已经成功处理了部分 GET 请求
响应头中会包含获取的内容范围 (常用于分段下载)

重定向(3XX)

状态码 原因短语 说明
301 Moved Permanently 永久性重定向,表示资源已被分配了新的 URL
比如,我们访问 http/www.baidu.com 会跳转到 https/www.baidu.com
302 Move Temporarily 临时性重定向,表示资源临时被分配了新的 URL, 支持搜索引擎优化
首页, 个人中心, 遇到了需要登录才能操作的内容, 重定向 到 登录页
303 See Other 对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
304 Not Modified 自从上次请求后,请求的网页内容未修改过。
服务器返回此响应时,不会返回网页内容。(协商缓存)
307 Temporary Redirect 对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
不对请求做额外处理, 正常发送请求, 请求location中的url地址

客户端错误(4XX)

状态码 原因短语 说明
400 Bad Request 请求报⽂存在语法错误((传参格式不正确)
401 UnAuthorized 权限认证未通过(没有权限)
403 Forbidden 表示对请求资源的访问被服务器拒绝
404 Not Found 表示在服务器上没有找到请求的资源
408 Request Timeout 客户端请求超时
409 Confict 请求的资源可能引起冲突

服务端错误(5XX)

状态码 原因短语 说明
500 Internal Sever Error 表示服务器端在执⾏请求时发⽣了错误
501 Not Implemented 请求超出服务器能⼒范围,例如服务器不⽀持当前请求所需要的某个功能,
或者请求是服务器不⽀持的某个⽅法
503 Service Unavailable 表明服务器暂时处于超负载或正在停机维护,⽆法处理请求
505 Http Version Not Supported 服务器不⽀持,或者拒绝⽀持在请求中使⽤的 HTTP 版本

27. DOM - 事件流与事件委托

2.1 事件流

事件流:又称为事件传播,是页面中接收事件的顺序。DOM2级事件规定的事件流包括了3个阶段:

  • 事件捕获阶段(capture phase)
  • 处于⽬标阶段(target phase)
  • 事件冒泡阶段(bubbling phase)

2023前端常见面试题大全_第1张图片

事件捕获(Event Capturing)

事件开始由较为不具体的节点接收后,然后开始逐级向下传播到最具体的元素上。

事件捕获的最大作用在于:事件在到达预定⽬标之前就可以捕获到它。

如果仍以上面那段 HTML 代码为例,当点击按钮后,在事件捕获的过程中,document 对象会首先接收到这个 click 事件,然后再沿着 DOM 树依次向下,直到

你可能感兴趣的:(前端,开发语言,ecmascript,javascript,es6)