JS面试真题 part5

news2025/1/16 5:15:18

JS面试真题 part5

  • 21、说说对事件循环的理解
  • 22、JavaScript本地存储方式有哪些?区别及应用场景?
  • 23、大文件上传如何断点续传?
  • 24、ajax原理是什么?如何实现?
  • 25、什么是防抖和节流?有什么区别?如何实现

21、说说对事件循环的理解

自己回答:

js是单线程运行机制,事件分为同步事件和异步事件,就涉及到了运行时机的问题。同步任务执行完之后,会轮询异步事件队列,检查异步事件队列里是否有待执行任务。异步事件任务队列又分为宏任务队列和微任务队列,当微任务队列没有事件时,才去执行宏任务队列。源码里是没有宏任务这个概念,宏任务是一个口头概念

标准回答:

首先,JavaScript是一门单线程的语言,意味着同一时间内只能做一件事,但这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环
JavaScript中,所有的任务都可以分为 同步任务和异步任务
同步任务和异步任务的运行流程图如下:
在这里插入图片描述
同步任务进入主线程,异步任务进入任务队列,主线程内的任务执行完毕,就会去任务队列读取对应的任务,推入主线程执行。上述过程的不断重复就是事件循环。
异步任务分为宏任务和微任务

常见的宏任务有:

  • script
  • setTimeout/setInterval
  • UI rendering/UI事件
  • postMessage、MessageChannel
  • setImmediate、I/O(Node.js)

常见的微任务有:

  • Promise.then
  • MutaionObserver
  • process.nextTick(Node.js)

事件循环、宏任务、微任务的关系如图所示:
在这里插入图片描述
流程分析:

	async function async1() {
		 console.log('async1 start')
		 await async2()
		 console.log('async1 end')
	}
	async function async2() {
	 	console.log('async2')
	}
	console.log('script start')
	setTimeout(function () {
		 console.log('settimeout')
	})
	async1()
	new Promise(function (resolve) {
		 console.log('promise1')
		 resolve()
	}).then(function () {
		 console.log('promise2')
	})
	console.log('script end')

分析:
1、遇见console.log('script start'),打印,输出script start
2、遇见定时器,加入宏任务列表
3、执行函数async1,输出async1 startasync2,后面的 console.log('async1 end')加入微任务
4、执行promise1,.then加入微任务列表
5、执行script end
6、执行微任务列表,输出async1 endpromise2
7、执行宏任务,打印settimeout

22、JavaScript本地存储方式有哪些?区别及应用场景?

自己回答:
JavaScript本地存储方式:localS、indexDB、cookie
localS:内存少(5M?),存一些关键信息
indexDB:离线缓存方案,内存大,类似前端数据库
cookie:浏览器缓存,4kb,存一些token

标准回答:

主要讲四种

  • cookie
  • sessionStorage
  • localStorage
  • indexedDB

cookie:网站为了辨别用户身份而储存在用户本地终端上的数据,为了解决HTTP无状态导致的问题。一般不超过4kb,它由一个名称(Name)、一个值(Value)和其他几个用于控制cookie有效期、安全性、使用范围的可选属性组成。cookie在每次请求中都会被发送,如果不使用https对其加密,其保存的信息很容易被窃取,导致安全风险。
localStorage:h5新方法,IE8及以上浏览器都兼容

特点:

  • 生命周期:持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的
  • 存储的信息在同一域中是共享的
  • 大小:5M(与浏览器有关系)
  • localStorage 本质上是对字符串的读取,如果存储内容多的话,会消耗内存空间,导致页面变卡。
  • 受同源策略的限制

sessionStoragesessionStoragelocalStorage使用方法基本一致,唯一不同的是生命周期,一旦页面(会话)关闭,sessionStorage将会删除数据

indexedDB:一个本地数据库,存储更大量的结构化数据。
优点:储存量理论上没有上限;所有操作是异步的,比localStorage同步操作性能更高,尤其是数据量较大时;原生支持储存JS的对象;是正经的数据库,数据库能干都能干
缺点:操作非常繁琐;有一定门槛

区别:
关于 cookie、sessionStorage、localStorage三者的区别主要如下:

  • 存储大小:cookie数据大小不能超过4ksessionStoragelocalStorage虽然也有存储大小的限制,但是比cookie大得多,可以达到5M或更大
  • 有效时间:localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据。sessionStorage数据在当前浏览器窗口关闭后自动删除。cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
  • 数据与服务器之间的交互方式,cookie的数据会自动的传递到服务器,服务器也可以写cookie到客户端;sessionStoragelocalStorage不会自动把数据发给服务器,仅在本地保存

