好久好久没写博客了,但在这期间参与了多场面试,最后成功进入宇宙厂,现在来汇总一下面试期间遇到的各种问题(文章写于刚入职时,上传时已在职6个月)
跨域的options请求问题
这个问题是笔者在写新人项目的时候,遇到跨域问题的时候问到的
首先我们要知道什么是options请求,options请求也可以叫预检请求,是浏览器在发送复杂请求时,主动发起的请求,他发生在发起复杂请求之前,那么什么是复杂请求?
简单请求
- 请求方式为GET,HEAD,POST的请求
- 认为设置规范集合之内的首部字段,如Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width
- Content-Type 的值仅限于下列三者之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain
- 请求的xml对象没有任何事件监听器
- 请求中没有使用ReadableStream对象
复杂请求
- PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH;
- 人为设置了以下集合之外首部字段,即简单请求外的字段;
- Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain。
那么对于options请求,最在意的是什么?
请求头 Request Header:
字段 | 作用 |
---|---|
Access-Control-Request-Method | 实际请求的方法 |
Access-Control-Request-Header | 实际请求将携带的自定义请求头字段 |
响应头 Response Header:
字段 | 作用 |
---|---|
Access-Control-Allow-Methods | 表明服务器允许的方法 |
Access-Control-Allow-Origin | 允许跨域请求的域名,所有的为* |
Access-Control-Allow-Headers | 服务器接受的请求头字段 |
Access-Control-Max-Age | 制定预检请求能缓存多久 |
options的请求目的是为了判断资源是否支持跨域,所以我们可以为其添加缓存时间,一般多一点没什么问题
如果jsonp支持跨域,那么为什么不都用jsonp,jsonp的本质是什么
jsonp请求的本质是利用了“Ajax请求会受到同源策略限制,而script标签不会”,所以他的本质是绕过了同源策略来发起请求获取数据
jsonp只支持get请求,并且jsonp存在xss漏洞
script标签的async和defer分别有什么作用
这里我们先拓展一下什么是同步加载,异步加载,延迟加载
- 加载和解析 顺序: 浏览器在 解析 HTML 页面代码时, 是 从上到下 依次 加载, 解析、渲染
- 同步加载完成后, 立刻执行脚本(脚本分为加载和执行两个阶段), 直到脚本加载和执行完成,才能进行页面的解析/渲染/显示。
- 也就是说,如果我的script执行时间很长,会导致浏览器停止渲染,页面阻塞
- 我们可以写一个代码来测试
async异步加载
- async加载是异步的,而执行是同步的
- 其在下载完毕之后会立刻执行同步代码(可能是页面解析之前,也可能是页面解析之后)
- 这就意味着,如果你的加载非常快,可能在页面解析时打断页面解析
defer延迟加载
- defer的加载是异步的,执行是延迟执行
- 延迟执行是在页面完成解析后再执行
- 这意味着,加载和执行都不会打断页面的解析
参考文献:【深入理解 script 标签的 async,defer 属性(同步加载,异步加载,延迟执行)】(至于为什么没连接,因为是byteTech的文章)
nodeType都有什么值
这个我甚至没听说过,当时也没回答出来(非当前公司),好像是一个只读属性,可以知道当前对象是什么节点
例如元素,文本,注释
nodeType值 | 表示 |
---|---|
1 | 元素 |
2 | 属性 |
3 | 文本 |
8 | 注释 |
9 | document |
这里留一个地址
https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType
Q.E.D.