一些前端面试思考

回流和重绘

        先牢记这句话,回流必将引起重绘,而重绘不一定会引起回流。回流的代价要远大于重绘。

当你给一个元素更换颜色,这样的行为是不会影响页面布局的,DOM树不会变化,但颜色变了,渲染树得重新渲染页面,这就是重绘。

比如我们增删DOM节点,修改一个元素的宽高,页面布局发生变化,DOM树结构发生变化,那么肯定要重新构建DOM树,而DOM树与渲染树是紧密相连的,DOM树构建完,渲染树也会随之对页面进行再次渲染,这个过程就叫回流。

         换句话说,你可以简单粗暴地理解为重绘只是改变了样式树。而回流改变了DOM树(引起DOM树结构变化,页面布局变化)。

浏览器拿到HTML文本后如何解析

        html文件在没有写入html标签之前和txt文本是一个性质的,不含任何样式。只是单纯的文本预览文件。一旦加入了html标签,表示内容有了语义。浏览器的渲染引擎才会根据标签的语义开始解析。

解析一个文档意味着把它翻译成有意义的结构以供代码使用。解析的结果通常是一个表征文档的由节点组成的树,称为解析树或句法树。

解析器通常把工作分给两个组件——分词程序和解析程序。分词程序负责把输入切分成合法符号序列,解析程序负责按照句法规则分析文档结构和构建句法树。
【精选】你了解浏览器原理吗?说说浏览器解析html的过程_浏览器解析html过程_码上十七的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65335111/article/details/127400627

CSS树和DOM树怎么结合

【精选】Dom树 CSS树 渲染树(render树) 规则、原理_web18296061989的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/web18296061989/article/details/123421151

网页是如何渲染出来的,dom树和css树是如何合并的,浏览器的运行机制是什么,什么是否会造成渲染阻塞?_css 样式怎么合并到dom节点的-CSDN博客渲染树构建、布局及绘制浏览器的内核是指支持浏览器运行的最核心的程序,分为两个部分的,一是渲染引擎,另一个是JS引擎。渲染引擎在不同的浏览器中也不是都相同的。目前市面上常见的浏览器内核可以分为这四种:Trident(IE)、Gecko(火狐)、Blink(Chrome、Opera)、Webkit(Safari)。这里面大家最耳熟能详的可能就是 Webkit 内核了,Webkit 内核是当下浏览器世..._css 样式怎么合并到dom节点的https://blog.csdn.net/qq_22930381/article/details/101448112?utm_source=miniapp_weixin

 

eventLoop事件循环

var x = setTimeout(() => {console.log(1)},0)
var y = new Promise(function(resolve) {console.log(2);resolve();console.log(3)
})
y.then(() => {console.log(4)
})
console.log(5)

        依次输出2 3 5 4 1

        setTimeout产出宏任务,promise.then产出的是微任务。

        JavaScript是单线程的,意味着任务只能一次执行一个任务。
        宏任务(Macro Task)是指在当前任务队列中被调度的任务。例如:

  • DOM事件处理
  • setTimeout
  • setInterval
  • setImmediate(nodejs独有)
  • requestAnimationFrame(浏览器独有)
  • I/O操作(nodejs独有)

        微任务(Micro Task)是指在当前任务执行结束后需要立即执行的任务。例如:

  • Promise.then
  • Promise.catch
  • Promise.finally
  • MutationObserver

        Event Loop 翻译为事件循环,是JavaScript的一种执行机制。

        Event Loop的执行过程如下:

  1. 执行全局Script同步代码,这些同步代码可能会产生宏任务或者微任务。
  2. 执行所有微任务,直到微任务队列为空。
  3. 取出一个宏任务执行,执行过程中产生的微任务会加入微任务队列。
  4. 重复步骤2-3,直到所有任务都执行完毕。

原型链的概念

        就是实例对象和原型对象之间的链接,每一个对象都有原型,原型本身又是对象,原型又有原型,以此类推形成一个链式结构.称为原型链

什么是原型对象

        在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做原型对象

怎么判断NULL

val === null

或: 

if(!val && typeof(val) != "undefined" && val!= 0) {}

     

怎么中断请求

        jquery

var ajaxGet = $.get('xxx',{id:1},function(data){...});
ajaxGet.abort()

        axios

        使用 CancelToken.souce 工厂方法创建一个 cancel token

const CancelToken = axios.CancelToken;

        将token作为传参

