面试题
1. <font color=red>语义化的理解?</font>
-
用正确的标签做正确的事情;
-
当页面加载失败的时候,还能够呈现出清晰的结构;
-
有利于SEO优化,利于搜索引擎的收录(即便于网络爬虫的识别);
-
在项目开发及维护时,语义化也很大程度上降低了开发难度,节省成本。
2. <font color=red>垂直水平居中的方法有几种?</font>
-
绝对定位:
top:0,left:0,rhuanight:0,bottom:0,margin:auto
-
绝对定位 + 位移:
left:50%,top:50%,transform:translate(-50%,-50%)
-
弹性盒布局:
display:flex,justify-content:center,align-item:center
3. <font color=red>Javascript如何实现继承?</font>
- 原型链继承:子类的原型指向父类的实例;
- 构造继承:call、apply 继承;
- 组合继承:原型链和构造的结合;
- 拷贝继承;
- 寄生组合继承;
- ES6继承。
4. <font color=red>Cookie的弊端?</font>
- 只能使用文本进行存储;
- 单条的存储大小有限制,不超过4kb;
- 存储数量有限制,一般在50条左右;
- 读取时有域名限制,不可跨域的确,只能由写cookie的同一域名的网页读取;
- 时效有限制,最短时效为一个会话期。
5. <font color=red>如何解决跨域问题?</font>
-
前端JSONP处理:在src属性中引入接口地址,利用script在引入外部js文件不受同源策略限制的特性,来实现跨域。(src的开放性原则)
接口地址中引入的js脚本中的内容是函数调用,该函数调用的参数是服务器返回的数据,为了获取这里的参数数据,需要事先在页面中定义全局回调函数,在回调函数中处理服务器返回的数据。JSONP只能实现GET请求的跨域,但其兼容性好,不需要使用类似 XMLHttpRequest 的对象。
-
后端cors处理:原理是使用自定义的 HTTP 头部,让服务器与浏览器进行沟通(两者同时支持),主要是通过设置响应头的 Access-Control-Allow-Origin 来达到目的。CORS对GET、POST请求的跨域都能够处理,而且对客户端来说可以像使用自己域下资源一样使用ajax来跨域访问数据,非常方便。
-
proxy 服务器代理:proxy 代理跨域,从本服务器出发,以node为中间层,在中间层把当前源切换为目标源,完成跨域,再请求另一个服务器。
-
扩展内容:document.domain window.name window.postMessage
6. <font color=red>原生 JS 中 call()、apply()、bind() 方法有什么区别?</font>
- 三个方法都可以改变函数运行时的 this 指向;
- 三个方法的第一个参数都是函数调用执行时 this 指向的对象;
- call() 方法第二个参数是可变参数,是函数调用执行时本身所需要的参数;
- apply() 方法第二个参数是一个数组或arguments;
- call() 和 apply() 方法都是立即调用函数执行,在运行时修改 this 的指向;
- bind() 方法在函数封装定义时,直接修改了 this 的指向,它不会影响原函数本身的 this 指向。
7. <font color=red>什么是闭包?特点是?三要素?注意点?</font>
-
闭包:变量既能重复使用,又不会污染全局;
-
特点:(1)作为一个函数变量的一个引用,当函数返回时,其处于激活状态;
(2) 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
-
三要素:(1)外层函数嵌套内层函数;
(2)内层函数使用外层函数的局部变量; (3)把内层函数作为外层函数的返回值。
-
注意点:(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
8. <font color=red>性能优化的方法?</font>
- 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器;
- 前端模板 JS + 数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数;
- 减少DOM操作次数,优化javascript性能;
- 当需要设置的样式很多时使用外部样式而不是直接操作内联样式;
- 少用全局变量、缓存DOM节点查找的结果,减少IO读取操作;
- 图片预加载,将样式表放在顶部,将脚本放在底部,加上时间戳……。
9. <font color=red>什么叫优雅降级和渐进增强?</font>
-
优雅降级:一开始就构建完整的功能,然后载针对低版本浏览器进行兼容;
-
渐进增强:针对低版本浏览器保证最基本的功能,然后再针对高版本浏览器进行效果、交互等改进和追加功能,以达到更好的用户体验;
-
区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,
而渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。
降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
10. <font color=red>清除浮动的几种方法?</font>
- 给父元素设置overflow:hidden;
- 使用空盒子(元素)方法:在需要清除浮动的元素同级下家一个空元素(这个元素不能有其他任何样式),给这个元素设置clear:both样式;
- 万能清除法:给父元素设置样式 clear:after {content:“.”;display:block;clear:both;visibitily:hidden;height:0;}
11.<font color=red>阐释css sprites的使用方法和作用?</font>
CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。
CSS Sprites为一些大型的网站节约了带宽,提高了用户的加载速度和用户体验,不需要加载更多的图片,减轻了服务器的压力。
12.<font color=red>如何用原生js给一个按钮绑定两个onclick事件?</font>
使用事件监听 addEventListener
13.<font color=red>列举jquery中的选择器?</font>
基本 #id element .class * selectorN
层级 ancestor descendant parent > child prev + next prev ~ siblings
基本 :first :not(selector) :even :odd :eq(index) :gt(index) :lang :last :lt(index) :header :animated :focus :root:target
内容 :contains(text) :empty :has(selector) :parent
可见性 :hidden :visible
属性 [attribute] [attribute=value] [attribute!=value] [attribute^=value] [attribute$=value] [attribute*=value] [attrSel1]
子元素 :first-child :last-child :nth-child :nth-last-child() :only-child
表单 :input :text :password :radio :checkbox) :submit :image :reset :button :file :hidden
表单对象属性 :enabled :disabled :checked :selected
14.<font color=red>Javascript中的定时器有哪些?他们的区别及用法是什么?</font>
setTimeout:超时定时器
setInterval:间隔定时器
requestAnimationFrame:循环定时器(作为了解)
区别:超时定时器是过一段时间执行,只会执行一次;间隔定时器是间隔一段时间就会执行一次。
用法:两者的用法基本一致,如: setInterval(function (){console.log(1);},1000),表示每隔一秒打印一个1。
15.<font color=red>请描述一下 cookies、sessionStorage和localstorage区别?</font>
相同点:都存储在客户端
不同点:
-
存储大小不同
· cookie数据大小不能超过4k。
· sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
-
时效性不同
· localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
· sessionStorage 数据在当前浏览器窗口关闭后自动删除。
· cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
-
数据与服务器之间的交互方式
· cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端
· sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。
16.<font color=red>document.write和innerHTML的区别?</font>
-
document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open。每次写完关闭之后重新调用该函数,会导致页面被重写。
-
innerHTML则是DOM页面元素的一个属性,代表该元素的html内容。你可以精确到某一个具体的元素来进行更改。如果想修改document的内容,则需要修改document.documentElement.innerElement。
-
innerHTML将内容写入某个DOM节点,不会导致页面全部重绘。
-
innerHTML很多情况下都优于document.write,其原因在于其允许更精确的控制要刷新页面的那一个部分。
17.<font color=red>拖拽会用到哪些事件?</font>
鼠标按下事件:onmousedown
鼠标移动事件:onmousemove(鼠标在目标中移动时反复执行)
鼠标抬起事件:onmouseup
18.<font color=red>创建ajax的步骤?</font>
-
创建ajax核心对象xmlhttprequest,用来和服务器交换数据;
var xmlhttp =new XMLHttpRequest();
-
使用xmlhttprequest对象的open()方法进行连接和send()方法发送资源请求给服务器;
-
使用xmlhttprequest对象的responseText或responseXML属性获得服务器的响应;
-
使用onreadystatechange函数,当发送请求到服务器,我们想要服务器响应执行一些功能就需要使用onreadystatechange函数,每次xmlhttprequest对象的readyState发生改变都会触发onreadystatechange函数。(简单说就是状态发生改变时发送数据回客户端)
19.<font color=red>xml和json的区别,请用四个词语来形容?</font>
-
JSON相对于XML来讲,数据的体积小,传递的速度更快些;
-
JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互;
-
XML对数据描述性比较好;
-
JSON的速度要远远快于XML。
20.<font color=red>box-sizing常用的属性有哪些?分别有什么作用?</font>
-
box-sizing:content-box(标准盒模型):在宽度和高度之外绘制元素的内边距和边框;
-
box-sizing:border-box(怪异盒模型):带有指定宽度和高度的框,并把边框和内边距放入框中;
-
box-sizing:inherit():规定应从父元素继承 box-sizing 属性的值。
21.<font color=red>H5语义化的重要性?</font>
- 当页面加载失败时,还能够呈现出清晰的结构;
- 有利于SEO优化,利于搜索引擎收录(即便于爬虫的识别);
- 在项目开发及维护时,语义化也很大程度上降低了开发难度,节省成本。
22.<font color=red>怎么给状态栏添加图标?</font>
使用link标签引入:
<link rel="shortcut" href="图标地址">
23.<font color=red>三角形写法?</font>
div{
width: 0;
height: 0;
border-top:10px solid red;
border-left:10px solid #fff;
border-right:10px solid #fff;
border-bottom:10px solid #fff;
}
24.<font color=red>css选择器有哪些,选择器的权重的优先级?</font>
选择器:
-
ID选择器
-
class选择器
-
通配符选择器(*)
-
包含选择器(后代选择器) div p{}
-
群组选择器 p,h1,span{}
-
伪类选择器 :hover
-
伪元素 ::first-line
-
子选择器、相邻选择器
-
属性 [type="text"]
权重优先级:
-
第一等:代表内联样式,如: style=””,权值为1000。
-
第二等:代表ID选择器,如:#content,权值为0100。
-
第三等:代表类、伪类和属性选择器,如.content,权值为0010。
-
第四等:代表类型选择器和伪元素选择器,如div p,权值为0001。
-
通配符、子选择器、相邻选择器等的。如*、>、+,权值为0000。
-
继承的样式没有权值。
25.<font color=red>以下代码输出结果为多少?</font>
function test(person) {
person.age = 26
person = {
name: 'yyy',
age: 30
}
return person
}
const p1 = {
name: 'yck',
age: 25
}
const p2 = test(p1)
console.log(p1) // -> ?
console.log(p2) // -> ?
// console.log(p1)值为:
{
name: 'yck';
age: 26
}
// console.log(p2)值为:
{
name: 'yyy';
age: 30
}
26. <font color=red>循环中解决 var
定义函数的问题?</font>
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
console.log(i) // 因为setTimeout是一个异步函数,这里只会等循环结束后每隔一秒输出6(共5个)
}, i * 1000)
}
解决方法:
- 使用闭包的方式
for (var i = 1; i <= 5; i++) {
function (j) {
setTimeout(function timer() {
console.log(j)
}, j * 1000)
}(i)
}
-
使用
setTimeout
的第三个参数,这个参数会被当成timer
函数的参数传入for (var i = 1; i <= 5; i++) { setTimeout(function timer(j) { console.log(j) }, i * 1000, i) }
-
使用
let
定义i
(推荐)for (let i = 1; i <= 5; i++) { setTimeout(function timer() { console.log(i) }, i * 1000) }
27. <font color=red>什么是浅拷贝?如何实现浅拷贝?什么是深拷贝?如何实现深拷贝?</font>
为防止复制了引用地址,从而会导致改变了一方其他也都被改变的情况。
-
浅拷贝:只会拷贝原所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址。
实现方法:object.assign 扩展运算符
...
-
深拷贝:浅拷贝只解决了第一层的问题,如果接下去的值中还有对象的话,两者享有相同的地址。使用深拷贝解决
实现方法: JSON.parse(JSON.stringify(object))
局限:会忽略undefined 会忽略 symbol 不能序列化函数 不能解决循环引用的对象
28. <font color=red>如何理解原型?如何理解原型链?</font>
原型:
- 原型是函数的伴生体,属性为 prototype;
- 原型属性是一个指针,指向的对象就是原型对象(__ proto __);
- 原型是实例共享方法和属性的地方;
- js 中原型也是对象,可以通过原型实现对象属性的继承;
- 并不是所有的函数都有 prototype 属性。
原型链:
- 函数实例的__ proto __指向构造函数的 prototype;
- 构造函数的原型对象是一个普通的 object,所以它的__ proto __指向object.prototype;
- object 是顶级的对象,它的__ proto __是自己设置(set)和调用(get)。
29. <font color=red>引入css样式的方式?它们的区别?</font>
-
使用<link>标签引入
<link rel="stylesheet" type="text/css" href="文件路径"
-
使用
import
引入<style type="text/css"> @import url(文件路径) </style>
-
区别
a. link 属于html标签,@import完全属于css
b . linlk 能让结构和样式一起加载,@import 先加载结构,后加载样式
c. @import 有兼容问题,link 没有
d. 使用dom控制样式时,link 可用js控制,@import不行
30. <font color=red>HTML元素的分类?</font>
-
块级元素:独占一行,自上而下排列,可以设置宽高
如: div p h1~h6 ul li from 等
-
行内元素:横向排列,不能设置宽高
如: em span i b a strong等
-
行内块(内联)元素:横向排列,可以设置宽高
如: input select img 等
31. <font color=red>什么是盒模型?</font>
无论什么类型的元素,都有一个盒模型,它是css布局的一个基石。
组成:border(边框) margin(边界、外边距) padding(内边距、填充、补白) content(宽、高)
将标准盒模型(content-box)转为怪异盒模型: box-sizing:border-box
32. <font color=red>手写省略号?</font>
div {
width: 200px;
/* height: 100px; */
border: 1px solid #000;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
33. <font color=red>透明的两种写法?</font>
- 标准写法: opacity:数值; 取值范围0~1
- IE写法: filter: alpha (opacity=value); value取值为1~100
34. <font color=red>网络请求的流程?</font>
- 发送报文:当输入一个网址回车时,向服务器发送了一次请求;
- 当请求发送后,服务器接收请求,并做出响应处理;
- 服务器返回处理的结果给客户端----html,css,js,其他资源(图片、视频等)
35. <font color=red>让元素隐藏的方法和文字隐藏的方法?</font>
-
元素隐藏的方法:
display: none (不占空间) visibility: hidden (占空间) opacity: 0 overflow: hidden
-
文字隐藏的方法:
letter-spacing:-1px; text-indent: -2em;
36. <font color=red>五大浏览器内核?</font>
内核:又名渲染引擎,浏览器里量作用的部分,负责解析网页的语法(html、css、js),然后显示出来。
Trident(MSHTML,三叉戟)、Gecko(壁虎)、Presto(迅速的)、webkit(Safari内核,chrome内核原型,它是苹果公司自己的内核,也是苹果的Safari浏览器使用的内核)、 (由Google和Opera Software开发的浏览器排版引擎)
37. <font color=red>写出5种常见的css bug 和 css hack?</font>
- 图片间隙:div种图片间隙,会默认将div撑大3像素,可以将img转为块级元素;图片横向排列时有间隙,可以 使用浮动 float:left;
- 双倍浮向(边距):IE6,使用 display:inline;
- 图片在IE浏览器上有蓝色边框:设置 img{border:0};
- 默认高度:在IE6 及以下中部分块级元素默认默认有低于18px的高度,可以设置 fong-size:0 或 overflow:hidden;
- 表单元素距离顶部的间距不一致:设置 float:left;
- 按钮元素大小不一:设置统一大小;
- 百分比 bug :在IE6 及以下中会出现50% + 50% > 100% 的情况,给右边的浮动元素添加 clear:right;
- 指针 bug:在IE中指针为手型,设置 cursor:pointer;
- 高度塌陷:设置overflow:hidden 或 让子元素浮动;
- <input>中的type属性值为text时,在IE6中文本内容在顶部:给input加一个行高等于高度;
38. <font color=red>手写点击任意li弹出相应下标的几种方法?</font>
var lis = documeng.querySelectorAll('li')
// 使用forEach循环遍历
lis.forEach ((li,index) => {
li.onclick = () => {
alert(index)
}
})
/*lis.forEach ((li,index) => {
lis[index].onclick = () => {
alert(index)
}
})*/
// 给对象新增自定义属性
//循环遍历中绑定的事件只是封装,并没有触发,等触发时循环遍历已经结束;这时的i值为lis.length
for(var i = 0; i < lis.length; i++) {
lis[i].index = i //新增属性赋值于当前下标
lis[i].onclick = function() {
alert(this.index)
}
}
// 使用let进行声明
for(let i = 1; i < lis.length; i++) {
lis[i].onclick = function () {
alert(i)
}
}
// 自调用函数 (IIFE)
for(let i = 1; i < lis.length; i++) {
(function(index) {
lis[index].onclick = function () {
alert(index)
}
})(i)
}
// 使用闭包 closure
for(let i = 1; i < lis.length; i++) {
lis[i].onclick = (function (index) {
return function () {
alert(index)
}
})(i)
}
39. <font color=red>表单method属性中get和post的区别?</font>
- get:在url地址栏中能看到用户信息(请求头中);传送数据量小不能大于2kb;安全性低,但执行效率比post高
- post:在url地址栏中不能看到用户信息(请求体中);传送数据量较大;安全性 高
40. <font color=red>css3 中新增的css特性有哪些?</font>
css3选择器、图片的视觉效果(圆角、阴影、渐变背景、图片边框等)、背景的应用(background-size)、盒模型的变化、阴影效果(盒子阴影、文本阴影)、多列布局和弹性盒布局、web文字和font图标、颜色和透明度、圆角和边框的新特性、2D和3D变形、css3过渡和动画效果、媒体查询和Responselve布局 。
41. <font color=red>什么是私有前缀?作用?列举几个?</font>
当一个属性没有成为 w3c 标准时,浏览器为了支持这个属性而推出了浏览器私有前缀。
作用:更好的让属性在自己的浏览器中显示。
谷歌 -webkit- 火狐 -moz- IE -ms- 欧朋 -o-
42. <font color=red>定位有几种方式?</font>
- relative:相对定位
- absolute: 绝对定位
- fixed:固定定位
- sticky:粘性定位
- static:静态定位
43. <font color=red>html 和 xhtml 的区别?</font>
- xhtml 元素必须被正确的嵌套;
- xhtml 元素必须被关闭;
- 标签名必须使用小写字母;
- xhtml 文档必须拥有根元素。
44. <font color=red>动画效果的三要素?</font>
-
动画名称:animation-name:play;
-
动画时间:animation-duration:3s;
-
动画执行体: @keyframes play {
from { transform:rotate(0deg) translateX(0deg)} to { transform:rotate(360deg) translateX(3600deg)} }
45. <font color=red>数组的常见API?ES5新增的方法?</font>
concat():连接数组
join():改变连接符号,默认“,”
push():向数组末尾添加一个元素,并返回新数组
pop():删除数组最后一个元素,并返回新数组
shift():删除数组第一个元素,并返回新数组
unshift():向数组的开头添加一个元素,并返回新数组
reverse():颠倒数组中的元素的顺序
slice():从数组中返回选定的元素,返回新数组
sort():对数组的元素进行排序
splice():删除、添加数组新元素
tostring():将数组转为字符串
新增方法:
- 2个索引方法: indexOf lastIndexOf
- 5个迭代方法: forEach()、map()、filter()、some()、every()
- 2个归并方法: reduce() reduceRight()
46. <font color=red>手写两种数组排序的方法?</font>
// 冒泡排序
function bubble (arr) {
for(var i = 0; i < arr.length-1; i++) {
for(var j = 0; j < arr.length-1-i; j++) {
if(arr[j] > arr[j + 1]) {
var temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
}
}
}
return arr
}
bubble([....])
// 选择排序
function choose (arr) {
for(var i = 0; i < arr.length-1; i++) {
var minIndex = i
for(var j = i+1; j < arr.length; j++) {
if(arr[minIndex] > arr[j]) {
minIndex = j
}
}
var temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
choose([....])
// 使用 sort 排序
var arr = [....]
var arr1 = arr.sort((a, b) => {
return a - b
})
47. <font color=red>手写几种数组去重的方法?</font>
-
双重for循环去重
function fn (arr) { for(var i = 0; i < arr.length - 1; i++) { for(var j = i+1; j < arr.length; j++) { if(arr[i] === arr[j]) { arr.splice(j--, 1) } } } return arr } fn([....])
-
利用对象的属性名不能重复的特点(效率高)
function distinct(arr) { var obj = {} for(var i = 0; i < arr.length; i++) { if (obj[arr[i]] === undefined) { obj[arr[i]] = 1 } else { arr.splice(i--, 1) } } return arr } distinct([....])
-
使用归并方法 reduce
var arr1 = [....] var arr2 = arr1.reduce((prev, next) => { if (!prev.includes(next)) { // if (prev.indexOf(next) === -1) { prev.push(next) } return prev },[])
-
使用ES6 新增方法 new Set
var arr = [....] var arr1 = [...new Set(arr)] // 或者使用下面这种方法 function distinct(arr) { return Array.from(new Set(arr)) } var arr2 = distinct(arr)
48. <font color=red>字符串常见的API?</font>
charAT():返回指定位置的字符
indexOf():从左往右检索字符串,返回下标
lastIndexOf(): 从右往左检索字符串,返回下标
charCodeAT():返回在指定位置字符的ASCII编码
fromCharCode():从字符编码ASCII创建一个字符串
concat():连接字符串
slice():提取字符串的片段
split():将字符串分割为字符串数组,默认用“,”分割
toLowerCase():将字符串转换为小写
toUpperCase():将字符串转换为大写
trim():去掉字符串前后空格;trimLeft、trimRight
startsWith():字符串是否以某个字符开头,返回Boolean
endsWith():字符串是否以某个字符结尾,返回Boolean
includes():字符串是否包含某个字符,返回Boolean
repeat():重复字符串几次
JSON.stringify():将json格式转为字符串
JSON.parse():将符合json格式的字符串转为json
49. <font color=red>js内置对象有哪些?</font>
- Object对象:所有js对象的超类(基类);
- Array对象:数组对象,定义数组属性和方法;
- Boolean对象:布尔对象,与布尔值相关;
- Date对象:日期对象,与日期时间相关;
- Erroy对象:错误对象,处理程序错误;
- Function对象:函数对象,定义函数属性和方法;
- Math对象:数学对象,各种数学运算工具(不是构造函数);
- Number对象:数字对象,定义数字属性和方法;
- KegExp对象:正则表达式对象,定义文本匹配和筛选规则;
- String对象:字符串对象,定义字符串属性和方法。
50. <font color=red>事件流包含哪几个阶段?</font>
- 捕获阶段:从父元素到子元素寻找的过程;
- 目标阶段:寻找到需要触发事件的目标;
- 冒泡阶段:从子元素开始触发事件,直到父元素触发完毕。
51. <font color=red>对象的三大特点?</font>
- 封装:写对象、用对象,把一些相关的对象和属性放到一起,用一个变量抽象出来,那么就完成了这个对象的封装;
- 继承:子承父业,子对象可以使用父对象的一些属性和方法;
- 多态:重载,根据不同的参数类型、参数个数实现不同的功能;重写,父类的方法不好用,其本身重新定义一个方法名相同的不同的方法;
52. <font color=red>解释this的指向?</font>
- 全局的this指向window;
- 构造函数里的this指即将new的那个对象;
- 对象方法的this指向对象(谁调用this就指向谁);
- 自调用函数(IIFE,立即执行函数)中的this指向window;
- 事件里的this指事件触发对象;
- 箭头函数没有自己的this(指向箭头函数的父级);
- 定时器里的this指向window;
- 对于佚名函数来说,this均指window。
53. <font color=red>常见状态码?</font>
- 101:客户要求服务器根据请求转换HTTP协议版本;
- 200:交易成功;
- 304:客服端已执行GET,但文件未变化;
- 306:前一版本HTTP中使用的代码,现行版本中不再使用;
- 400:错误请求,如语法错误;
- 403:服务器接收到请求,但是拒绝提供服务;
- 404:没有发现文件,请求资源不存在;
- 500:服务器产生内部的错误;
- 503:服务器当前不能处理客服端的请求,一段时间后可能恢复正常;
- 505:服务器不支持或拒绝支持请求头中指定的HTTP版本。
54. <font color=red>前端常用的设计模式有哪些?</font>
- 工厂模式;
- 抽象工厂模式;
- 单例模式;
- 适配器模式;
- 组合模式;
- 代理模式;
- 观察者模式;
- 策略模式;
- MVC模式。
55. <font color=red>什么是变量提升?什么是暂时性死区?var、let 及 const 区别?</font>
提升:代码开始执行之前会将变量声明提升到当前作用域的顶部(赋的值不会提升);
暂时性死区:使用 let 或 const 声明变量时,不能在声明变量之前就使用该变量;
var、let 及 const 区别:
-
函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部;
-
var
存在提升,我们能在声明之前使用(undefined)。let
、const
因为暂时性死区的原因,不能在声明前使用(报错); -
var
在全局作用域下声明变量会导致变量挂载在window
上,其他两者不会(当前作用域); -
let
和const
作用基本一致,但是后者声明的变量不能再次赋值(可以修改)。
56. <font color=red>什么是模块化?</font>
- 立即执行函数:(function(){})();
- AMD 和 CMD:使用 define 定义和 require 引入;
- Common JS:使用 module.export 导出 和 require 引入;
- ES Module:使用 export 或 export default 导出模块,import 引入模块。
57. <font color=red>并发与并行的区别?</font>
并发:宏观概念,在一段时间内通过任务间的切换完成所有的任务,这种情况称之为并发;
并行:微观概念,同时完成多个任务的情况称之为并行。
58. <font color=red>什么是回调函数?回调函数有什么缺点?如何解决回调地狱问题?</font>
回调函数:回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当主函数执行完之后,再执行传进去的这个函数;
缺点:容易写出回调地狱(Callback hell),不利于阅读和维护,不能使用 try catch
捕获错误,不能直接 return
;
解决方法:
- Generator:可以控制函数的执行;
- Promise:在构造
Promise
的时候,构造函数内部的代码是立即执行的; - async 及 await:await 只能配套 async 使用。
59. <font color=red>手写一个简易版的Promise?</font>
const PENDING = 'pending'
const RESOLVED = 'resolved'
const REJECTED = 'rejected'
function MyPromise(fn) {
const that = this
that.state = PENDING
that.value = null
that.resolvedCallbacks = []
that.rejectedCallbacks = []
// 完善 resolve 和 reject 函数
function resolve(value) {
if (that.state === PENDING) {
that.state = RESOLVED
that.value = value
that.resolvedCallbacks.map(cd => cd(that.value))
}
}
function reject(value) {
if (that.state === PENDING) {
that.state = REJECTED
that.value = value
that.rejectedCallbacks.map(cd => cd(that.value))
}
}
// 完善执行 fn 函数
try {
fn(resole, reject)
} catch(e) {
reject(e)
}
}
// 完善 then 函数
MyPromise.prototype.then = function (onFulfilled, onRejected) {
const that = this
onFulfilled = typeof onFulfilled === 'functoin' ? onFulfilled : v => v
onRejected = typeof onRejected === 'function' ? onRejected : r => {
throw r
}
if (that.state === PENDING) {
that.resolvedCallbacks.push(onFulfilled)
that.rejectedCallbacks.push(onRejected)
}
if (that.state === RESOLVED) {
onFulfilled(that.value)
}
if (that.state === REJECTED) {
onRejected(that.value)
}
}
60. <font color=red>浏览器中Event Loop执行顺序?</font>
执行顺序:
-
首先执行同步代码,这属于宏任务;
-
当执行完所有同步代码后,执行栈为空,查询是否有异步代码需要执行;
-
执行所有微任务;
-
当执行完所有微任务后,如有必要会渲染页面;
-
然后开始下一轮 Event Loop,执行宏任务中的异步代码,也就是
setTimeout
中的回调函数。
61. <font color=red>new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?</font>
原理:
- 新生成一个空对象;
- 将构造函数的作用域赋给新对象(链接到原型);
- 绑定this;
- 返回新对象。
区别:
- 使用字面量创建对象有助于优化性能;
- 使用字面量创建对象代码的可读性更高;
62. <font color=red>JS 分为哪两大类型?都有什么各自的特点和区别?你该如何判断正确的类型?</font>
js两大类型:基本类型、引用类型
特点:
- 基本类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。
- 引用类型:当复制保存着对象的某个变量时,操作的是对象的引用,但在为对象添加属性时,操作的是实际的对象。引用类型值指那些可能为多个值构成的对象。
区别:
- 基本类型的变量是存放在栈区的;
- 引用类型的值是同时保存在栈内存和堆内存的;
- 基本类型的比较是值得比较;
- 引用类型的比较是引用的比较。
判断类型:
- typeof:可以判断数据类型;
- instanceof:用来判断当前对象是否是另一个对象的实例(是否挂载在它的的原型上,其判断类型也不是完全正确的)。
网友评论