面试题总结重点

  • 内容
  • 相关

TCP的三次握手和四次挥手

TCP三次握手的过程,为什么是三次而不是两次或者四次?

  1. 第一次握手:客户端发送一个syn(同步)包(syn=x)给服务器,进入SYN_SEND状态,等待服务器确认
  2. 第二次握手:服务端收到客户端发送的同步包,确认客户端的同步请求(ack=x+1),同时也发送一个同步包, 也就是一个ACK包+SYN包服务器进入SYN_RECV状态
  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送一个确认包,此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手

不是两次是为了防止已经失效的连接请求报文段突然又传送到了服务端,因而产生错误,比如有一个因网络延迟的请求 发送到了服务端,服务端收到这个同步报文之后进行确认,如果此时是两次握手,那么此时连接建立,但是客户端并没有发出 建立连接的请求,服务端却一直等待客户端发送数据,这样服务端的资源就白白浪费了。

不是四次的话是因为完全没有必要,三次已经足够了

TCP的四次挥手

  1. 第一次:主动关闭方发送一个FIN包,用来关闭主动关闭方到被动关闭方的数据传送,也就是告诉另一方我不再发送数据了,但此时仍可以接收数据
  2. 第二次:被动关闭方收到FIN包之后,发送一个确认(ACK)包给对方
  3. 第三次:被动关闭方发送一个FIN包,告诉对方不带发送数据
  4. 第四次:主动关闭方收到FIN包之后,发送一个ACK包给对方,至此完成四次挥手

TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据

什么是原型链

JavaScript万物都是对象,对象和对象之间也有关系,并不是孤立存在的。对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。

举例说明 Student → Person → Object,学生继承人类,人类继承对象类 代码 varPerson=function(){this.age="匿名"}; varStudent=function(){}; //创建继承关系,prototype执行Person的一个实例对象 Student.prototype=new Person();


什么是闭包

1. 变量作用域

要理解闭包,首先要理解javascript的特殊的变量作用域。

变量的作用域无非就两种:全局变量和局部变量

javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

注意点:在函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明的是一个全局变量!

2. 如何从外部读取函数内部的局部变量?

在函数内部,再定义一个函数。

function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
    }

  }

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。

这就是Javascript语言特有的 "链式作用域"结构(chain scope)

子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

3. 闭包的概念

上面代码中的f2函数,就是闭包。

各种专业文献的闭包定义都非常抽象,我的理解是: 闭包就是能够读取其他函数内部变量的函数

由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说, 闭包可以简单理解成“定义在一个函数内部的函数“。

所以,在本质上, 闭包是将函数内部和函数外部连接起来的桥梁。

4. 闭包的用途

闭包可以用在许多地方。它的最大用处有两个, 一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

总结:

闭包就是能够读取其他函数内部变量的函数。由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成"定义在一个函数内部的函数",所以,在本质上, 闭包是将函数内部和函数外部连接起来的桥梁。要理解闭包,首先要理解javascript的特殊的变量作用域。变量的作用域有两种:全局变量和局部变量javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。要想让外部读取函数内部的局部变量,就需要在函数内部,再定义一个函数,然后将内部函数rrturn(作为返回值返回),就可以读取内部变量了闭包最大的用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会再被外部调用后自动删除

5. 使用闭包的注意点

