字节面试问题

实现三列布局的方法

第一种:可以使用浮动+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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向日葵、Todesk、teamviewer等工具远程连接电脑时第三方应用显示白屏

问题描述&#xff1a;用向日葵远程等桌面时&#xff0c;当把显示器断电或者就没有显示器时或者笔记本盖子合住时&#xff0c;第三方软件显示白屏或显示不出来的问题。 原因&#xff1a;某些显卡在断开屏幕时自动降为低功耗模式。 解决 1、下载工具 https://www.amyuni.com/d…

前后端依赖下载上传

在某些情况下&#xff0c;可能需要在没有互联网连接的环境中进行构建或部署。通过提前下载所有依赖&#xff0c;你可以将它们保存在本地&#xff0c;然后在没有网络连接时使用&#xff0c;提高构建或部署的效率。 前端下载依赖 脚本getTzgUrl.js const { readFileSync, writ…

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过&#xff0c;所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式&#xff0c;只有两列&#xff0c;第一列是标签&#…

基于springboot+vue的城镇保障性住房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

大工程 从0到1 数据治理 之数据模型和设计篇(sample database classicmodels _No.7)

大工程 从0到1 数据治理 之数据模型和设计篇 我这里还是sample database classicmodels为案列&#xff0c;可以下载&#xff0c;我看 网上还没有类似的 案列&#xff0c;那就 从 0-1开始吧&#xff01; 文章目录 大工程 从0到1 数据治理 之数据模型和设计篇什么是数据模型设计…

【Java程序设计】【C00321】基于Springboot的在线租房和招聘平台(有论文)

基于Springboot的在线租房和招聘平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线租房和招聘平台&#xff0c;本系统有管理员、用户、房东以及公司四种角色&#xff1b; 管理员&#xff1a;首页、个人中心…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

蓝桥杯_中断系统

一 中断 中断&#xff0c;即cpu暂停执行当前程序&#xff0c;转而执行另外一段特殊程序&#xff0c;处理结束后。返回之前暂停程序继续执行。 中断向量&#xff0c;中断服务程序的入口地址&#xff0c;每个中断源都对应一个固定的入口地址。 中断服务函数&#xff0c;内核响应中…

仿牛客网项目---用户注册登录功能的实现

从今天开始我们来写一个新项目&#xff0c;这个项目是一个完整的校园论坛的项目。主要功能模块&#xff1a;用户登录注册&#xff0c;帖子发布和热帖排行&#xff0c;点赞关注&#xff0c;发送私信&#xff0c;消息通知&#xff0c;社区搜索等。这篇文章我们先试着写一下用户的…

重拾前端基础知识:HTML

重拾前端基础知识&#xff1a;HTML 前言HTML编辑器标签锚链接 id和class表单Iframe字符实体HTML CSSHTML JavaScriptHTML 统一资源定位器(Uniform Resource Locators)XHTMLHTML5新的语义化元素视频和音频支持Canvas绘图本地存储表单增强Web Workers地理定位Web存储伸缩矢量图形…

《TCP/IP详解 卷一》第10章 UDP和IP分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子&#xff1a;IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…

2024深度学习主流框架对比

tensorFlow 是最受欢迎和广泛使用的深度学习框架之一&#xff0c;目前在github的start数为181k。 TensorFlow是一个由Google Brain团队开发的开源深度学习框架。它允许开发者创建多种机器学习模型&#xff0c;包括卷积神经网络、循环神经网络和深度神经网络等&#xff0c;该框架…

全国产飞腾E2000Q +复旦微FPGA的轨道交通、电力解决方案

产品概述 ITX-XMF201是一款高性能边缘计算网关主板&#xff0c;采用飞腾E2000Q 4核处理器&#xff0c;国产化率达到95%国产化。 板载2电口&#xff0c;2路CAN&#xff0c;6路RS232接口&#xff0c;1路RS485接口&#xff0c;16路GPIO&#xff0c;可以满足银行、轨道交通、电力等…

【ArcGIS Pro二次开发】(83):ProWindow和WPF的一些技巧

在ArcGIS Pro二次开发中&#xff0c;SDK提供了一种工具界面【ArcGIS Pro ProWindow】。 关于ProWindow的用法&#xff0c;之前写过一篇基础的教程&#xff1a; 【ArcGIS Pro二次开发】(13)&#xff1a;ProWindow的用法_arcgispro二次开发教程-CSDN博客 主要是对几个常用控件…

Java开发的核心模式 - MVC

文章目录 1、MVC设计模式2、Web开发本质3、服务器的性能瓶颈 1、MVC设计模式 MVC设计模式示意图 在整个Java学习之旅中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;设计模式无疑占据着极其重要的地位&#xff0c;堪称理解和掌握Java项目开发精髓的钥匙。如…

【Python】Python实现串口通信(Python+Stm32)

&#x1f389;欢迎来到Python专栏~Python实现串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望…

3D数字孪生

数字孪生&#xff08;Digital Twin&#xff09;是物理对象、流程或系统的虚拟复制品&#xff0c;用于监控、分析和优化现实世界的对应物。 这些数字孪生在制造、工程和城市规划等领域变得越来越重要&#xff0c;因为它们使我们能够在现实世界中实施改变之前模拟和测试不同的场景…

Spring 类型转换、数值绑定与验证(三)— Formatting 与 Validation

1 Formatting 在Spring中用于格式化数据及根据地域展示不同格式的数据。 图 Formatting接口 UML 1.1 注解驱动Formatting 自定义像“DateTimeFormat”注解来对相关字段格式化的步骤为&#xff1a; 自定义注解。定义一个实现AnnotationFormatterFactory接口的工厂类。往容器…

H3C OSPF Stub特殊区域+认证实验

H3C OSPF Stub特殊区域认证实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;所有路由器配置环回口 IP 地址为 X.X.X.X/32​ 作为 Router-id&#xff0c;X 为设备编号&#xff08;R5 除外&#xff09;按照图示分区域配置 OSPFR1 上配置默认路由&#xff0c;指…

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷&#xff1a; 2. 数据卷容器&#xff1a; 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直…