字节面试问题

实现三列布局的方法

第一种:可以使用浮动+margin

第二种:浮动+BFC

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><div class="left"></div><div class="right"></div><div class="main"></div></div>
</body>
</html><style>.left {float: left;width: 200px;height: 200px;background: red;}.right {float: right;width: 200px;height: 200px;background: green;}// 通过margin.main {margin-left: 200px;margin-right: 200px;height: 200px;background: darkblue;}// 通过BFC.main {ovflow: hidden;height: 200px;background: darkblue;}
</style>

第三种:flex布局

flex: 1的实现:代表了子项目将会占据所有的空闲空间

flex: 1其实是代表三个属性的简写,flex-grow、flex-shirnk、flex-basis

flex-grow: 该属性定义项目放大的比例,取值越大,代表向父级索取的宽度越大,默认值是1

flex-shirnk: 该属性代表项目缩小的比例,取值越大,代表缩小的比例越大,默认值是1

flex-basis: 该属性代表每个弹性盒子在主轴方向上所占用的空间大小,默认值0%

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><div class="left"></div><div class="main"></div><div class="right"></div></div>
</body>
</html><style>.box {display: flex;}.left {width: 200px;height: 200px;background: red;}.right {width: 200px;height: 200px;background: green;}.main {flex: 1;height: 200px;background: rgb(194, 12, 139);}
</style>

第四种:定位+margin

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><div class="left"></div><div class="right"></div><div class="main"></div></div>
</body>
</html><style>.box {position: relative;}.left {position: absolute;left: 0;width: 200px;height: 200px;background: red;}.right {position: absolute;right: 0;width: 200px;height: 200px;background: green;}.main {margin-left: 200px;margin-right: 200px;height: 200px;background: rgb(194, 12, 139);}
</style>

第五种:table布局

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><div class="left"></div><div class="main"></div><div class="right"></div></div>
</body>
</html><style>.box {display: table;width: 100%;}.left {display: table-cell;width: 200px;height: 200px;background: red;}.right {display: table-cell;width: 200px;height: 200px;background: green;}.main {display: table-cell;height: 200px;background: rgb(194, 12, 139);}
</style>

第六种:flex+calc

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="box"><div class="left"></div><div class="main"></div><div class="right"></div></div>
</body>
</html><style>.box {display: flex;width: 100%;}.left {width: 200px;height: 200px;background: red;}.right {width: 200px;height: 200px;background: green;}.main {width: calc(100% - 400px);height: 200px;background: rgb(194, 12, 139);}
</style>

JSON转化函数时的方法

浏览器缓存

什么是缓存?

缓存的原理是在首次缓存之后保存一份请求资源的响应副本,当用户再次发起相同请求时,如果判断缓存命中则拦截请求,将之前存储的响应副本返回给用户,从而避免从新向服务器发送请求

浏览器缓存主要分为两块,协商缓存和强制缓存

强制缓存

不会向服务器发送请求,直接从缓存中读取资源

使用强制缓存在响应头中的配置

express:响应头中设置过期时间,如果在过期时间之内,则命中缓存

cache-control:有以下几个值的选项

max-age:在设置的时间之内,不会再次发起请求

-no-cache:可以在本地进行缓存,但每次发请求时,都要向服务器进行验证,如果服务器允许,才能使用本地缓存。

-no-store:禁止浏览器缓存数据

-public:可以被所有用户缓存资源,包括终端用户和中间的代理服务器

-private:只能被终端的浏览器用户缓存

注:

1、express设置以分钟为单位的过期时间,max-age指明以秒为单位的过期时间

2、express优先级比cache-control低

协商缓存

需要向服务器发送请求,服务器会根据请求头中的参数来判断是否命中缓存,如果命中则返回304,通知浏览器从缓存中读取数据,如果没有命中,则重新请求资源,协商缓存可以解决强制缓存下资源不更新的问题

第一种方式:Last-Modify/If-Modify-Scene

浏览器第一次请求服务器时,服务器会在响应头中返回一个Last-Modify,是资源最后的修改时间标识,单位是秒,当浏览器再次向服务器发送请求时,会在请求头中加上If-Modify-Scene,如果If-Modify-Scene等于服务器中文件最后的修改时间,则返回给浏览器304,使用缓存,否则重新返回资源

第二种方式:Etag/If-None-Match

浏览器第一次请求服务器时,服务器会在响应头中返回一个Etag,是资源文件的hash值,当浏览器再次向服务器发送请求时,会在请求头中加上If-None-Match,如果If-None-Match等于服务器中文件中的hash,则返回给浏览器304,使用缓存,否则重新返回资源

