(根据个人亲自经历的前端面试题进行整理)
问题1:请描述一下TCP连接过程
TCP连接的过程通常包括三个主要步骤:建立连接、数据传输和断开连接。总结即:3次握手4次挥手。
在TCP连接的建立过程中,进行了三次握手。以下是每次握手的描述:
在TCP连接的断开过程中,进行了四次挥手。以下是每次挥手的描述:
通过这四次挥手,双方能够确保彼此都知道关闭请求和确认,并完成了所有数据的传输。这样,TCP连接就顺利地断开了。
问题2:TCP与UDP的区别
主要区别如下:
总之,TCP提供可靠的、有序的数据传输,适用于对可靠性要求较高的应用;UDP提供快速的、简单的数据传输,适用于实时性要求高的应用。选择哪种协议取决于应用需求和优先级。
问题3:请简单概述TCP的拥塞控制和流量控制
TCP的拥塞控制和流量控制是两个关键机制,用于确保网络传输的稳定性和公平性。
这两个机制共同作用于TCP协议,通过动态地调整窗口大小和传输速率,以适应网络的变化和接收方的处理能力。拥塞控制确保网络不被过载,而流量控制则确保发送方不会压倒接收方。这样,TCP可以在网络中实现高效、可靠的数据传输。
问题4:请回答https与http的区别
总结起来,HTTPS相比于HTTP,在传输过程中提供了更高的安全性,通过加密保护数据隐私和完整性。它常用于处理敏感信息的网站和保护用户的隐私。而HTTP是一种简单的传输协议,适用于一般的非敏感数据传输。
问题5:什么是跨域?
跨域就是前端访问后台时,域名,协议,端口有一个不相同时,就会出现跨域,请求不到数据。
跨域问题常见于以下情况:
为了解决跨域问题,通常需要通过服务器端设置CORS(Cross-Origin Resource Sharing)响应头来允许跨域请求,或者使用JSONP、代理服务器等技术手段来绕过同源策略。
问题6:cookie,localStorage, sessionStorage三者区别
一、存储的时间有效期不同
1、cookie的有效期是可以设置的,默认的情况下是关闭浏览器后失效
2、sessionStorage的有效期是仅保持在当前页面,关闭当前会话页或者浏览器后就会失效
3、localStorage的有效期是在不进行手动删除的情况下是一直有效的
二、存储的大小不同
1、cookie的存储是4kb左右,存储量较小,一般页面最多存储20条左右信息
2、localStorage和sessionStorage的存储容量是5Mb(官方介绍,可能和浏览器有部分差异性)
三、与服务端的通信
1、cookie会参与到与服务端的通信中,一般会携带在http请求的头部中,例如一些关键密匙验证等。
2、localStorage和sessionStorage是单纯的前端存储,不参与与服务端的通信,所以安全性都要比cookie要好。
四、读写操作的便捷程度
1、cookie的相关操作,cookie操作起来较为繁琐,并且部分数据不可以读取操作
五、对于浏览器的支持
1、cookie出现的时间较早,目前见到的浏览器都支持
2、localStorage和sessionStorage出现的时间较晚,对于版本较低的浏览器不支持(比如IE8版本以下的都不支持)
六、应用场景
1、cookie:判断用户是否登录过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除Cookie,则每次登录必须从新填写登录的相关信息;保存上次登录的时间等信息;保存上次查看的页面;浏览计数;
2、localStoragese:常用于长期登录(+判断用户是否已登录),适合长期保存在本地的数据;
3、sessionStorage:敏感账号一次性登录;
问题7:什么是闭包
所谓闭包,指的就是一个函数。当两个函数彼此嵌套时,内部的函数就是闭包。
因为在 JavaScript 中,函数属于对象,对象又是属性的集合,而属性的值又可以是对象,所以我们可以在函数内部再定义函数。例如在函数 A 中定义了函数 B,然后在函数外部调用函数 B,这个过程就是闭包。
闭包的形成条件是内部函数需要通过外部函数 return 给返回出来,如下例所示:
问题8:闭包的应用
通过闭包,我们可以创建私有变量、保存状态、实现封装性等。常见的应用包括:
需要注意的是,由于闭包会保留对外部函数作用域的引用,使用不当可能导致内存泄漏。在处理闭包时,需要注意及时释放不再使用的资源,避免造成内存浪费。
当我们需要在函数中定义一些变量,并且希望这些变量能够一直保存在内存中,同时不影响函数外的全局变量时,就可以使用闭包。
问题9:ajax中的dataType有哪几种
在 AJAX 中,dataType 是指发送到服务器的数据类型以及期望从服务器返回的数据类型。它用于告诉服务器如何解析响应数据并将其转换为 JavaScript 对象。
以下是常见的 dataType 值:
"xml":预期服务器返回 XML 数据。
"html":预期服务器返回 HTML 数据。
"text":预期服务器返回纯文本数据。
"json":预期服务器返回 JSON 格式的数据。
"script":预期服务器返回 JavaScript 代码。
"jsonp":用于进行跨域请求,并期望服务器返回 JSONP 格式的数据。
"binary":预期服务器返回二进制数据。
这些值可以作为 dataType 的参数传递给 AJAX 请求的配置对象中。根据所选择的 dataType,AJAX 将自动对响应数据进行相应的解析和处理。
问题10:get和post的区别
GET 和 POST 是 HTTP 协议中两种常见的请求方法,它们在以下方面有所区别:
根据需求选择使用 GET 还是 POST,一般来说,GET 适用于获取资源、查询数据等无副作用的请求,而 POST 适用于提交表单、发送数据并产生副作用的请求。
问题11:介绍 js 的基本数据类型
js 一共有六种基本数据类型,分别是 Undefined、Null、Boolean、Number、String,还有在 ES6 中新增的 Symbol 类型,代表创建后独一无二且不可变的数据类型,它的出现我认为主要是为了解决可能出现的全局变量冲突的问题。
问题12:null 和 undefined 的区别?
首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。
undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null主要用于赋值给一些可能会返回对象的变量,作为初始化。
undefined 在 js 中不是一个保留字,这意味着我们可以使用 undefined 来作为一个变量名,这样的做法是非常危险的,它会影响我们对 undefined 值的判断。但是我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。
当我们对两种类型使用 typeof 进行判断的时候,Null 类型化会返回 “object”,这是一个历史遗留的问题。当我们使用双等号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。
问题13:如何阻止事件冒泡?
event.stopPropagation() 或者 ie 下的方法 event.cancelBubble = true;
问题14:Javascript中Map与Object的区别
1.Map可以将任何数据类型作为key,而Object,只能使用String或者Symbol。
2.Map的键是按插入顺序排序的,而Object并非总是按插入顺序
3.性能差别Map相对于Obj还是快的
问题14:JavaScript中Map和forEach的区别
问题15:HTML5有哪些新特性?
问题16:iframe的优缺点?
优点:
1.iframe能够原封不动的把嵌入的网页展现出来。
2.如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷。
3.网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用。
4.如果遇到加载缓慢的第三方内容如图标和广告,这些问题可以由iframe来解决。
缺点:
1.会产生很多页面,不容易管理。
2.iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能会出现上下、左右滚动条,会分散访问者的注意力,用户体验度差。
3.代码复杂,无法被一些搜索引擎索引到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe中的内容,所以使用iframe会不利于搜索引擎优化。
4.很多的移动设备(PDA 手机)无法完全显示框架,设备兼容性差。
5.iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。
问题17:行内元素有哪些?块级元素有哪些?CSS的盒模型?
常见的行内元素有:等。行内元素不会独占一行,只会根据内容的大小进行排列。
常见的块级元素有:等。块级元素会独占一行,相邻的块级元素会另起一行。
CSS的盒模型是指在网页布局中,每个元素都被看作一个盒子,包含了内容区域、内边距、边框和外边距。CSS盒模型分为两种:
通过CSS的属性可以控制元素使用哪种盒模型。默认值是,如果设置为,则元素的宽度和高度将包括内边距和边框的大小。
问题18:call()和apply()的区别
和是JavaScript中用于调用函数的方法,它们的主要区别在于参数的传递方式。
方法:通过指定的上下文对象(即函数的执行环境)以及一系列单独的参数来调用函数。参数需要按顺序一个个传递给函数。
方法:与类似,也是通过指定上下文对象来调用函数,但参数需要以数组或类数组对象的形式传递给函数。数组中的每一项对应函数的参数列表中的一个参数。
总结:
问题19:var、let和const有什么区别
1.var定义的变量可以跨块作用域访问,不可以跨函数作用域访问。
2.let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问;不允许在相同作用域内,重复声明同一个变量。
3.const定义的常量,初始化时必须赋值,只能在块作用域里使用,不能修改。
问题20:深拷贝和浅拷贝
在 JavaScript 中,有深拷贝(deep copy)和浅拷贝(shallow copy)两种方式来复制对象或数组。它们的主要区别在于拷贝后的结果对原始对象中的嵌套对象的引用关系处理不同
1.浅拷贝(Shallow Copy):
浅拷贝会创建一个新的对象或数组,并将原始对象中的属性值或数组元素的引用复制到新对象中。换句话说,新对象与原始对象共享同一组对象引用。修改其中一个对象的属性或数组元素时,另一个对象也会受到影响。
2.深拷贝(Deep Copy):
深拷贝会递归地复制对象或数组及其所有嵌套对象,创建一个完全独立的副本。修改其中一个对象的属性或数组元素不会对其他对象造成任何影响。
在上面的示例中,通过使用JSON.stringify()和JSON.parse()对原始对象进行深拷贝。当修改深拷贝的对象的属性时,原始对象不会受到影响。
需要注意的是,深拷贝方法(如上述示例中的基于JSON的方式)可能无法处理包含特殊类型或循环引用的复杂对象结构,因此在实际应用中需要综合考虑深拷贝的适用性和性能。
问题21:CSS选择符都有哪些?哪些属性可以继承?优先级算法如何计算?
一些常见的可继承属性包括:
总结:字体、文本相关的属性通常可继承。布局、盒模型相关的属性通常不可继承,继承的属性使子元素可以从父元素继承样式,不继承的属性需要给每个元素单独设置样式。
在CSS中,元素的样式优先级是根据以下规则计算的(从高到低):
如果多个规则具有相同的优先级,则后面出现的规则将覆盖先前的规则。如果两个规则具有相同的选择器和优先级,则样式表中靠后的规则将覆盖先前的规则。
问题22:判断对象是否为数组有哪几种方法?
1.Object.prototype.toString.call() (所有类型都可以用来判断)
2.instanceof方法 (判断Array.prototype是否在该对象的原型链proto中)
3.constructor方法 (判断该对象的构造函数是否是Array)
4.Array.isArray() (数组自带的判断方法)
问题23:typeof与instanceof的区别
typeof与instanceof都是判断数据类型的方法,区别如下:
问题24:为什么要初始化CSS?
初始化CSS的目的是为了确保在不同浏览器和环境下,网页的初始样式表现一致,并消除浏览器默认样式带来的不确定性。
浏览器对HTML元素有其自己的默认样式,这些默认样式可能会导致不同浏览器之间呈现的差异。通过初始化CSS,可以将所有元素的样式重置为统一的基准状态,然后再根据设计需要逐个定义样式。
以下是一些常见的原因和好处:
总之,初始化CSS有助于消除浏览器默认样式的差异,并提供一个可预测和一致的样式基准,使开发者能够更好地控制网页的外观和行为。
问题25:什么是BFC?如何触发?有何特点?如何解决margin塌陷?
1.BFC本质上是开启一个独立的布局空间。让内部元素不影响外部元素的布局,同时外部元素也无法影响内部元素
2.BFC触发条件
3.有何特点
BFC规则
4.通过BFC可以解决以下问题
问题26:什么是rem布局?
1.在HTML根元素中设置font-size大小,rem是相对单位,根据设置的fon-size的大小而定例如在font-size 设置为14px,则1rem就是14px
2.rem 布局就是让页面中的元素可以做到自适应,当设备大小发生改变时,等比例适配当前的设备。页面元素使用rem 做尺寸单位
问题27:如何实现响应式布局?
1、媒体查询,根据视口尺寸定义不同样式
2、流式布局,利用百分比做单位
3,弹性盒,网格系统布局
4、图片响应式:使用 CSS和JavaScript技术使图像根据屏幕尺寸自动调整大小,并提供高分辨率版本以适应屏幕。
5、em、rem 适配,其中rem需要配合is 当视口查化时动态改变 html元毒的字体大小
问题28:link 标签和 import 标签的区别?
1、加载顺序和性能:当浏览器解析 HTML 文档时,link 标签会立即加载并同时请求外部资源,而@import 会在 HTML文档加载完毕后加载外部样式表。这意味着使用 link 可以更快地加载并目不会阻赛页面显示,而@import可能导致页面加载速度变慢。
2、兼容性: link 标签是 HTML标签,可以在 HTML和XHTML中使用,并且受到所有浏览器的支持。而@impot是 CSS 规则,只能在 CSS 文件中使用,目在些较旧的浏览器中可能不被完全支持。
3、功能性: link标签可以引入不同类型的瓷源,包括 CSSJavaScript、图像等,而@impot 只能引入 CSS 文件
4、权重: 在 CSS中,通过@import 引入的样式表的权重较低,会被其他样式表中的规则所覆盖。而 link引入的样式表没有此限制,其权重与页面中的其他样式表相同。
问题29:transition 和 animation 的区别?
Transition(过渡)和Animation(动画)是用于为元素添加动态效果的CSS属性。它们之间的主要区别如下:
Transition(过渡):
Animation(动画):
简而言之,Transition用于实现基本的属性过渡效果,而Animation则更适合创建更复杂和精细控制的动画效果。 Transition对单一属性的过渡较为方便,而Animation对于多个属性和复杂动画序列的控制更为灵活。
问题30:变量提升是什么? 与函数提升的区别?
1.变量提升就是当我们在一个作用域定义变量的时候,该变量的声明会被提升到作用域的顶端,比如用var声明变量的时候就可以造成变量提升,以致于我们可以在变量声明之前访问到该变量只不过这时候访问的变量值为undefined.
2.函数提升和变量提升类似,只不过函数提升优先级要高于变量提升,因为在js中函数是一等公民,优先级很高
问题31:for in 与 for of的区别
问题32:隐式转换
问题33:typeof(null)与typeof(undefined)
在JavaScript中,typeof null 的结果是 "object",而 typeof undefined 的结果是 "undefined"。这种行为被认为是 JavaScript 的设计缺陷之一,因为 null 被看作是一个特殊的对象类型,但实际上它应该被视为一个独立的原始值。而 undefined 则表示一个变量未定义或者一个属性不存在。因此,虽然 null 和 undefined 都代表缺失的值,但它们在类型上是不同的。
问题34:属于flex简写的属性有哪些?
问题35:下列哪项不属于DOM查找节点的属性
A node.firstChild
B. node.children
C. node.previousSibling
D.node.siblings
选项 D. 不属于 DOM 查找节点的属性。
在 DOM 中,可以使用以下属性来查找节点:
A. :返回指定节点的第一个子节点。
B. :返回指定节点的所有子元素节点(排除文本节点和注释节点)。
C. :返回指定节点的前一个兄弟节点。
D. 并不是 DOM 标准中定义的属性。因此,选项 D 不属于 DOM 查找节点的属性。
问题36:split,splice,slice的区别
方法是用于提取字符串中的一部分,并返回一个新的字符串,原字符串不会被修改。它接受两个参数:起始索引和结束索引(可选)。返回的子字符串包括起始索引处的字符,但不包括结束索引处的字符。
示例:
方法是将一个字符串拆分成一个字符串数组,根据指定的分隔符进行分割。它接受一个参数:分隔符。返回的是一个字符串数组,其中的元素是根据分隔符分割后的子字符串。 示例:
splice()方法用于数组操作。可以在任何位置添加或删除数组的元素。语法:。其中, 是开始更改数组的位置, 是从 index 位置开始要删除的元素数量, 是要添加到数组的新元素。
总结:
问题37:箭头函数的特点
问题38:Js中精度计算问题
JS中执行0.1+0.2的结果是: A.0.3 B.随机 C.约等于0.3 D.约等于04
问题39:null与undefined的判断
以下哪个表达式的结果为true: A. null instanceof Object B. null === undefined C. null == undefined D.NaN == NaN
问题40:new关键字考察
问题41:Javascript中的继承方法有哪些
以上是一些常见的继承方法,每种方法都有其优缺点,选择适合具体场景的继承方法很重要。此外,ES6 引入的 和 关键字也提供了更简洁的语法来实现面向对象的继承。
问题42:可以用什么方法接收不定数量的参数
1.使用 对象:
2.使用剩余参数语法(Rest Parameters):
问题43:reduce的作用
是 JavaScript 数组对象的方法之一,它用于对数组中的所有元素执行一个归约(reduction)操作,将数组元素按照指定规则进行累积计算,并返回最终的结果。
方法接受两个参数:
回调函数可以接受四个参数:
回调函数通过逐个处理数组元素,将每次操作的结果累积到累加器中,最后返回最终的累积结果。整个过程可以理解为一个迭代的累积过程。
以下是 方法的一些常见应用场景:
示例:
问题44:JS中的宏任务和微任务有哪些?
在事件执行中宏任务的优先级比微任务的优先级要低
问题45:HTTP中的强制缓存
HTTP强制缓存是一种机制,用于在浏览器和服务器之间减少网络请求以提高性能。通过设置响应头中的缓存控制字段,服务器可以指示浏览器在一段时间内直接使用本地缓存而不发送请求到服务器。
当浏览器第一次请求一个资源时,服务器可以通过设置响应头中的或字段来指定该资源的缓存策略。如果设置了合适的缓存策略,浏览器接收到响应后会将资源保存在本地缓存中,并在下一次请求时检查缓存是否有效。
如果缓存有效(根据规则判断),浏览器会直接从本地缓存中加载资源,而不发送请求到服务器,这样可以减少网络延迟和带宽消耗,提高页面加载速度。只有当缓存过期或被明确指示需要重新验证时,浏览器才会发送请求到服务器进行资源的更新。需要注意的是,虽然强制缓存可以提高网页的加载速度和性能,但同时也可能会带来一些问题,如信息的不一致性等。因此,在使用强制缓存时需要注意及时更新缓存数据,以保证信息的准确性。
常见的缓存控制字段包括:
通过适当配置缓存策略,可以有效地减少对服务器的请求,提升前端性能和用户体验。
问题46:fetch与ajax的区别
1.API设计:ajax基于xmlHttpRequest对象来发送和接收数据,通过函数回调处理异步请;
fetch基于webapi实现,是一种新的webapi,通过promise来处理异步请求
2.兼容性:ajax基于xmlHttpRequest对象进行封装,兼容绝大多数旧版的浏览器;fetch是一种新的webapi,兼容性相比ajax要弱
3.写法:fetch比起ajax的写法要更为简洁,ajax需要配置多项信息来进行请求的设置
4.错误处理:fetch只对网络请求报错,对400、500都当做成功的请求,而ajax不会
5.跨域请求:Fetch对跨域请求有更严格的限制,因为它遵循了同源策略。如果需要进行跨域请求,需要在服务器端设置适当的CORS头以允许跨域请求。然而,Ajax也受到同源策略的限制,但可以通过JSONP、代理服务器等技术来进行跨域请求。另外:Fetch跨域的时候默认不会带cookie 需要手动的指定 credentials:'include'
6.流式传输:ajax不支持流式传输,fetch支持流式传输,可通过调用response.body.getReader()方法创建数据读取器,封装一个read方法进行读取,逐步读取出数据内容,进行流式传输
问题47:https的请求过程
1.客户端发起请求,服务端接收后发送一个CA(公钥)的证书给客户端
2.客户端接收证书后进行加密生成随机对称秘钥并使用公钥加密,如有问题会提示风险
3.客户端加密后的对称秘钥,发送给【服务器】,作为接下来请求的秘钥
4.服务端用自己的 公钥 解密得到对称秘钥
5.客户端使用随机对称秘钥进行解密数据
6.【客户端】【服务端】使用该秘钥进行通信
总结:在HTTPS的过程中,会通过加密的方式进行传输,主要分为两类:
对称加密【对称加密就是加密和解密都用同一个密钥.】;
非对称加密【有两个密钥,pub是公钥用来加密或解密,pri是密钥用来解密或加密】
问题48:响应式布局与自适应布局的区别
总的来说,响应式布局强调根据屏幕尺寸和设备特性动态地调整布局,以提供**的用户体验。自适应布局更注重针对特定设备尺寸创建固定布局,适用于已知的设备尺寸范围。选择使用响应式布局还是自适应布局取决于项目需求、设计复杂度、预期的用户体验和可维护性等因素。
问题49:什么是重绘,什么是回流,两者有何区别?如何减少?
1.重绘:重绘是指当元素发送的样式发送改变时,其布局没有发送改变,则浏览器会对元素进行重绘,重绘通常会发生在背景颜色,文字颜色,或字体大小等样式发送改变时,其布局没发生改变,则会触发重绘现场。
2.回流:回流是指当元素的布局属性发送改变,需要重新计算元素在页面中的布局位置时,浏览器重新进行布局的过程。例如:修改元素的宽度,高度,位置等。
3.重绘与回流的差异:回流的成本比重绘高得多,因为它涉及重新计算元素的几何属性和页面布局。而重绘只需要重新绘制已计算好的元素样式
4.如何减少:
问题50:请说说css层叠规则,优先级计算
1.CSS的层叠规则(Cascading Rules)是CSS中非常重要的一部分,它定义了当多个样式规则作用于同一个元素时,如何决定最终应用哪一条规则。层叠规则根据特定的优先级和顺序来计算,具体规则如下:
除了上述的层叠规则外,还有一些其他属性也会影响元素的层叠顺序,例如z-index。z-index用于设置元素在z轴上的位置,其值可正可负。数值越大,元素在z轴上的位置就越靠前,就会遮挡元素的z-index比当前元素的z-index的值小的元素。
2.优先级计算
特殊性和优先级
选择器的特殊性是计算优先级的一种方式。特殊性是一个数值,由四个部分组成:a、b、c、d,分别对应上面提到的四种选择器类型。每种类型的选择器都会增加相应部分的数值。比如,ID选择器会增加b的值,类选择器会增加c的值。
当两个选择器的特殊性相同时,位于CSS最后的规则会覆盖前面的规则。同时,使用 可以覆盖其他任何声明,但是过度使用 会导致代码难以维护和理解,因此建议尽量少用。
**实践
为了维护代码的清晰和高效,建议:
问题51:为什么for of 不能遍历对象
因为for…of只能遍历可迭代(iterator)对象,(如数组、字符串、Map、Set等)的值,然而,对象(特指普通的键值对对象,如JavaScript中的对象字面量)并没有内在的迭代顺序。对象的属性并没有按照特定的顺序进行排列,因此直接使用for…of来遍历对象并没有明确的语义。
问题52:promise有几种状态
Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。一旦Promise对象从pending状态变成fulfilled或rejected状态,就不会再改变状态。
问题53:bind与箭头函数的区别
方法和箭头函数在JavaScript中都可以用来改变函数的上下文,但它们之间有几个关键的区别:
问题54:js中的隐式类型转换条件有哪些
问题55:== 的隐式类型转换
问题56:+ 的隐式类型转换
问题57:object 的隐式类型转换
注意:valueOf方法返回值不为原始值时,则继续寻找toString方法执行,获取返回值,执行结束。
问题58:什么是内存泄漏?
定义:程序中存在未释放或无法访问的内存的情况。当你的应用程序不再使用某个对象或数据时,如果没有正确释放相关的内存,这些内存将被占用而无法再被其他对象或数据使用,从而导致内存泄漏。
常见的内存泄漏情况包括以下几种:
为了避免内存泄漏,可以采取以下措施:
问题59:谈谈你对V8垃圾回收机制的理解?
问题60:谈谈你对SSR的理解?
问题61:JavaScript中的微任务和宏任务分别有哪些?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/168306.html