(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。


同步和异步的区别

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。


OSI七层模型

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层

JSONP

1、什么是JSONP?
要了解JSONP,不得不提一下JSON,那么什么是JSON ? JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss. JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

2、JSONP有什么用?
由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

3、如何使用JSONP?
下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。

总结:

JSONP是一个非官方协议,通过javascrip callback的形式实现跨域访问,由于同源策略的限制,XmlHttpRequest只允许请求域名、协议、端口的资源,为了实现跨域请求,可以通过script标签的src属性,在src属性上写跨域的链接地址,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。


一、堆和栈的区别:

堆栈空间分配区别:

1、堆(操作系统): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

2、栈(操作系统):由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

二、堆栈缓存方式区别:

1、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

2、栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;

三、堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;(程序员分配的)

栈(数据结构):一种先进后出的数据结构。(编译器分配的)


事件冒泡和事件捕获

定义两个标签,div(父标签)和p(子标签)

  1. 事件捕获: 当你使用事件捕获时,父级元素先触发,子级元素后触发,即div先触发,p后触发。
  2. 事件冒泡: 当你使用事件冒泡时,子级元素先触发,父级元素后触发,即p先触发,div后触发。

可以自己选择绑定事件时采用事件捕获还是事件冒泡,方法就是绑定事件时通过addEventListener函数,它有三个参数,第三个参数若是true,则表示采用事件捕获,若是false,则表示采用事件冒泡。

阻止事件冒泡的方法

  1. 通过使用 event.stopPropagation() 方法只阻止一个事件冒泡
  2. 将addEventListener的第三个参数的状态改为true(事件捕获)

URL的各个请求环节

提取协议名称,去除URL层级符,获取授权信息部分,获取资源地址,提取查询字符串,提取片段ID

  1. 浏览器会去请求DNS,进行域名解析,获得与域名相对应的IP。
  2. 三次握手,建立TCP连接,形成一个Session(会话)。
  3. 浏览器发送Request包,服务器接收后对其进行解析。
  4. 请求被转发给一个预定义的Handler(处理器)。并可能从数据库里取出数据。
  5. 处理器根据取出的数据对Template(模板)进行Rander(渲染),返回Response(响应)请求。
  6. 浏览器会渲染Response(响应)包的里主体。而且直到接受完Response(响应)包前,浏览器和服务器的TCP连接将保持连接。

ajax的请求机制

  1. 对象初始化
  2. 向服务器发送一个请求
  3. 服务器接收请求并进行处理
  4. 服务器处理完后将处理完毕的数据返回响应
  5. 客户端接收,根据响应数据修改客户端页面内容

this指向

  1. 在全局变量中,this指向的是windows
  2. 在局部变量中,this指向的是最后调用它的那个对象

改变this指向的三种方式:call apply bind


请描述一下cookies,sessionStorage和localStorage的区别?

  1. cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
  2. cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递。
  3. sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。
  4. 存储大小:
    1. cookie数据大小不能超过4k。
    2. sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
  5. 有效时间:
    1. localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
    2. sessionStorage 数据在当前浏览器窗口关闭后自动删除。
    3. cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

cookie是网站为了标识用户身份保存在本地上的数据,在浏览器和服务器之间传递数据,sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。localStorage不会被垃圾回收机制回收,sionStorage会被垃圾回收机制回收,在存储大小上,cookie数据大小没有sessionStorage和localStorage存储大小大。


javascript继承

  1. 构造函数绑定,使用call(子对象,单个参数)或apply(子对象,数组参数)方法,将父对象的构造函数绑定在子对象上
  2. 直接继承prototype

继承是一个对象去获取另一个对象的属性,有6种继承方式,一种是构造函数,使用call 和apply方法,将父对象的构造函数绑定在子对象上,还有一种是拷贝继承,其余的都是prototype原型链的继承,一种是将需要继承的对象的函数原型指向被继承的那个函数对象(改变指向),另一种是直接继承prototype,将它原型的属性直接写入继承的对象中,最后一种是利用空对象作为中介去继承,prototype前两种有缺陷,一种是关于继承属性的函数对象的属性继承,以后都会指向原型链,第二种,改变原型链会导致继承对象也改变,只有第三种才是无害的。


GET和POST的区别

  1. get是从服务器获取数据 -----"取"; post是向服务器提交数据 -----“发”
  2. form表单默认的method为"GET"
  3. get将数据按照variable = value 的形式,加上URL的后面,中间用"?"连接,各个变量之间用"&"连接; post将数据不像get方式那样
  4. 参数上面3的数据传输方式,可以得出:post安全性比get方式要高
  5. URL不存在参数上限的问题,HTTP协议没有对URL长度进行限制,限制的是部分浏览器和服务器的限制。 IE对URL长度的限制为2083KB get方式是通过URL传输的数据的,数据量一般在2KB左右,但是执行效率比post高 理论上post方式没有大小限制,HTTP协议规范也没进行大小限制。post数据没有限制,限制的是服务器处理程序的能力

总结:

get是从服务器获取数据 -----"取"; post是向服务器提交数据 -----“发”,form表单默认的method为"GET",Get的执行效率比POST的执行效率高,GET数据大小有限制,POST数据大小没有限制

< 六十二博客 >

本文标签:

版权声明: 若无特殊注明,本文皆为《 六十二丶 》原创,转载请保留文章出处。

本文链接: 面试题总结重点 》 - https://prm612.top/post-128.html

解压说明: 如本站部分资源使用时需输入解压密码,本站所有资源的解压密码均默认为: prm612

收录情况: 百度暂未收录

站长QQ: 597782047 点击这里给我发消息 本网站的资源部分来源于网络,如有侵权,请 联系站长 进行删除处理。

本站留言 - 投诉建议: Email:597782047@qq.com 链接失效?( 点击提交 )请说明失效链接地址+名称

本站网址: https://prm612.top/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

未显示?请点击刷新

允许邮件通知

正在加载...

点击↑关闭 2019年,祝大家
“诸”事吉祥!
网站备案相关信息
域名
主办方名称
主办单位性质
主体备案号
ICP备案号
首页地址 https://prm612.top/ [备案查询]
网站名称
审核时间
00:00 / 00:00
随机播放