Etag和If-None-Match的区别?

1、在精度上,Etag要优于If-None-Match,If-None-Match的时间单位是秒,如果在一秒内多次改动文件,那么他们的Last-Modify并没有体现出修改,而Etag每次都会改变,确保了精度

2、在性能上,If-None-Match要优于Etag,If-None-Match只需要记录时间,Etag则需要根据算法算出hash

3、在优先级上,服务器会优先考虑Etag

浏览器渲染

推荐看这位同学的总结,很全面:浏览器渲染流程 - 知乎

渲染器的核心就是把HTML、css、js转换为用户可以与之交互的网页,

按照渲染时间的顺序,流水线可以分为以下几个步骤:构建DOM树、样式计算、布局、分层、绘制、分块、光栅化、合成

1、构建DOM树

痛过HTML渲染器将HTML字节流转换为DOM树

2、解析css,生成cssom树

3、根据生成的DOM树和cssom构建一个渲染树

4、接下来是布局(回流),来计算每个模块的大小、颜色和位置

5、最后一步就是绘制,根据计算得出来的页面绘制到浏览器上

通过渲染过程可做的性能优化

1、减少http请求的次数

2、资源合并压缩

3、减少dom操作,否则会引起回流和重构,多操作js

inline-block会有什么问题

1、使用display: inline-block布局块级元素,会使元素之间有空隙

解决方法:

     1、可以使元素写在一行,解决空隙

     2、或者在父元素中将字号设置为0

2、也有可能会出现上下错位的问题

解决办法:

     1、让两个div高度相同

     2、使用vertical-align: top进行对齐

content-type的值

异步任务的执行时间可能会超过所设置的时间

借鉴博文:setTimeout不准时?你大意了_onmessage时间不稳定-CSDN博客

解决超时第一种方法:

思路:获取最开始的时间,然后轮询去查看,如果时间符合就执行

   const loop = (delay, cb, startTime) => {const now = Date.now()if (now - startTime > delay) {cb()return} else {loop(delay, cb, startTime)}}const startTime = Date.now()loop(5000, cb, startTime)

解决超时第二种方法:Web Worker

解决超时第三种方法:window.requestAnimationFrame()

思路:告诉浏览器你需要执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数,回调函数执行次数一般是每秒60次,也就是16.8ms执行一次

   const loop = (delay, cb, startTime) => {const now = Date.now()if (now - startTime > delay) {cb()return} else {requestAnimationFrame(loop(delay, cb, startTime))}}const startTime = Date.now()loop(5000, cb, startTime)

cookie设置以及哪个属性可以不让js修改

name:cookie的名字,一旦创建,无法修改

value:cookie的值

Domain:设置cookie在哪个域名下是有效的

Path:设置域名后的子路径

Expiress/Max-age:cookie的超时时间,当到达此时间后,cookie失效,不设置的话,默认值是session,当网页关闭后就失效

Size:cookie的大小,单位是字节,谷歌浏览器限制cookie最多150条,最大4096字节

HttpOnly:设置为true,不允许修改cookie,也不能获取cookie的值,但发送请求时还是会带上

Secure:设置为true,浏览器只会在https等安全协议下进行传输

Partition Key:限制第三方的cookie

设置为strict:完全限制第三方的cookie

设置为Lax:get请求可以携带cookie,设置Lax或者strict基本可以杜绝CSRF攻击,是谷歌浏览器的默认设置

设置为None:不限制

Priority:定义了low/medium/high三种优先级,当cookie的存入超出限制后,会清除掉低优先级的cookie

前端项目的安全问题

快速排序

核心思想:

1、会先找到一个对比值,一般可选中数组的第一个元素,也就是下标为0的

2、需要连个下标值,即最左端的下标和最右端的下标

3、拿出最右侧的值和对比值进行对比,若是大于,此值不移动,将右侧的下标减减进行移动,然后再次对比,若是还大于就继续减减,否则将值移动到左端下标处

4、经过第三个步骤,开始移动左侧的下表,和中心值进行对比,若是小于,将小标加加向右移动,然后再次对比,若是还小于就继续加加,否则将值移动到右端下表处

5、后面的步骤也是依旧进行递归比对,直到比对的长度为1

时间复杂度

推荐看这个视频,讲解的很好懂:小学生也能看懂的时间复杂度(大概吧)_哔哩哔哩_bilibili

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

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

相关文章

单点故障解决方案之Smart Link与Monitor Link

