No115.精选前端面试题,享受每天的挑战和学习
文章目录
- 变量提升和函数提升的顺序
- Event Loop
- 封装 FetchAPI,要求超时报错的同时,取消执行的 promise(即不继续执行)
- 强缓存和协商缓存的区别
- token可以放在cookie里吗?
变量提升和函数提升的顺序
在JavaScript中,变量提升和函数提升是JavaScript引擎在代码执行之前进行的一种行为。变量提升是指在代码执行之前,JavaScript引擎会将变量的声明提升到作用域的顶部,而函数提升是指JavaScript引擎会将函数的声明提升到作用域的顶部。
在变量提升中,变量的声明会被提升,但是赋值操作不会被提升。这意味着在变量被赋值之前,它的值是undefined。例如:
console.log(x); // 输出 undefined
var x = 5;
在上面的例子中,变量x的声明被提升到作用域的顶部,但是赋值操作并没有被提升,所以在变量被赋值之前,它的值是undefined。
函数提升则是将整个函数的声明提升到作用域的顶部。这意味着可以在函数声明之前调用函数。例如:
foo(); // 输出 "Hello"function foo() {console.log("Hello");
}
在上面的例子中,函数foo的声明被提升到作用域的顶部,所以可以在函数声明之前调用函数。
需要注意的是,变量提升和函数提升只适用于使用关键字var和function声明的变量和函数。使用let和const声明的变量不会被提升,而使用函数表达式声明的函数也不会被提升。
总结起来,变量提升和函数提升的顺序是:函数提升优先于变量提升,而在同一类声明中,按照它们在代码中出现的顺序进行提升。
Event Loop
事件循环(Event Loop)是JavaScript中处理异步操作的一种机制。它负责管理调度和执行异步任务,以确保它们按照正确的顺序执行。
事件循环的核心思想是基于一个事件队列(Event Queue)
和一个执行栈(Execution Stack)
。
所有的异步任务都会被放入事件队列中,而同步任务则直接放入执行栈中。
当执行栈为空时,事件循环会从事件队列中取出一个任务,并将其放入执行栈中执行。这个过程会不断重复,形成一个循环,即事件循环。
事件循环的执行过程如下:
- 执行全局同步代码,将同步任务放入执行栈中执行。
- 当遇到异步任务时,将其放入事件队列中,并继续执行后续的同步任务。
- 当执行栈为空时,事件循环会从事件队列中取出一个任务,并将其放入执行栈中执行。
- 重复步骤2和步骤3,直到事件队列为空。
需要注意的是,事件循环是单线程的,意味着在同一时间只能执行一个任务。当一个任务正在执行时,其他任务需要等待。
常见的异步任务包括定时器(setTimeout、setInterval)、事件监听(addEventListener)和网络请求(Ajax、fetch等)。这些任务会被放入事件队列中,等待事件循环的执行。
通过事件循环,JavaScript能够处理异步任务,避免阻塞主线程,提高程序的响应性能。同时,事件循环也确保了异步任务按照正确的顺序执行,避免了竞争条件和数据不一致的问题。
封装 FetchAPI,要求超时报错的同时,取消执行的 promise(即不继续执行)
要封装Fetch API并实现超时报错并取消执行的功能,你可以使用Promise.race()
和AbortController
来实现。下面是一个示例代码:
function fetchWithTimeout(url, options, timeout = 5000) {const controller = new AbortController();const { signal } = controller;const timeoutPromise = new Promise((_, reject) => {setTimeout(() => {controller.abort();reject(new Error('请求超时'));}, timeout);});const fetchPromise = fetch(url, { ...options, signal });return Promise.race([fetchPromise, timeoutPromise]);
}// 使用示例
fetchWithTimeout('https://api.example.com/data', { method: 'GET' }).then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));
在上面的示例中,我们定义了一个名为fetchWithTimeout
的函数,它接受三个参数:url
表示要请求的URL,options
表示请求的选项,timeout
表示超时时间(默认为5000毫秒)。
在函数内部,我们创建了一个AbortController
对象和一个signal
对象,用于取消请求。然后,我们创建了一个timeoutPromise
,它会在指定的超时时间后调用controller.abort()
来取消请求,并抛出一个超时错误。
接下来,我们使用fetch
函数发起请求,并传入signal
作为请求的信号。最后,我们使用Promise.race()
来同时等待fetchPromise
和timeoutPromise
,并返回最先完成的Promise。
这样,如果请求在超时时间内完成,那么fetchPromise
会先完成,返回请求的结果。如果请求超时,那么timeoutPromise
会先完成,抛出一个超时错误。
你可以根据需要调整超时时间和其他请求选项。同时,记得在使用fetchWithTimeout
函数时,使用.catch()
来捕获错误并处理取消执行的情况。
强缓存和协商缓存的区别
强缓存和协商缓存是用于在客户端和服务器之间进行缓存控制的两种机制。它们有以下区别:
强缓存:
- 当客户端请求资源时,如果该资源的缓存标识符(如
Cache-Control
或Expires
)满足条件,客户端将直接从本地缓存中获取资源,而不向服务器发送请求。 - 强缓存的优点是可以减少服务器的负载,加快资源加载速度。
- 但缺点是如果资源在客户端缓存过期之前有更新,客户端无法得知,仍然使用旧版本。
协商缓存:
- 当客户端请求资源时,如果该资源的缓存标识符满足条件,客户端会发送一个请求到服务器验证该资源是否仍然有效。
- 服务器会根据资源的缓存标识符(如
ETag
或Last-Modified
)进行验证,判断资源是否已经改变。 - 如果资源没有改变,服务器将返回一个
304 Not Modified
状态码,并告诉客户端继续使用本地缓存。 - 如果资源已经改变,服务器将返回新的资源。
区别:
- 强缓存是根据缓存标识符直接使用本地缓存,不向服务器发送请求,而协商缓存需要向服务器发送请求进行验证。
- 强缓存相对来说比较快,因为它减少了网络请求的次数,而协商缓存需要与服务器进行通信。
- 强缓存的缺点是不能检测资源的更新情况,只能依赖资源的缓存过期时间来判断,可能导致使用过期的资源。
- 协商缓存通过与服务器进行验证,可以获取到最新的资源,但会增加一次额外的网络请求。
在实际应用中,可以综合使用强缓存和协商缓存来控制资源的缓存,以达到更好的性能和用户体验。
token可以放在cookie里吗?
摘抄:不建议,因为安全问题。因为存在
CSRF
(跨站请求伪造)风险,攻击者可以冒用Cookie
中的信息来发送恶意请求。
为了解决CSRF问题,可以设置同源检测(Origin
和Referer
认证),也可以设置Samesite
为Strict
。
可以将一个令牌(token)存储在一个cookie中。Cookie是浏览器保存在用户设备上的一小段文本信息,这些信息会在每次浏览器发送请求时通过HTTP头部自动发送到服务器。
将令牌存储在Cookie中具有一些优点:
- 它对于客户端来说是透明的,无需手动添加头部信息。
- Cookie存储在浏览器中,与用户会话相关联,因此在不同的页面和请求中都可以使用。
- Cookie具有过期时间的设置,可以控制令牌的有效期。
然而,需要注意的是,将令牌存储在Cookie中也存在一些安全风险:
- 客户端可能对Cookie进行修改、删除或伪造,从而引发安全漏洞。
- 由于Cookie存储在用户设备上,可能会被其他恶意脚本或跨站脚本攻击获取到。
因此,在使用Cookie存储令牌时,需要采取一些安全措施,如使用HTTPS
协议进行通信,设置HttpOnly
和Secure
标记来限制脚本访问,以及定期更新和验证令牌等。
相关文章:
No115.精选前端面试题,享受每天的挑战和学习
文章目录 变量提升和函数提升的顺序Event Loop封装 FetchAPI,要求超时报错的同时,取消执行的 promise(即不继续执行)强缓存和协商缓存的区别token可以放在cookie里吗? 变量提升和函数提升的顺序 在JavaScript中&#…...
Elasticsearch:语义搜索 - Semantic Search in python
当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语…...
Flink学习笔记(一)
流处理 批处理应用于有界数据流的处理,流处理则应用于无界数据流的处理。 有界数据流:输入数据有明确的开始和结束。 无界数据流:输入数据没有明确的开始和结束,或者说数据是无限的,数据通常会随着时间变化而更新。 在…...
[Raspberry Pi]如何用VNC遠端控制樹莓派(Ubuntu desktop 23.04)?
之前曾利用VMware探索CentOS,熟悉Linux操作系統的指令和配置運作方式,後來在樹莓派價格飛漲的時期,遇到貴人贈送Raspberry Pi 4 model B / 8GB,這下工具到位了,索性跳過樹莓派官方系統(Raspberry Pi OS),直…...
17.HPA和rancher
文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…...
VS2022远程Linux使用cmake开发c++工程配置方法
文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…...
《强化学习:原理与Python实战》——可曾听闻RLHF
前言: RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)是一种基于强化学习的算法,通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励,还融合了人类专家…...
STM32——RTC实时时钟
文章目录 Unix时间戳UTC/GMT 时间戳转换BKP简介BKP基本结构读写BKP备份寄存器电路设计关键代码 RTC简介RTC框图RTC基本结构硬件电路RTC操作注意事项读写实时时钟电路设计关键代码 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日…...
webSocket 开发
1 认识webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽…...
c#设计模式-结构型模式 之 代理模式
前言 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接 引用目标对象,代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候,可以去了解一下Aop切面编程AOP切面编程_aop编程…...
openpnp - 自动换刀的设置
文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…...
《HeadFirst设计模式(第二版)》第十章代码——状态模式
如下图所示,这是一个糖果机的状态机图,要求使用代码实现: 初始版本: package Chapter10_StatePattern.Origin;/*** Author 竹心* Date 2023/8/19**/public class GumballMachine {final static int SOLD_OUT 0;final static int…...
day-25 代码随想录算法训练营(19)回溯part02
216.组合总和||| 思路:和上题一样,差别在于多了总和,但是数字局限在1-9 17.电话号码的字母组合 思路:先纵向遍历第i位电话号码对于的字符串,再横向递归遍历下一位电话号码 93.复原IP地址 画图分析: 思…...
PG逻辑备份与恢复
文章目录 创建测试数据pg_dump 备份pg_restore 恢复pg_restore 恢复并行备份的文件PG 只导出指定函数 创建测试数据 drop database if exists test; create database test ; \c test create table t1(id int primary key); create table t2(id serial primary key, name varch…...
图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010
然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…...
Linux网络编程:Socket套接字编程(Server服务器 Client客户端)
文章目录: 一:定义和流程分析 1.定义 2.流程分析 3.网络字节序 二:相关函数 IP地址转换函数inet_pton inet_ntop(本地字节序 网络字节序) socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…...
Mac OS下应用Python+Selenium实现web自动化测试
在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话,可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…...
每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)
今日份题目: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…...
【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8
前言 本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。 一、FreeRTOS V9.0.0 源码的获取 两个下载链接: 官 网 代码托管 二、源码文件夹内容简介 Source…...
Qt 屏幕偶发性失灵
项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…...
如何在pycharm中指定GPU
如何在pycharm中指定GPU 作者:安静到无声 个人主页 目录 如何在pycharm中指定GPU打开编辑配置点击环境变量添加GPU配置信息推荐专栏在Pycharm运行程序的时候,有时候需要指定GPU,我们可以采用以下方式进行设置: 打开编辑配置 点击环境变量 添加GPU配置信息 添加名称:CU…...
C#判断字符串中有没有字母,正则表达式、IsLetter
要判断字符串中是否包含字母,可以使用正则表达式或者循环遍历字符串的方式。 方法一:使用正则表达式 using System.Text.RegularExpressions;string input "Hello123"; bool containsLetter Regex.IsMatch(input, "[a-zA-Z]");上…...
Jtti:Ubuntu怎么限制指定端口和IP访问
在 Ubuntu 系统中,可以使用防火墙规则来限制特定的端口和IP访问。常用的防火墙管理工具是 iptables,以下是使用 iptables 来限制指定端口和IP访问的步骤: 安装 iptables: 如果系统中没有安装 iptables,可以使用以下命…...
机器学习/深度学习需要掌握的linux基础命令
很多深度学习/机器学习/数据分析等领域(或者说大多数在Python环境下进行操作的领域)的初学者入门时是在Windows上进行学习,也得益于如Anaconda等工具把环境管理做的如此友善 但如果想在该领域继续深耕,一定会与Linux操作系统打交…...
C++11 std::async推荐使用 std::launch::async 模式
async真假多线程 std::launch::async真多线程 std::launch::async | std::launch::deferred可能多线程 std::launch::deferred假多线程 枚举变量说明 枚举定义 enum class launch {async 1, // 0b1deferred 2, // 0b10any async | def…...
没有使用springboot 单独使用spring-boot-starter-logging
如果您不使用Spring Boot框架,但想单独使用Spring Boot Starter Logging,您可以按照以下步骤进行: 1. 添加Maven依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…...
创建Azure资源锁
锁的介绍 在Azure中,资源锁是一种用于保护订阅、资源组或者单个资源的机制。它可以防止对受锁定的资源进行删除或修改操作,帮助确保资源的连续可用性和安全性。 Azure中的资源锁可以分为两种类型: 删除锁(CanNotDelete…...
卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器
在这篇博客中,让我们讨论什么是卷积神经网络 (CNN) 以及 卷积神经网络背后的架构——旨在解决 图像识别系统和分类问题。 卷积神经网络在图像和视频识别、推荐系统和自然语言处理方面有着广泛的应用。 目录 计算机如何读取图像? 为什么不是全连接网络?...
MyBatis XML映射处理CLOB和BLOB类型
Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢?首先我们先看下CLOB和BLOB这两种数据类型的介绍。 介绍 使用Mybatis时涉及到两种特殊类型的处理,分别是Blob(Binary Large Object)和Clob࿰…...
FPGA_学习_14_第一个自写模块的感悟和ila在线调试教程与技巧(寻找APD的击穿偏压)
前一篇博客我们提到了,如果要使用算法找到Vbr,通过寻找APD采集信号的噪声方差的剧变点去寻找Vbr是一个不错的方式。此功能的第一步是在FPGA中实现方差的计算,这个我们已经在上一篇博客中实现了。 继上一篇博客之后,感觉过了很久了…...
网站建设包含以下哪些建设阶段/福建seo顾问
总线是计算机各种功能部件之间传送信息的公共通信干线,是由导线组成的传输线束。微机中有三种总线:数据总线、地址总线和控制总线;它们分别用来传输数据、数据地址和控制信号。本文操作环境:windows10系统、thinkpad t480电脑。相…...
专做医药中间体的网站/青岛新闻最新今日头条
最近有客户想对数据库的用户权限做限制,需要用到copy的功能,不能确定其需要的权限,测试了一下: highgo# \c highgo testc highgo> select user;current_user --------------testc (1 row)highgo> copy testcopyto to /hgd…...
站群管理系统cms/pc网站优化排名
摘要:随着计算机技术和Internet的飞速发展,人们对web服务器的性能的要求也越来越高,负载均衡集群以其较高的性价比和良好的扩展性在web服务器中得到了广泛的应用。因此如何更好的提高集群服务器的综合处理能力便受到了更多的关注。 集群的负载均衡策略是提高集群整体…...
建设阿里巴巴网站首页/怎么做网站关键词优化
Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。 Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。 接下来我们来看一段代码…...
服装公司电子商务网站建设策划书/百度网址安全中心怎么关闭
摘要:阿里巴巴原汁原味的研发协同平台是如何支撑双十一1682亿背后的研发协同?大中型企业如何完成公有云/专有云/混合云转型升级,实现高效协同研发?阿里巴巴原汁原味的研发协同平台是如何支撑双十一1682亿背后的研发协同࿱…...
c 能用来做网站吗/百度地图广告投放
2010年7月份,NASA和Rackspace公司将Openstack开源。到今天,Openstack马上六周岁了。而6周岁正是孩子上小学一年级的时候,Openstack是否也准备好上小学了呢? Openstack在刚开始的3年受到了整个市场的热捧,很多国际大牌不…...