nicenote/docs/interview/compOrigin.md
2023-10-30 09:41:14 +08:00

114 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
nav:
title: 面试
path: /interview
group:
title: 💊 面试题库
order: 2
---
# 计算机原理
## 描述一下cookiessessionStorage 和localStorage的区别
- cookie 在浏览器和服务器之间来回传递SS和LS不会
- SS和LS 的储存空间更大
- SS和LS 有更多丰富易用的接口
- SS和LS 是有各自的储存空间
- LS 储存是永久性的SS 关闭浏览器就没了
## 如何实现浏览器内多个标签之间的通信
- 调用LS Cookies 等本地储存方
## IE6 BUG 的解决办法
- 双边距float引起使用display
- 3像素问题float引起 使用displayinline-3px
- 超链接 hover 点击失效, 注意顺序
- 无法定义1px左右的宽度容器使用overflowhiddenzoom0.08line-height1px
## 你有哪些性能优化的方法
- 减少http请求次数cssjshtml压缩图片大小控制和压缩网页cdn托管data缓存图片服务器
- 前端模板 js + 数据减少由于html导致的带宽浪费减少请求次数
- 图片预加载,将样式表放在头部,脚本放在底部,加上时间戳
- 用innerHTML代替dom操作减少dom操作次数优化js性能
- 当需要设置的样式很多时设置className而不是直接操作dom
- 按需加载三方库、如果是单页应用则按需加载路由页面
- 开启gzip模式
- 避免在页面的主体布局中使用tabletable要在其中的内容完全下载完之后才会完全显示显示div+css布局慢。普通网站有一个普遍的思路就是尽量向前端化减少数据库操作减少磁盘IO
- 前端化在不影响功能和体验的情况下能在浏览器执行的不要在服务器执行能在缓存服务器上直接返回的不要到应用服务器程序能直接取到的结果不要到外部取本机能取到的不要到远程取内存能取到的不要到磁盘取缓存中有的不要去数据库查询多用localstoragesessionstorage、cookie
- 减少数据库操作指减少更新次数缓存结果减少查询次数将数据库执行的操作尽可能的让你的操作完成减少磁盘IO指尽量不适用文件系统作为缓存减少读写文件次数等。
- 程序优化永远要优化慢的部分
- 图片加载使用懒加载、列表滚动使用虚拟滚动
## http 状态码有哪些?分别代表啥意思?
- 100-199 用于指定客户端相应的某些动作
- 200-299 用于表示请求成功
- 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息
- 400-499 用于指出客户端的错误。
> 400: 语义有误 401当前请求需要用户验证 403: 服务器已经理解请求,但是拒绝执行他 404页面找不到
- 500-599 用于支持服务器错误。501 服务器不可用
## http 缓存策略
分为强制缓存和协商缓存。
强制缓存分为三种情况1. 没找到直接发起请求2. 找到了但是缓存结果没有失效直接使用缓存3. 找到了但是失效了就会去使用协商缓存
一般强制缓存的标识字段为 Expireshttp1.0,指定过期时间) 和 Cache-controlhttp1.1, public/private/no-cache/no-store,后者可以搭配 max-age 控制过期时间使用
协商缓存是强制缓存失效了,浏览器携带标识向服务端发起请求,服务器通过缓存标识决定是否使用缓存的过程。
协商缓存的字段为last-modified / if-modified-since 和 Etag / if-none-match后者优先级更高。
缓存的流程是请求报文向服务器发送last-modified 或者 etag字段如果和服务端对应的字段一致则服务端使用缓存返回304否则失效重新请求200
## 一个页面从输入 url 到页面显示完成,中间发生了什么?
- 查找浏览器缓存
- DNS 解析查找该域名对应的IP重定向301这里如果做了nginx配置的话会有一个负载均衡的发放一般在有大型IO的项目会处理发出第二个 get 请求
- 进行HTTP 协议对话
- 客户端发送报头,我需要什么类型的文档
- 如果是html文档开始下载
- 文档树建立根据标记请求所需指定mime类型的文件
- 文件显示
- 浏览器这边做的工作大致分为以下几步:
> 加载根据请求的url进行域名解析向服务器发起请求接受文件htmljscss图像等
> 解析对加载到的资源htmljscss进行语法解析建议相应的内部数据结构比如html的dom树js的属性表css的样式表规则等等
## 浏览器的渲染原理
![image.png](./img/htmlRender.png)
1浏览器会解析三个东西
- 一个是HTML/SVG/XHTML事实上Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。
- CSS解析CSS会产生CSS规则树。
- Javascript脚本主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree.
2解析完成后浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree。注意
- Rendering Tree 渲染树并不等同于DOM树因为一些像Header或display:none的东西就没必要放在渲染树中了。
- CSS 的 Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。
- 然后计算每个Frame也就是每个Element的位置这又叫layout和reflow过程。
3最后通过调用操作系统Native GUI的API绘制。
## 并发concurrency和并行parallelism区别
异步和这小节的知识点其实并不是一个概念,但是这两个名词确实是很多人都常会混淆的知识点。其实混淆的原因可能只是两个名词在中文上的相似,在英文上来说完全是不同的单词。
并发是宏观概念,我分别有任务 A 和任务 B在一段时间内通过任务间的切换完成了这两个任务这种情况就可以称之为并发。
并行是微观概念,假设 CPU 中存在两个核心,那么我就可以同时完成任务 A、B。同时完成多个任务的情况就可以称之为并行。