-SmartLink技术&#xff0c;创建Smart Link 组。在该组中&#xff0c;加入两个端口。其中1个端口是主端口&#xff0c;也称之为Master端口。另外1个端口是备份端口:也称之为 Slave 端口。 -Monitor Link 组也称之为“监控链路组&#xff0c;由上行端口和下行端口共同组成。下行…

kvm虚拟机修改网络模式

kvm修改网络模式可以直接使用virsh命令进行修改 一、查看主机 virsh list --all 二、查看需要修改主机的网络模式 virsh domiflist mysql 三、vim进行修改 cd /etc/libvirt/qemu/ vim mysql.xml 四、找到要修改的网卡部分 五、重新定义虚拟机 virsh define mysql_install.xml…

trie树(前缀树)

前缀树 1. 前缀树的的介绍2.前缀树的实现2.1插入功能2.2删除功能2.3查找前缀和查找单词功能2.4 哈希表版本 1. 前缀树的的介绍 在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是…

微服务 人工智能AI 物联网智慧工地云平台源码

目录 ​编辑 智慧工地架构 智慧工地系统 智慧工地云平台功能模块 1、基础数据管理 2、考勤管理 3、安全隐患管理 4、视频监控 5、塔吊监控 6、升降机监控 7、移动端数据推送 智慧工地管理平台子系统构成 智慧工地物联网解决方案&#xff0c;对工地施工安全人员、设…

数据库分库分表中间件选择

目前分库分表的中间件有三种设计思路&#xff0c;分别是&#xff1a; 采用分散式架构&#xff0c;适用于用Java开发的高性能轻量级OLTP应用程序&#xff0c;以Sharding-JDBC为代表。采用中间层Proxy架构&#xff0c;提供了静态输入和所有语言支持&#xff0c;适用于OLAP应用程…

毁灭交易账户的最快途径:摒弃复仇心态

虽然这听起来像是漫威宇宙最新的超级英雄传奇&#xff0c;但复仇者交易员绝不是英雄。 相反&#xff0c;复仇(报复性)交易者是让人害怕和避免的。他们是那些不承认他们的交易正在亏损&#xff0c;或者拒绝接受他们正在亏损&#xff0c;没有达到他们的日常目标的交易者。这些反英…

Leetcode—63. 不同路径 II【中等】

2024每日刷题&#xff08;115&#xff09; Leetcode—63. 不同路径 II 动态规划算法思想 实现代码 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m obstacleGrid.size();int n obstacleGrid[0].size();…

音频提取使用什么方法?视频提取音频

在数字技术与多媒体日益普及的今天&#xff0c;音频提取已成为一个常见且重要的任务。无论是为了制作视频、编辑音乐&#xff0c;还是进行语音识别和分析&#xff0c;我们都需要从原始材料中提取音频。那么&#xff0c;音频提取通常使用什么方法呢&#xff1f; 1. 使用专业的音…

springboot项目打成含crud操作的sdk集成到springboot启动引擎项目

一 sdk配置操作 1.1 结构 sdk项目目录中只有基础的service类以及mybatis操作数据库的相关文件&#xff0c;service类中包含查询数据库的方法。 说明&#xff1a; 1.2 sdk的pom打包配置 作为公共项目打成jar供其他项目引用&#xff0c;注意被引入的项目不能使用默认的maven…

【MySQL】MySQL5.7版本安装与配置

目录 官网下载配置环境变量添加自定义配置打开命令窗口执行安装命令执行初始化命令启动MySQL服务设置MySQL密码 官网 MySQ官网地址&#xff1a;https://www.mysql.com/ 下载 选择DOWNLOADS 拉到下面 选择MySQL Community Server 默认是8.0版本&#xff0c;选择Archives…

芯片行业ERP管理全流程科普

在现代芯片行业中&#xff0c;企业资源规划(ERP)管理已经成为提升效率、优化资源配置和增强竞争力的关键工具。那么&#xff0c;芯片行业ERP管理的全流程是怎样的呢? 首先&#xff0c;ERP管理的起点是需求分析与规划。在这一阶段&#xff0c;企业需要明确自身的业务需求&#…

可靠性技术之链路聚合(手工模式)

-以太网链路聚合Eth-Trunk:简称链路聚合&#xff0c;通过将多个物理接口捆绑成为一个逻辑接口&#xff0c;可以在不进行硬件升级的条件下&#xff0c;达到增加链路带宽的目的&#xff0c;并且具有防环功能。 在未配置链路聚合时&#xff0c;STP会自动阻塞一条链路&#xff0c;从…