杂七杂八的问题

url输入到渲染出页面的过程

浏览器怎么渲染前端界面

什么是reflow(重排,回流)和repaint(重绘)?

reflow:浏览器要花时间去渲染,当它发现了某个部分发生了变化并且影响了布局,就需要倒回去重新渲染

repaint:如果只是改变了某个元素的背景颜色或文字颜色等,不影响元素周围或内部布局,就只会引起浏览器的repaint,重画其中一部分。

reflow比repaint更花费时间,也就更影响性能,所以在写代码时应尽量避免过多的reflow。

什么时候会引起reflow

(1)页面初始化的时候

(2)操作DOM的时候(增加或删除DOM元素)

(3)某些元素的尺寸改了(边距,填充,边框,宽高)

(4)CSS的属性发生变化(隐藏display:none)

(5)内容改变(文本改变或图片改变而引起的的计算值的宽高改变)

(6)浏览器窗口尺寸改变(当resize事件发生时)

如何减少reflow

(1)不要逐个修改DOM样式,可以预先定义好css的class,然后修改DOM的className,将多个需要进行相同操作的元素一次修改

(2)不要把DOM结点的属性值放在一个循环里当成循环的变量

(3)当动画元素使用fixed或absolute的position时(脱离了文档流),那么在修改他们的CSS时不会发生reflow

(4)不要使用table布局,因为可能很小的一个改动都会造成整个table的重新布局

(5)在内存中多次操作结点,完成后再添加到文档中去

(6)如果要对一个元素进行复杂的操作,可以先隐藏它(display:none),操作完成后再显示

(7)对于需要经常取出的引起浏览器重排的属性值,要缓存到变量中

浏览器的同源策略

什么是同源

同源是指三个相同:

  • 协议相同
  • 域名相同
  • 端口相同
    在这里插入图片描述

为什么要用同源策略

防止恶意的网站窃取数据。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

非同源会有三种行为受到限制

  • Cookie、LocalStorage和IndexDB无法读取
  • DOM无法获得
  • AJAX请求不能发送

不受同源限制的:

  • 页面中的链接,重定向以及表单提交
  • 跨域资源(图片什么的)的引入是可以的,但是js不能读写加载的内容。(如< script src=…>< /script >,< img >,< link>,< iframe >)

跨域

受同源策略的限制,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象,就需要跨域。

解决跨域

  • 降域 document.domain
  • 设置窗口片段标识符,监听读取location.hash
  • window.name
  • HTML5的postMessage方法
  • LocalStorage
  • JSONP
  • WebSocket
  • CORS

JSONP

主要是通过script标签的src不存在跨域问题而产生的解决方法。例子如下所示

JSONP的缺点

  1. 它只支持GET请求而不支持POST等其它类型的HTTP请求
  2. 它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
  3. jsonp在调用失败的时候不会返回各种HTTP状态码。
  4. 缺点是安全性。万一假如提供jsonp的服务存在页面注入漏洞,即它返回的javascript的内容被人控制的。那么结果是什么?所有调用这个 jsonp的网站都会存在漏洞。于是无法把危险控制在一个域名下…所以在使用jsonp的时候必须要保证使用的jsonp服务必须是安全可信的。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
</head>

<body>
    <div id="mydiv">
        <button id="btn">点击开始JSONP请求</button>
    </div>
</body>
<script type="text/javascript">
    function handleResponse(response) {
        console.log(response);
    }
</script>
<script type="text/javascript">
    window.onload = function () {

        var oBtn = document.getElementById('btn');

        oBtn.onclick = function () {

            var script = document.createElement("script");

            // callback=handleResponse就是在请求成功后调用handleResponse函数
            script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
            document.body.insertBefore(script, document.body.firstChild);
        };
    };
</script>

</html>

CORS

这个是后端操作的,前端不用管
主要是后端通过设置"Access-Control-Allow-Origin", "*"响应头告知浏览器这个请求回来的结果可以给前端界面