应用场景

  • 标记用户与跟踪用户行为的情况,推荐使用cookie
  • 适合长期保存在本地的数据(令牌),推荐使用localStorage
  • 敏感账号一次性登录,推荐使用sessionStorage
  • 存储大量数据的情况,在线文档(富文本编辑器)保存编辑历史的情况,推荐使用indexedDB

23、大文件上传如何断点续传?

自己回答:
文件分批次上传,每个批次添加标记是否上传

标准回答:

分片上传:就是将所要上传的文件,按照一定的大小,将整个文件分割成多个数据块来进行分片上传,上传之后再由服务端对所有上传的文件进行汇总整合成原始文件
流程:
1、将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;
2、初始化一个分片上传任务,返回本次分片上传唯一标识;
3、按照一定的策略(串行或并行)发送各个分片数据块;
4、发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件;

断点续传:指在下载或上传时,将下载或上传任务人为的划分为几个部分
每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没必要从头开始上传下载。用户可以节省时间,提高速度。
一般实现方式有两种

  • 服务器端返回,告知从哪开始
  • 浏览器自行处理

上传过程中将文件在服务器写为临时文件,等全部写完了(文件上传完),将此临时文件重命名为正式文件即可。
如果中途上传中断过,下次上传的时候根据当前临时文件大小,作为在客户端读取文件的偏移量,从此位置继续读取文件数据块,上传到服务器从此偏移量继续写入文件

实现思路:
整体思路比较简单,拿到文件,保存文件唯一标识,切割文件,分段上传,每次上传一段,根据唯一标识判断文件上传进度,直到文件的全部片段上传完毕

在这里插入图片描述
使用场景:

  • 大文件加速上传:当文件大小超过预期大小时,使用分片上传可实现并行上传多个Part,以加快上传速度
  • 网络环境较差:建议使用分片上传,当出现上传失败的时候,仅需重传失败的Part
  • 流式上传:可以在需要上传的文件大小还不确定的情况下开始上传。这种场景在视频监控等行业应用这比较常见

24、ajax原理是什么?如何实现?

自己回答:
对js的XmlHttpRequest的封装

标准回答:
AJAX全称(Async Javascript and XML)
即异步的JavascriptXML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更新部分网页
AJAX的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用Javascript来操作DOM而更新页面
流程图如下:
在这里插入图片描述
实现过程:看这里浏览器请求详解(ajax、fetch、axios使用,手写ajax)

25、什么是防抖和节流?有什么区别?如何实现

自己回答:
防抖:是一段时间内防止多次点击,第一次点击后,会设置一个间隔时间,在间隔时间内点击的会重新开始间隔时间,典型应用:搜索框输入
节流:是多次重复事件,只对一次事件进行处理,典型应用:监听滚动条

标准回答:

防抖: n秒后再执行该事件,若在n秒内被重复触发,则重新计时

重置计时器:每次事件触发时,都会重置计时器。
执行时机:只有在用户停止触发事件指定时间间隔后,才会执行最后一次事件。

节流: n秒内只运行一次(第一次),若在n秒内重复触发,只有一次生效

单次执行:在时间间隔内只执行一次事件处理函数。
忽略后续触发:在时间间隔内,后续的事件触发将被忽略。

实现:

防抖:

// 创建一个防抖函数,它返回一个新的函数,该新函数在指定的 wait 时间后执行 func
function debounce(func, wait) {
    // 保存定时器的引用
    let timeout;
 
    // 返回的函数是用户实际调用的函数,它包含了防抖逻辑
    return function(...args) {
        // 保存当前的 this 上下文
        const context = this;
        console.log(context);  
 
        // 清除之前的定时器,如果存在
        if (timeout) clearTimeout(timeout);  
 
        // 设置一个新的定时器
        // 当指定的 wait 时间过后,将执行 func 函数
        // 并将当前的 this 上下文和参数传入
        timeout = setTimeout(function() {  
            // 执行原始函数,绑定正确的 this 上下文和参数
            func.apply(context, args);  
        }, wait);  
    };
}
  • 当防抖函数被触发时,首先会检查是否已经存在一个timeout(即是否有一个定时器在运行)。
  • 如果存在,表示之前有触发过防抖函数但还未执行func,此时使用clearTimeout清除之前的定时器。
  • 然后,设置一个新的timeout,如果在wait指定的时间内再次触发防抖函数,之前的定时器会被清除并重新设置,这意味着func的执行会被不断推迟。
  • 只有当指定的时间间隔wait内没有再次触发防抖函数时,timeout才会到达,此时会执行原始函数func,并且使用apply方法将存储的context和args传递给它。

