1. Http面试题
- 我的博客需要缩宽页面观看,图片无法均放,很抱歉。
1. HTTP状态码
1. 状态码分类
301 永久重定向
~ 前端发了个请求到这个网址上,这个网址如果是 返回301配合一个location新网址 ,就到新网址去找。
~ 比如一个网站,域名到期了 或想换域名了,这时老网址就可以返回一个301 永久重定向,配合loaction 新域名,浏览器记住了这件事,就不会再去访问老域名了302 临时重定向
~只是这一次,请求网站,返回一个302 临时的重定向,配合loaction 新地址。 下次再访问网站还是访问 未302之前的 地址域名。
~下次还访问老地址,看看有什么新指令,是不是就不返回302了,或者 域名又改变了。反正它就是一次一次来,我也不嫌烦。
下面演示302,307也是和302一个意思
- 短网址,意思就将比较长的链接网址,缩短网址,这个短网址通过302条跳转访问长链接
- 304资源未被修改
~ 304 就是说,我们想去向服务端请求资源,比如向服务端 请求一个页面,js或css等都可以。
~ 这时 如果服务端返回一个 200,它会同时把以前的资源全部请求过来,返回200,就是请求成功。
~ 有些情况下,你的浏览器已经请求过了。比如今天刚访问的这个网址,再次访问这个网址,发一个同样的请求。
~ 服务端有可能会告诉你已经请求过了,也就是304,你刚刚请求的资源,已经请求过了,现在还没有过期,你可以继续使用你本地的缓存的结果
2. 协议和规范
传统http methods 和 现在 http methods方法
2.Http 有哪些常见的 header
1. 常见的 Request headers 请求头
Accept-Encoding
服务端接受请求,往客户端端发送信息,比如说有一个100kb资源使用gzip压缩后是30kb,浏览器根据压缩算法进行解压
2. 常见的 Response headers 响应头
3. HTTP 缓存相关
1. HTTP缓存介绍
Http 缓存
可以将一些没有必要重新获取一遍的数据,不在重新获取,不管以什么方式,本地缓存也好,服务端缓存也罢等给它暂存一份,减少资源浪费,这就是缓存。
为什么需要缓存
~ cpu计算可以做到 毫秒级,比较慢的就是网络请求。
— 通过网络缓存,减少网络请求的数量,体积。让资源加载页面渲染更快一些。
— 网络请求是不稳定的,比如在偏远地区,过隧道啊,这种网络不稳定性,就加剧了页面加载的一个不稳定性。因此需要缓存。哪些资源可被缓存
— 网页html是不能被缓存的,它随时会更新,时刻要保持最新的html去下载。
— 比如 我们去访问csdn 一篇博客,它业务数据模块,随时会更新,随时会修改,删除,新增一篇新博客,所有不容易被缓存。静态资源可以被缓存,如js css img
— 如 webpack 打包的时候 会加一个 [contenthash]哈希后缀 ,一般不会改动。
— 如果发生改动 会生成一个新的 hash哈希文件名,它是可以被缓存的。
1. HTTP 强制缓存
2. HTTP 缓存-协商缓存(也叫对比缓存)
4. HTTP 和 HTTPS
5. 中间人攻击
---- 以非对称加密来说,它是安全的,即使黑客拿到了pukey,获取到了 xxx密文 也无法解密,因为服务端是使用key私钥来解密的,key没有进行传输,一直在服务端所有 它是安全的。
-----但前提是key私钥没有被人掉包
到这一步,反着看图按图片标记的顺序 1 2 3看。
6. HTTPS 加密,非对称与对称加密图解
http面试题到此结束
2. 运行环境
1. 从输入url到渲染页面的整个过程?
比如页面有个div标签,网速比较慢时,标签内文字先渲染出来,然后发现body下又css, 字体50px,这时页面 字体先展示正常大小,在突然变大50px
2. window.onload 和DOMContentLoaded 区别?
建议使用DOMContentLoaded
3. 性能优化
webpack合并文件
防抖
fn.apply(this, arguments)
表示调用函数 fn 并将 this 绑定到指定的上下文对象,arguments 是传递给函数 fn 的参数列表。这个语法允许我们在不知道参数个数的情况下调用函数。其中 apply 是 JavaScript 中的一个函数方法,它允许我们调用一个函数并指定 this 上下文和参数。
节流
4. XSS 跨站请求攻击及预防?
5. XSRF 跨端请求伪造攻击?
面试真题
1. var 和 let const 的区别
2. typeof 能判断哪些类型?
3. 列举强制类型转换和隐式类型转换
4. 手写深度比较,模拟lodash isEqual
---- isEqual是一个用于比较两个对象是否相等的函数。
----- 通常用于判断两个对象是否具有相同的属性和属性值。
----- 它可以用于比较JavaScript中的所有数据类型,包括简单数据类型和对象类型。
5. split( ) 和 join( ) 的区别
6. 数组的 pop push unshift shift 分别是什么?
在JavaScript中,数组是一种常用的数据类型,它可以存储多个值。pop、push、unshift和shift都是数组的方法,用于添加或删除数组中的元素。具体如下:
注意!!!以下四个都是对原数组进行了改变,都不是纯函数,它们有副作用
以上四个方法是数组中常用的元素操作方法,可以方便地添加和删除元素。
7.数组的API,有哪些是纯函数?
8. 数组 slice 和 splice的区别 ?
9. [10, 20, 30].map(parseInt) 会输出什么值?
10. ajax请求 get 和 post的区别 ?
11. 函数 Call 和 apply 的区别 ?
call()方法使用示例:
apply()方法使用示例:
call()定义:
调用一个对象的一个方法,以另一个对象替换当前对象。
调用call的对象必须是个函数function
call的第一个参数将会是function改变上下文后指向的对象,如果不传,将会默认是全局对象window
第二个参数开始可以接收任意个参数,这些参数将会作为function的参数传入function
apply()定义:
- 应用某一对象的一个方法,用另一个对象替换当前对象。
- 与call方法的使用基本一致,但是只接收两个参数,其中第二个参数必须是一个数组或者类数组
这也是这两个方法很重要的一个区别
异同
-
1. 相同点
-
都能够改变方法的执行上下文(执行环境),将一个对象的方法交给另一个对象来执行,并且是立即执行
-
2.不同点
-
call方法: 从第二个参数开始可以接收任意个参数,每个参数会映射到相应位置的function的参数上,可以通过参数名调用,但是如果将所有的参数作为数组传入,它们会作为一个整体映射到function对应的第一个参数上,之后参数都为空。
-
apply方法: 最多只有两个参数,第二个参数接收数组或者类数组,但是都会被转换成类数组传入function中,并且会被映射到function对应的参数上
-
更简单地说,apply和call功能一样,只是传入的参数列表形式不同:
-
如 fn.call ( this,var1,var2,var3 )
-
对应的apply写法为:fn.apply ( this, [var1,var2,var3] )
-
fn.apply ( this , arguments )
两个方法该如何选择?
-
根据你要传入的参数来做选择,不需要传参或者只有1个参数的时候,用call,当要传入多个对象时,用apply。
-
如果需要传入的参数已经是一个数组或者类数组了,就用apply,如果还是单独的需要逐个传入的,可以考虑使用call(如果你不嫌麻烦的话 )
如果 面试问到异同点如何回答?
- 相同点:两个方法产生的作用是完全一样的,都用来改变当前函数调用的对象。
- 调用的参数不同,比较精辟的总结:
- 具体的使用
call的使用
apply ( )使用
- apply与call的功能几乎一样,第一个参数意义都一样,只是第二个参数有点不同apply传入的是一个参数数组。
- 也就是将多个参数组合成为一个数组传入,call从第二个参数开始,依次传值给调用函数的参数
- 代码比较
bind方法 ,都到这里了 看完得了
- bind() 方法和前两者不同在于:
- bind() 方法会返回执行上下文被改变的函数而不会立即执行
- 而前两者是直接执行该函数。他的参数和call()相同。
- bind 除了返回是函数以外,它的参数和 call 一样。
当然,三者的参数不限定是 string 类型,允许是各种类型,包括函数 、 object 等等!
- bind() 函数会创建一个新函数(称为绑定函数)
- 新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的call属性)。
- 当目标函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。
- 一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。