《 前端面试必备:JavaScript 高级灵魂拷问,你能答对几道?(含详细解析)》

目录

1.原型与原型链

2.什么是闭包,有哪些缺点

3.内存溢出与内存泄露

4.递归函数及特性

5.对象的创建

6、跨域

9、axios请求方式

10、线程和进程+例子

11.同步与异步(微任务、宏任务)

12、对象的继承

13、深浅拷贝区别

14、如何实现深拷贝

15、节流和防抖的目的

16、什么是防抖,什么是节流

17、防抖节流应用场景

18、什么是懒加载?

19、懒加载的优点是什么?

20、什么是预加载

21、为什么要用预加载


1.原型与原型链

原型:

①所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
②所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
③所有引用类型的__proto__属性指向它构造函数的prototype

原型链:

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。这样一层一层向上查找就会形成一个链式结构,我们称为原型链。

2.什么是闭包,有哪些缺点

一个函数(子函数)访问另一个函数(父函数)中的变量,外部函数调用,此时就有闭包产生,那么这个变量所在的函数我们就称之为闭包函数。

优点:延伸了变量的生命周期,可以让外部操作函数内部的变量

缺点:变量生命周期长,可能会产生内存泄漏

如何解决:用完之后手动释放,或者尽量少用闭包

3.内存溢出与内存泄露

内存溢出:一种程序运行出现的错误,当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误

内存泄露:占用的内存没有及时释放,内存泄露积累多了就容易导致内存溢出

常见的内存泄露:

1、意外的全局变量

2、没有及时清理的事件回调函数

3、闭包

4、没有及时清理的定时器 setTimeout,setInterval

5、大量循环打印控制台日志

4.递归函数及特性

函数自已调用自已,它的行为非常类似循环

特性:

(1)重复执行

(2)调用自身

(3)【必须】要有条件控制,避免死循环,如果递归函数没有条件控制,那么他就是死循环

5.对象的创建

1、Object构造函数模式

2、对象字面量模式

3、工厂模式

4、自定义构造函数模式

5、构造函数+原型的组合模式

6、class创建

6、跨域

同源: 协议、域名、端口号 必须完全相同。

违背同源策略就是跨域。

如何解决跨域:

JSONP 、cors、搭建代理服务器

9、axios请求方式

get请求、post请求、put请求、patch请求、delete请求

10、线程和进程+例子

线程是程序执行的基本单位,它们共享进程的资源,但可以独立调度。

进程是操作系统资源分配的基本单位,各个进程之间相互独立。

线程和进程各有适用场景,线程适用于需要并发处理和共享资源的任务,而进程适用于需要隔离和独立运行的任务。

进程:CPU 进行资源分配的基本单位

线程:CPU 调度的最小单位

通俗一点讲:进程可以描述为一个应用程序的执行程序,线程则是进程内部用来执行某个部分的程序。

做个简单的比喻:进程=火车,线程=车厢

例子: 视频播放器

多线程: 一个视频播放器程序通常是一个进程,在这个进程中,可能有多个线程来执行不同的任务。

例如,一个线程负责读取视频文件,一个线程负责解码视频数据,另一个线程负责音视频同步和播放。这些线程协同工作,共同完成播放任务。

11.同步与异步(微任务、宏任务)

同步代码(微任务)是按照顺序执行的,每一行代码都必须等待上一行代码执行完成后才能执行。这种执行方式是阻塞的,即代码执行时会阻止后续代码的执行,直到当前代码执行完成。

异步代码(宏任务)不会阻塞后续代码的执行,而是在后台执行,当异步操作完成后会执行相应的回调函数。

常见的异步操作包括网络请求、定时器、事件监听等。在JavaScript中,异步操作可以通过回调函数、Promise、async/await等方式来处理,以确保代码的顺序性和可读性。异步操作常用于处理I/O密集型任务,以避免阻塞主线程。

12、对象的继承

原型链继承、

原型链+构造函数的组合继承、

Class 可以通过extends,super关键字实现继承

13、深浅拷贝区别

深浅拷贝主要区别在复杂数据类型,对于基本数据类型,没有区别,改变拷贝的数据,都不会改变原数据

浅拷贝(shallow copy):

浅拷贝只拷贝引用(地址值),当拷贝的新对象发生改变时,原对象也会发生相同的改变,也就是说,浅拷贝会影响原来的元素

深拷贝(deep copy):

每一级的数据都会拷贝 ,拷贝后,两个对象拥有不同的地址,当拷贝出来的对象发生改变时,原对象内容不会改变,两者互不影响

14、如何实现深拷贝

Object.assign()

JSON.parse(JSON.stringify())

手写递归方法

通过jQuery的extend方法实现深拷贝

lodash函数库实现深拷贝

15、节流和防抖的目的

都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,防止在短时间内频繁触发同一事件而出现延迟,假死或卡顿的现象

16、什么是防抖,什么是节流

防抖:如果不断在delay之前重新触发,那么定时器会不断重新计时,最终会在最后一次完后才执行

节流:目前有一事件A设置了定时器,那么在delay之前触发,都只会触发一次

17、防抖节流应用场景

防抖:

表单元素的校验,如手机号,邮箱,用户名等,部分搜索功能的模糊查询结果实现

搜索框搜素输入

文本编辑器实时保存

节流:

高频事件,例如快速点击、鼠标滑动、resize事件、scroll事件

下拉加载

视频播放记录时间等

 

 

18、什么是懒加载?

懒加载也就是延迟加载。当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),

只有当图片出现在浏览器的可视区域内时,才设置图片真正的路径,让图片显示出来。这就是图片懒加载。

19、懒加载的优点是什么?

页面加载速度快、可以减轻服务器的压力、节约了流量,用户体验好

20、什么是预加载

资源预加载是另一个性能优化技术,我们可以使用该技术来预先告知浏览器某些资源可能在将来会被使用到。 预加载简单来说就是将所有所需的资源提前请求加载到本地,这样后面在需要用到时就直接从缓存取资源。

21、为什么要用预加载

在网页全部加载之前,对一些主要内容进行加载,以提供给用户更好的体验,减少等待的时间。 否则,如果一个页面的内容过于庞大,没有使用预加载技术的页面就会长时间的展现为一片空白,直到所有内容加载完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值