节流:

function throttle(func, limit) {
    let inThrottle = false;
 
    return function(...args) {
        const context = this; // 保存当前的 this 上下文
 
        if (!inThrottle) {
            // 执行传入的函数
            func.apply(context, args);
            inThrottle = true; // 标记为正在节流
 
            // 使用闭包和 setTimeout 来在指定的延迟后重置 inThrottle
            setTimeout(() => {
                inThrottle = false; // 重置节流状态
            }, limit);
        }
    };
}
  • func:需要被节流的函数。
  • limit:表示在指定的时间间隔后,func才能再次被执行的时间(以毫秒为单位)。
  • inThrottle:一个布尔值,用来标记func是否处于可执行状态。
  • context:保存当前的this上下文,确保在执行func时this指向正确。
  • args:使用扩展运算符…来收集所有参数,以便将它们传递给func。
  • setTimeout:在指定的limit时间后执行,将inThrottle重置为false,这样func就可以在下一次调用时被执行了。

总结:

相同点:

  • 实现机制:两者都可以通过JavaScript的setTimeout函数实现,利用时间延迟来控制回调函数的执行。
  • 性能优化:它们的共同目的都是减少函数的执行频率,以此来提高程序的性能,避免不必要的计算资源消耗。

不同点:

执行时机:

  • 防抖(Debounce):确保在指定的时间间隔结束后执行一次函数。如果在这段时间内多次触发事件,则只有最后一次事件会在延迟后执行函数。
  • 节流(Throttle):确保在指定的时间间隔内最多执行一次函数。无论在这段时间内触发了多少次事件,只有第一次事件会立即执行函数。

应用场景:

  • 防抖:适用于搜索框输入、表单验证等场景,用户完成输入后,才执行相关操作。
  • 节流:适用于滚动事件、按钮点击等,需要在连续事件中合理控制执行频率的场景。

触发逻辑:

  • 防抖:关注一段时间内的连续触发,但只对最后一次操作做出响应。
  • 节流:在一段时间内,无论触发多少次事件,只响应一次。

分辨技巧:

  • 如果您希望在一系列快速操作结束后只执行一次函数,那么使用防抖。
  • 如果您希望在一系列快速操作中合理控制函数的执行频率,那么使用节流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Windows10系统安装docker?

1.wsl安装 Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。 通过适用于 Linux 的 Window…

UE5 阴影通道

Shadow Pass Switch节点中 Default代表模型遮罩的效果 Shadow代表阴影的生成遮罩效果

Web开发:使用C#创建、安装、调试和卸载服务

目录 一、创建服务 1.创建项目(.NET Framework) 2.重命名 3.编写逻辑代码 二、安装服务 1.方案一:利用VS2022安装文件的配置 选择添加安装程序 安装文件的介绍及配置 ​编辑​ 重新编译 工具安装 2.方案二:编写bat脚本安…

SCRM电商管理后台Axure高保真原型 源文件

在电商行业蓬勃发展的今天,企业急需一个全面的客户关系管理(CRM)系统来优化他们的电商运营。我们的Scrm电商管理后台应运而生,它不仅是一个集中化的管理平台,更是企业提升客户互动和销售业绩的得力助手。 预览地址 ht…

yolo8训练自己的模型

1.数据源准备 1.1 准备图片资源 1.2 对图片资源标注,生成 对应的 .txt 文件,里面的数字表示 物体被标注的 x或y 等坐标点信息 1.2.1 标注工具下载以及使用教程参考 Windows 10下安装labelImg标注工具!_labelimg windows exe 1.5版本-…

YOLOv5 Detect.py 改变检测框box线条的粗细,隐藏检测框的检测信息,只显示检测框box

Ctrl F 搜索 line_thickness 修改值 值越小 线条越细 hide-labels 隐藏检测框的类别信息 hide-conf 隐藏检测框的置信度信息

【OpenAPI】Spring3 集成 OpenAPI 生成接口文档

Spring3 集成 OpenAPI 生成接口文档 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 OpenAPI 依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency><groupI…

jdk环境变量配置+eclipse配置jdk

