JavaScript
1. JavaScript和Java比较
- 基于对象和面向对象:Java是一种真正的面向对象的语言,需要设计对象;JavaScript是一种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象和事件驱动的编程语言。
- 解释和编译:Java 的源代码在执行之前,必须经过编译;JavaScript 是一种解释性编程语言,由浏览器解释执行;
- 强类型变量和弱类型变量
- 代码风格不同
- 并发方法不同:基于线程和基于事件
2. let和var以及const的区别,这种区别本质上是什么?
- var:函数作用域 变量提升 可重复定义
- let:块作用域 无变量提升 不可重复定义
- const和let基本相同,唯一重要区别在于const声明变量时必须初始化变量,且不能修改变量
3. js作用域
作用域是可访问变量的集合。
- 全局作用域
- 函数作用域
- 块级作用域
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前执行的代码所在环境的变量对象。
4. js闭包
闭包就是能够读取其他函数内部变量的函数
闭包可以用在许多地方。它的最大用处有两个:
- 读取函数内部的变量
- 让函数内部变量的值始终保持在内存中。
不能滥用闭包:
- 会使得函数中的变量都被保存在内存中,内存消耗很大
- 闭包会在父函数外部,改变父函数内部变量的值
详细讲解
5. js异步编程
- 回调函数
- 事件监听:采用事件驱动模式。任务的执行不取决于代码的顺序,而取决于某个事件是否发生。
- 发布/订阅
- Promises对象:Promise 对象代表了未来将要发生的事件,用来传递异步操作的消息,为异步编程提供统一接口。
详细讲解
6. 介绍一下js的数据类型有哪些,值是如何存储的
JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(es6新增,表示独一无二的值)和BigInt(es10新增);
1种引用数据类型——Object(Object本质上是由一组无序的名值对组成的)。里面包含 function、Array、Date等。JavaScript不支持任何创建自定义类型的机制,而所有值最终都将是上述 8 种数据类型之一。
原始数据类型:直接存储在栈(stack)中,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
引用数据类型:同时存储在栈(stack)和堆(heap)中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
7. 遍历对象的方法
- for ... in 循环遍历对象自身的和继承的可枚举属性(不含Symbol属性).
- Object.keys(obj),返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).
8. JavaScript 原型,原型链? 有什么特点?
在 js 中我们是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性值,这个属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当我们使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。一般来说我们是不应该能够获取到这个值的,但是现在浏览器中都实现了 proto 属性来让我们访问这个属性,但是我们最好不要使用这个属性,因为它不是规范中规定的。ES5 中新增了一个 Object.getPrototypeOf() 方法,我们可以通过这个方法来获取对象的原型。
当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是Object.prototype 所以这就是我们新建的对象为什么能够使用 toString() 等方法的原因。
特点:
JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与
之相关的对象也会继承这一改变
Vue
1.Vue和jQuery的区别
jQuery是使用选择器( $ )选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。它还是依赖DOM元素的值。
Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。
vue侧重数据绑定,jquery侧重样式操作,动画效果等
2. MVVM
- View层:视图层
在前端开发中,通常就是DOM层,主要的作用是给用户展示各种信息。 - Model层:数据层
数据可能是我们固定的死数据,更多的是来自我们服务器,从网络上请求下来的数据。 - ViewModel层:视图模型层
视图模型层是View和Model沟通的桥梁。一方面它实现了Data Binding,也就是数据绑定,将Model的改变实时的反应到View中;另一方面它实现了DOM Listener,也就是DOM监听,当DOM发生一些事件(点击、滚动、touch等)时,可以监听到,并在需要的情况下改变对应的Data
浏览器
1. 浏览器缓存
https://blog.csdn.net/qq_37674616/article/details/94414002
网页布局
1. flex布局
弹性布局,用来为盒状模型提供最大的灵活性。
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
计算机网络
1. 从浏览器输入网址到界面显示的过程是怎样的?
1、应用层:DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话,然后通过运输层TCP协议封装数据包,在TCP协议基础上进行传输
2、运输层:HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作
3、网络层:为数据包选择路由,IP协议进行主要工作
4、数据链路层:相邻结点的可靠传输,ARP协议将IP地址转成MAC地址。
2.能否详细解释一下从DNS服务器拿到IP地址后,网络中是如何根据IP地址访问指定设备的?以及TCP的下几层在这个过程中的作用?
拿到IP地址之后,首先会将包传输给最近的网关(比如我现在在家的这台电脑,就会发送给我客厅的路由器),然后首先路由器会检测目的ip是不是自己局域网内的ip,如果是的话就直接发送,如果不是的话,会查询路由表找到下一跳的ip地址(这里的路由表是在网络层中根据路由算法得到的),然后再在数据链路层根据ARP协议找到ip对应的mac地址,然后再通过物理层将比特传输给下一个路由器。然后这样反复寻找,直到找到目的机器位置。
tcp在传输层
网络层的作用有路由算法,完成点到点的传输
数据链路层,通过ARP协议找到目的ip地址的mac地址
物理层,通过媒介传输比特
3.TCP的关闭需要几次挥手?挥手的次数能否更少?是否了解半关闭?
tcp是全双工通信,服务端和客户端都能发送和接受数据,tcp在断开连接时,需要服务端和客户端都确定对方将不再发送数据。
第1次挥手
由客户端向服务端发起,服务端收到信息后就能确定客户端已经停止发送数据。
第2次挥手
由服务端向客户端发起,客户端收到消息后就能确定服务端已经知道客户端不会再发送数据
第3次挥手
由服务端向客户发起,客户端收到消息后就能确定服务端已经停止发送数据。
第4次挥手
由客户端向服务端发起,服务端收到信息后就能确定客户端已经知道服务端不会再发送数据。
为什么不是3次挥手
在客户端第一次挥手时,服务端可能还需要发送数据,完成未完成的工作,所以第2次挥手和第3次挥手不能合并。
半关闭(服务端的close_wait状态)
半关闭(half-close)提供了这样一种能力:套接字连接的一端可以终止其输出,同时仍就可以接收来自另一端的数据。这是一种很典型的情况,例如我们在向服务器传输数据,但是并不知道要传多少数据。在向文件写数据时,我们只需在数据写入后关闭文件即可。但是,如果关闭一个套接字,那么与服务器的连接将立刻断开,因而也就无法读取服务器的响应了。使用半关闭的方法就可以解决上述问题。可以通过关闭一个套接字的输出流来表示发送给服务器的请求数据已经结束,但是必须保持输入流处于打开状态。
4.tcp/udp的区别
- TCP提供面向连接,可靠的数据流传输,而UDP提供的是非面向连接的,不可靠的数据流传输。
- TCP传输单位称为TCP报文段,UDP传输单位称为用户数据报
- TCP注重数据安全性,UDP数据传输快,因为不需要连接等待,少了许多操作,但是其安全性却一般
- TCP是点对点连接的,UDP是一对一,一对多,多对多都可以
- TCP适合于网页邮件等,UDP适合于视频,语音广播
<u style="">TCP对应的协议有</u>:
FTP:文件传输协议21端口
Telnet:一种用于远程登录的协议23端口
SMTP:邮件传输协议25端口
HTTP:Web服务器的超文本传输协议
<u style="">UDP对应的协议有:</u>
DNS:域名解析服务
SNMP:简单网络管理协议,用来管理网络
TFTP:简单文件传输协议
TCP和UDP的优缺点
TCP
缺点:
[1] 三次握手四次挥手,传输更多包,浪费一些带宽
[2] 为了进行可靠通信,双方都要维持在线,通信过程中服务器server可能出现非常大的并发连接,浪费了系统资源,甚至会出现宕机
[3] 确认重传也会浪费一些带宽,且在不好的网络中,会不断的断开和连接,降低了传输效率
UDP
优点:
[1] 没有握手,起步快延时小
[2] 不需要维持双方在线,server不用维护巨量并发连接,节省了系统资源
[3] 没有重传机制,在不影响使用的情况下,能更高效的利用网络带宽
5.tcp的拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞。
在计算机网络中数位链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。
若出现拥塞而不进行控制,整个网络的吞吐量将随输入负荷的增大而下降。
当输入的负载到达一定程度 吞吐量不会增加,即一部分网络资源会丢失掉,网络的吞吐量维持在其所能控制的最大值,转发节点的缓存不够大这造成分组的丢失是拥塞的征兆。
TCP的四种拥塞控制算法
1.慢开始
2.拥塞控制
3.快重传
4.快恢复
假定:
1.数据是单方向传送,而另一个方向只传送确认
2.接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定
3.以TCP报文段的个数为讨论问题的单位,而不是以字节为单位
示例如下:
传输轮次:发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间就是往返时间RTT(RTT并非是恒定的数值),使用传输轮次是为了强调,把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认,拥塞窗口cwnd会随着网络拥塞程度以及所使用的拥塞控制算法动态变化。
<u class="ql-author-26803369" style="">在tcp双方建立逻辑链接关系时, 拥塞窗口cwnd的值被设置为1,还需设置慢开始门限ssthresh,在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口cwnd的值加一,然后开始下一轮的传输,当拥塞窗口cwnd增长到慢开始门限值时,就使用拥塞避免算法。</u>
慢开始:
假设当前发送方拥塞窗口cwnd的值为1,而发送窗口swnd等于拥塞窗口cwnd,因此发送方当前只能发送一个数据报文段(拥塞窗口cwnd的值是几,就能发送几个数据报文段),接收方收到该数据报文段后,给发送方回复一个确认报文段,发送方收到该确认报文后,将拥塞窗口的值变为2,
发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,发送方此时可连续发送4个报文段,接收方收到4个报文段后,给发送方依次回复4个确认报文,发送方收到确认报文后,将拥塞窗口加4,置为8,发送方此时可以连续发送8个数据报文段,接收方收到该8个数据报文段后,给发送方一次发回8个确认报文段,发送方收到这8个确认报文后,将拥塞窗口的值加8变为16,
当前的拥塞窗口cwnd的值已经等于慢开始门限值,之后改用拥塞避免算法。
拥塞避免:
也就是每个传输轮次,拥塞窗口cwnd只能线性加一,而不是像慢开始算法时,每个传输轮次,拥塞窗口cwnd按指数增长。同理,16+1……直至到达24,假设24个报文段在传输过程中丢失4个,接收方只收到20个报文段,给发送方依次回复20个确认报文段,一段时间后,丢失的4个报文段的重传计时器超时了,发送发判断可能出现拥塞,更改cwnd和ssthresh.并重新开始慢开始算法,如图所示:
快速重传:
发送方发送1号数据报文段,接收方收到1号报文段后给发送方发回对1号报文段的确认,在1号报文段到达发送方之前,发送方还可以将发送窗口内的2号数据报文段发送出去,接收方收到2号报文段后给发送方发回对2号报文段的确认,在2号报文段到达发送方之前,发送方还可以将发送窗口内的3号数据报文段发送出去,
假设该报文丢失,发送方便不会发送针对该报文的确认报文给发送方,发送方还可以将发送窗口内的4号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,发送方还可以将发送窗口中的5号报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,,发送方还可以将发送窗口内的最后一个数据段即6号数据报文段发送出去,接收方收到后,发现这不是按序到达的报文段,因此给发送方发送针对2号报文段的重复确认,表明我现在希望收到的是3号报文段,但是我没有收到3号报文段,而收到了未按序到达的报文段,
此时,发送方收到了累计3个连续的针对2号报文段的重复确认,立即重传3号报文段,接收方收到后,给发送方发回针对6号报文的确认,表明,序号到6为至的报文都收到了,这样就不会造成发送方对3号报文的超时重传,而是提早收到了重传。
6.为什么TCP是可靠的
[1] 确认和重传机制
建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础
传输过程中,如果Checksum校验失败、丢包或延时,发送端重传
[2] 数据排序
TCP有专门的序列号SN字段,可提供数据re-order
[3] 流量控制
窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量
[4] 拥塞控制
TCP的拥塞控制由4个核心算法组成。
“慢启动”(Slow Start)
“拥塞避免”(Congestion avoidance)
“快速重传 ”(Fast Retransmit)
“快速恢复”(Fast Recovery)
以上就是TCP比UDP传输更可靠的原因。
7.三次握手和四次挥手的过程
三次握手:
- 客户端发送SYN请求,进入SYN_SEND状态
- 服务端接受到SYN请求,返回一个ACK应答,并发送一个SYN请求,服务器进入SYN_RECV状态
- 客户端收到服务端的SYN请求和ACK应答,发送ACK应答,客户端进入ESTABLISH状态,服务端收到应答后也进入ESTABLISH状态。
如果没有收到应答,数据包会根据TCP的重传机制进行重传。
四次挥手:
- 客户端发送FIN包,请求断开连接,客户端进入FIN_WAIT1状态
- 服务端收到FIN后返回应答,进入CLOSE_WAIT状态
- 客户端收到ACK应答后进入FIN_WAIT2状态
- 服务端发送FIN请求,进入LAST_ACK状态
- 客户端收到FIN请求后,发送应答进入TIME_WAIT状态
- 服务器收到ACK应答后,进入close状态
8.OSI,TCP/IP,五层协议的体系结构,以及各层协议
- 物理层:通过媒介传输比特(比特Bit)
- 数据链路层:将比特组装成帧和点到点的传递(帧Fram)
- 网络层:负责数据包从源到宿的传递和网际互联(包PackeT)
- 传输层:提供端对端的报文传输和错误恢复(段Segment)
- 会话层:建立,管理和终止会话
- 表示层:对数据进行翻译,加密和压缩
- 应用层:允许访问OSI环境的手段
9.HTTP请求报文的结构
一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。
请求行
由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1
请求头部
HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。
空行
它的作用是通过一个空行,告诉服务器请求头部到此为止。
请求数据
若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据
10.HTTP响应报文的结构
HTTP响应报文
同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体
1.响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
2.响应头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
3.响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码
11.HTTPS
HTTPS有如下特点:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
SSL建立连接过程
- Client Hello
- Server Hello
- 服务端向客户端发送CA证书
- 客服端发送Pre-master Secret
- 客户端发送消息:将使用加密通信
- 客户端发送:Finished
- 服务器发送消息:将使用加密通信
- 服务端发送:Finished
- 连接正式建立,发送正式报文
12.ARP协议
ARP是地址解析协议工作原理:
1:主机的ARP缓冲区建立ARP列表,表示IP地址和MAC地址之间的关系。
2:当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的MAC地址,如果有,则直接发送数据。
如果没有,就向本网段的所有主机发送ARP数据包:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
3:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。
4:源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
广播发送ARP请求,单播发送ARP响应。