const source = CancelToken.source();
axios.get('https://mdn.github.io/dom-examples/abort-api/sintel.mp4', {cancelToken: source.token
}).catch(function (thrown) {// 判断请求是否已中止if (axios.isCancel(thrown)) {// 参数 thrown 是自定义的信息console.log('Request canceled', thrown.message);} else {// 处理错误}
});

        这里用axios来判断中止状态

        主动取消:

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

        方法二:

const CancelToken = axios.CancelToken;
let cancel;axios.get('/user/12345', {cancelToken: new CancelToken(function executor(c) {// executor 函数接收一个 cancel 函数作为参数cancel = c;})
});// 取消请求
cancel('Operation canceled by the user.');

        Fetch

        fetch是ES6新出的,基于promise设计,没有进行封装,属于原生js,所以在vue中使用的时候也不需要进行import引入就可以直接使用。

        fetch请求返回的是promise对象,需要进行json转换,所以需要两次.then()


fetch("/api/test/").then(res => {return res.json();}).then(res => {// 这里返回的数据就是我们想要请求的json数据console.log(res);

        上面是get下面是post


const requestBody = {title: 'foo',body: 'bar',userId: 1
};fetch('https://jsonplaceholder.typicode.com/posts', {method: 'POST',body: JSON.stringify(requestBody),headers: {'Content-Type': 'application/json'}
})
.then(res => res.json())
.then(data => console.log(data))

        如果要终止 fetch 请求,则可以使用 Web 提供的 AbortController 接口。

   首先我们使用 AbortController() 构造函数创建一个控制器,然后使用 AbortController.signal 属性获取其关联 AbortSignal 对象的引用。当一个 fetch request 初始化时,我们把 AbortSignal 作为一个选项传递到请求对象 (如下:{signal}) 。这将信号和控制器与获取请求相关联,然后允许我们通过调用 AbortController.abort() 中止请求。

const controller = new AbortController();
let signal = controller.signal;
console.log('signal 的初始状态: ', signal);const downloadBtn = document.querySelector('.download');
const abortBtn = document.querySelector('.abort');downloadBtn.addEventListener('click', fetchVideo);abortBtn.addEventListener('click', function() {controller.abort();console.log('signal 的中止状态: ', signal);
});function fetchGetVideo() {//...fetch(url, {signal}).then(function(response) {//...}).catch(function(e) {reports.textContent = 'Download error: ' + e.message;})
}function fetchPostVideo() {//...fetch(url,{name: "张三.avi",id: 18x},{signal: controller.signal // 传入signal}).then(function(response) {//...}).catch(function(e) {reports.textContent = 'Download error: ' + e.message;})
}

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

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

相关文章

Linux系统管理:虚拟机OpenEuler安装

目录 一、理论 1.OpenEuler 二、实验 1.虚拟机OpenEuler安装准备阶段 2.安装OpenEuler 3.进入系统 一、理论 1.OpenEuler (1)简介 欧拉(Euler)是数字基础设施的开源操作系统,可广泛部署于服务器、云计算、边缘…

如何利用PHP快速抓取音频数据?

以下是一个使用Dusk库和PHP编写的爬虫程序&#xff0c;用于爬取海量的音频数据。这个程序使用了https://www.duoip.cn/get_proxy的代码。 <?php // 引入Dusk库 require Dusk.php;// 创建Dusk对象 $dusk new Dusk();// 设置代理 $dusk->setProxy(127.0.0.1, 8080);// 使…

Unity2023, Unity2022, Unity2021的性能对比(帧率)

最近由于需要用到Unity最新版的一些功能&#xff0c;比如Spline&#xff0c;比如Foward渲染&#xff0c;新项目用了Unity2022.3.5版本&#xff0c;但是出包之后&#xff0c;感觉帧率很低。本着好奇的态度&#xff0c;专门写了一个测试场景&#xff0c;分别在Unity2023.1.15&…

vue3+koa+axios实现前后端通信

vue3koaaxios实现前后端通信 写了一个小demo来实现前后端通信,涉及跨域问题&#xff0c;非常简单可以给大家平时开发的时候参考 服务端&#xff1a; 目录结构如下&#xff1a; router index.js // router的入口文件 // 引入路由 const Router require("koa-router&quo…

记一次mysql事务并发优化

记一次mysql事务并发优化 背景 事情的情况大致是这样的。一个扣减库存的业务上线以后&#xff0c;隔几天会报一次错&#xff0c;错误内容如下&#xff1a; ERROR - exception: UncategorizedSQLException,"detail":"org.springframework.jdbc.UncategorizedSQ…

Spring framework Day22:Aware接口

前言 在Spring框架中&#xff0c;有许多接口和类都有一个非常重要的作用——让我们能够更方便地构建应用程序和管理组件。其中&#xff0c;Aware接口就是其中一个非常重要的接口之一。通过实现该接口&#xff0c;我们可以让Spring容器感知到特定的组件和资源&#xff0c;并进行…

讲解 CSS 过渡和动画 — transition/animation (很全面)

前言 由于用户越来越注重 Web应用 的使用体验&#xff0c;随之而来的是 Web应用 需要提供了更加完善的 Web 动画 效果来实现以平滑的状态贯穿于用户的整个使用过程中。现在&#xff0c;这已经是司空见惯了&#xff0c;用户潜意识是希望可以获得更快的反馈响应和更友好的用户界…

Elasticsearch系列组件:Beats高效的日志收集和传输解决方案

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

接口自动化测试持续集成,Soapui接口功能测试参数化

按照自动化测试分层实现的原理&#xff0c;每一层的脚本实现都要进行参数化&#xff0c;自动化的目标就是要实现脚本代码与测试数据分离。当测试数据进行调整的时候不会对脚本的实现带来震荡&#xff0c;从而提高脚本的稳定性与灵活度&#xff0c;降低脚本的维护成本。Soapui最…

C#,数值计算——KMeans分类的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// K-Means classification /// </summary> public class Kmeans { private int nn { get; set; } private int mm { get; set; } private …

优维低代码实践:片段

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

5.12.webrtc接口调用过程

嗨&#xff0c;大家好&#xff0c;我是李超&#xff0c;在上节课中呢&#xff0c;我向你介绍了外接口的设计以及我们红接口展开之后的样子&#xff0c;对吧&#xff1f;那今天呢&#xff1f;我们再来看看整个接口调用过程。那整个这个调用过程啊&#xff0c;非常的复杂&#xf…

QCustomPlot实现曲线拖拽

本文内容目录 需求场景&#xff1a;一、选择控件二、将QCustomPlot库整合到你的Qt项目中1、下载源代码2、创建.pri 三、鼠标框选&#xff0c;实现坐标缩放四、曲线拖动1、定位曲线2、移动时改变曲线 五、问题的产生与解决1、查看源码2、修改本项目代码 需求场景&#xff1a; 曲…

excel 日期与时间戳的相互转换

1、日期转时间戳&#xff1a;B1INT((A1-70*365-19)*86400-8*3600)*1000 2、时间戳转日期&#xff1a;A1TEXT((B1/10008*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss") 以上为精确到毫秒&#xff0c;只精确到秒不需要乘或除1000。 使用以上方法可以进行excel中日期…

行业追踪,2023-10-18

自动复盘 2023-10-18 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Redis LFU缓存淘汰算法

前言 Redis 在 4.0 版本之前的缓存淘汰算法&#xff0c;只支持 random 和 lru。random 太简单粗暴了&#xff0c;可能把热点数据给淘汰掉&#xff0c;一般不会使用。lru 比 random 好一点&#xff0c;会优先淘汰最久没被访问的数据&#xff0c;但是它也有一个缺点&#xff0c;…

英语——分享篇——每日200词——1001-1200

1001——responsibility——[rɪˌspɒnsəbɪlətɪ]——n.责任——responsibility——res热死(拼音)ponsi胖子(谐音)bili比利(拼音)ty题(谐音)——热死的胖子比利做题时很有责任心——The responsibility for her family bears down on a young woman.——家庭的责任沉重地落…

攻防世界web篇-PHP2

直接点击进入到http网页中&#xff0c;会得到这样一个界面 这里&#xff0c;我最开始使用了burp什么包也没有抓到&#xff0c;然后接着又用nikto进行探测&#xff0c;得到的只有两个目录&#xff0c;当时两个目录打开后&#xff0c;一个是fond界面&#xff0c;一个是这个网页的…

【QT】常用控件——按钮组

继承Widget PushButton 设置图片&#xff0c;先导入图片资源&#xff0c;见&#xff1a;【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客 在布局中添加图片 调整尺寸 toolButton 显示图片、文本 显示图片&#xff08;图片和文字都有时&#…

使用Python+selenium实现第一个自动化测试脚本

这篇文章主要介绍了使用Pythonselenium实现第一个自动化测试脚本&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化&#xff0c;记录一下学习过程。…