文章目录 安装jdkjdk环境变量配置eclipse里边配置jdkeclipse覆盖率插件——EclEmma的安装和使用 安装jdk 在安装前可以先建两个文件夹&#xff0c;注意不要文件夹用英文&#xff0c;不要用中文&#xff0c;如图&#xff1a; 然后我们开始安装 然后就看我们有没有安装成功…

代码随想录day22|回溯法03

一、90.子集Ⅱ 90. 子集 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 这道题目和78.子集 (opens new window)区别就是集合里有重复元素了&#xff0c;而且求取的子集要去重。 那么关于回溯算法中的去重问题&#xff0c;在40.组合总和II (opens new window…

实际案例(7)你遇到这样的环境,如何解决?(这是一道讨论题)

服务器有两个外网的时候&#xff0c;如何都能通过外网访问服务 环境介绍&#xff1a;一个非常普通的环境&#xff0c;但是怪就怪在服务器这块&#xff0c;服务器有两个网卡&#xff0c;他本身有一个外网上网&#xff0c;这个时候客户想把这个服务器加入到防火墙的网络里面来&am…

为什么sqlynx是连接国产数据库的最佳选择?

1. 广泛的国产数据库支持 SQLynx除了国际上的主流数据库外&#xff0c;还支持多种国产数据库&#xff0c;如达梦、人大金仓、OceanBase、openGauss等。随着国产数据库市场的不断发展和成熟&#xff0c;越来越多的企业和机构开始选择国产数据库来满足其数据管理需求。SQLynx通过…

R134a制冷剂简介

目录 一、基本性质 二、环保特性 三、应用领域 1. 制冷空调行业 2. 工业制造行业 3. 气雾剂和推进剂行业 4. 发泡剂行业 5. 其他行业 四、使用注意事项 1. 安全性方面 2. 系统兼容性方面 3. 操作规范方面 4. 存储和运输方面 R134a制冷剂,也被称为四氟乙烷(CF3CH…

stm32 SPI通信外设(硬件SPI读写W25Q64)

理论 1.SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率&#xff1a; fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作…

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目&#xff1a; 题解&#xff1a; class Solution { public:static const int MASK1 1 << 7;static const int MASK2 (1 << 7) (1 << 6);bool isValid(int num) {return (num & MASK2) MASK1;}int getBytes(int num) {if ((num & MASK1) 0) …

WhatsApp修复重大隐私漏洞,‘阅后即焚’功能安全隐患引关注

据BleepingComputer报道&#xff0c;全球拥有20亿用户的即时通讯应用WhatsApp近期修复了一个关键的隐私漏洞。该漏洞允许攻击者多次查看用户发送的“阅后即焚”&#xff08;View once&#xff09;内容。 WhatsApp的“阅后即焚”功能于三年前推出&#xff0c;允许用户发送只能查…

VSCode 渲染 markdown md , 设置插件的背景颜色 Markdown Preview Enhanced

起因&#xff0c; 目的: VSCode 中&#xff0c; 安装 Markdown Preview Enhanced 这个插件之后&#xff0c;能渲染&#xff0c;但是背景颜色太亮了。 最近正在学习 css, 所以一试身手。 先看效果&#xff1a; 过程: Ctrl Shift P 打开命令面板。输入: Markdown Preview…

【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 装了显卡后&#xff0c;开机默认是从显卡的HDMI输出&#xff0c;但这很不方便。如何让视频仍然从主板输出&#xff1f;或者说让显卡HDMI和主板…

漏洞披露-信呼-OA

更多网安漏洞复现&#xff0c;可前往无问社区查看http://wwlib.cn/index.php/artread/artid/16564.html 0x01 产品简介 泛微数字化运营管理平台OA为组织提供从“可信数字身份、电子化流程审批、个性化岗位信息门户、 知识文档管理、电子化签署到内外协同的业务管理” 0x02 漏…

QT 基础学习

1> 使用绘制事件完成钟表的绘制 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QDebug> #include <QTime> #include <QTimer> #include <QDateTime> //#include <string> #includ…

发送成绩的app或小程序推荐

老师们&#xff0c;新学期的第一次月考马上开始&#xff0c;是不是还在为如何高效、便捷地发布成绩而头疼呢&#xff1f;别担心&#xff0c;都2024年了&#xff0c;我们有更智能的方式来解决这个问题&#xff01; 给大家安利一个超级实用的工具——易查分小程序。这个小程序简…