注意重点来了
并不是所有的跨域请求结果都是被浏览器拦截从而使得前端得不到。而是有一些跨域请求是压根浏览器就不会给你发出去。这就需要将请求分为简单请求复杂请求简单请求浏览器会发送跨域请求给服务端并且会接收到请求数据。复杂请求时浏览器会提前发送一个option请求来试一下当前域名是否符合人家服务端允许的跨域请求范围,如果不符合浏览器是不会给你发这个跨域请求的。

区分简单请求复杂请求

浏览器判定请求是否为简单请求要同时满足以下四个条件:

  1. 使用下列方法之一:
  • GET
  • HEAD
  • POST
  1. 只使用了如下的安全 Header,不得人为设置其他 Header
  • text/plain
  • multipart/form-data
  • application/x-www-form-urlencoded
  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type
  1. 请求中的任意 XMLHttpRequest 对象均没有注册任何事件监听器;XMLHttpRequest 对象可以使用 XMLHttpRequest.upload 属性访问。
  2. 请求中没有使用 ReadableStream 对象。

session和cookie的区别

cookie(存在本地浏览器)

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie
客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,
以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
实际就是颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理
cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些Cookie,如果 Cookie 很多,这无形地增加了客户端与服务端的数据传输量,
而 Session 的出现正是为了解决这个问题。同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 是客户端第一次访问服务器的时候生成的, 而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NANE 为JSESIONID 的一个 Cookie。
在这里插入图片描述

缺点:

  • cookie可以被用户禁止
  • cookie不安全(对于敏感数据,需要加密)
  • cookie只能保存少量的数据(大约是4k),cookie的数量也有限制(大约是几百个),不同浏览器设置不一样,反正都不多
  • cookie只能保存字符串

优点:

  • 对服务器压力小

session(存在服务器上)

Session机制是一种服务端的机制,服务器使用一种类似散列表的结构来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端里的请求里是否已包含了一个session标识–sessionID,
如果已经包含一个sessionID,则说明以前已经为此客户端创建过session,服务器就按照sessionID把这个session检索出来使用
如果客户端请求不包含sessionID,则为此客户端创建一个session并且声称一个与此session相关联的sessionID,
sessionID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串(服务器会自动创建),这个sessionID将被在本次响应中返回给客户端保存。

缺点:

  • 当用户访问量很大时,对服务器压力大
  • 一般是寄生在Cookie下的,当Cookie被禁止,Session也被禁止

区别

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到, 由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的

cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie

单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。

可以将登陆信息等重要信息存放为session。

TCP三次握手

TCP四次挥手

2021.12.3快手一面问的关于函数作用域的问题

滴滴一面问的全排列问题

在浏览器输入URL回车之后发生了什么?

HTML元素属性href和src的区别

href是元素或文档与指定资源联通,是引用;
src是下载后嵌入构成文档直接内容。

src会阻塞其他资源的下载和处理,直到资源下载,渲染完毕才会进行下一步操作

localstorage、sessionstorage、cookie的区别

  1. 存储大小
    cookie:一般不超过4k
    sessionStorage:5M甚至更多
    localStorage:5M甚至更多
  2. 数据有效期
    cookie:一般由服务器生成,可以设置失效时间;若没有设置时间,关闭浏览器cookie失效,如果设置了时间,cookie就会存储在硬盘中,过期失效
    sessionStorage:仅在当前浏览器窗口关闭之前有效,关闭页面或者浏览器会被清除
    localStorage:永久有效,窗口或者浏览器关闭也会一直保存,除非手动永久删除
  3. 通信
    cookie:cookie在浏览器和服务器之间来回传递,如果使用cookie保存过多数据会造成性能问题
    sessionStorage:仅在客户端(浏览器)中保存,不参与服务器的通信
    localStorage:仅在客户端(浏览器)中保存,不参与服务器的通信
  4. 应用场景
    cookie:判断用户是否登录过网站,以便实现下次自动登录或记住密码;保存事件信息
    sessionStorage:敏感账号一次性登录,单页面用的较多
    localStorage:用于长期登录,适于长期保存在本地的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值