前端面试题答法个人总结

381 阅读11分钟

js部分

1.数据类型有哪些?

有8种类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt;

其中Symbol、BigInt为ES6中新增的数据类型。

Symbol代表一个独一无二且不可变的数据类型,主要解决可能出现的全局变量冲突的问题。

BigInt是一种数字类型的数据,可以安全的存储和操作最大整数。

2.数据类型检测方法有哪些?

有四种,分别是typeof,instanceof,constructor和Object.prototype.toString.call()

其中typeof检测数组、对象、null都会被判断为object。

instaceof只能判断引用数据类型。

3.判断数组的方式有

有5种,分别是instanceof,

Object.prototype.toString.call(),

Array.prototype.isPrototypeOf

通过原型链做判断,

通过ES6中的Array.isArray()判断

4.null和undefined区别

null表示一个空对象,主要赋值给可能会返回对象的变量,作为初始化。

undefined表示为定义,一般变量声明了但是没有定义会返回undefined

5.typeof null的结果是什么?

Object,因为他和Object的类型标签都是000。

6.为什么0.1+0.2 ! == 0.3,如何让其相等

因为数据是利用2进制存储的,这两个数都是无限循环的数字需要进行舍入,所以转为10进制会有误差。判断0.1+0.2-0.3< Number.EPSILON即可。

7.isNaN 和 Number.isNaN 函数的区别?

Number.isNaN会先判断参数是否为数字,如果是数字再继续判断是不是NAN,不会进行类型转换,相对于isNaN来说更准确。

8.什么是JavaScript中的包装类型

在调用基本类型的属性或方法时,Js会在后台进行隐式转换,可以用Object()来观察,也可以用valueOf倒转回去。

9.如何进行隐式转换?

用ToPrimitive方法。

10.new操作符的实现原理?

1.创建一个新的空对象。

2.设置原型为函数的原型。

3.让这个函数的this指向这个对象。

4.函数返回的是值就返回创建的对象,返回的是引用类型,就返回这个引用类型的对象。

11.让js脚本延迟加载的方法?

给js添加defer属性(在文档解析完执行脚本)

async属性进行异步加载,

定时器,活着把js放最下面

12.什么事类数组?常见的类数组有哪些?怎么转变为数组?

类数组就是有length属性和若干索引属性的对象。常见的有arguments和DOM方法的返回结果。最常用的转变为数组的方法是Array.from()

13.数组的原生方法有哪些?

增:push unshift splice concat

删:pop shift splice slice

改:splice

查:indexOf includes find

排序:reverse sort

转换:join

迭代方法:some every forEach filter map

补:字符串有哪些常用的方法?

  • 增:+或着模板语法或者concat
  • 删:slice,substr,substring
  • 改:trim(删除空格) repeat(复制) padStart toUpdateCase
  • 查:indexof includes charAt(返回指定索引位置的值)

14.如何遍历类数组?

可以先转成数组,或者用展开运算符,或者用call和apply方法。

15.forin forof的区别?

forin主要为了遍历对象,但是会遍历到整个原型链,性能比较差,forof是Es6新增的方法,可以不会遍历到原型链,也适合遍历数组字符串等等。

16.谈谈对于原型原型链的理解?

使用构造函数实例对象时,构造函数内部有一个prototype属性,这个对象的指针指向prototype属性,这个指针就成为对象的原型。

当访问一个对象的属性时,如果内部不存在这个属性,就会在他的原型对象里找这个属性,如果还是没有,就再原型对象的原型上找,一直找,这就是原型链。

17.对于闭包的理解?有啥用?

一个函数引用了一个函数,那么内部的函数就称为闭包,他可以访问到外部函数的变量。

可以延长变量的生命周期。

18.对于作用域和作用域链的理解。

作用域有三种,全局作用域,函数作用域,块级作用域。

当在当前作用域找不到所需变量时,就会去父级中寻找,找不到就再往上找,直到window对象,这就是作用域链

19.对于this的理解。

函数调用this指向全局对象

作为方法调用this指向这个对象

new一个构造函数,this指向实力出来的对象。

this可以用call apply指定this指向

20.call和apply的区别

传入参数形式不一样,apply传入数组,call传入多个参数。

21.对于Promise的理解,对于async的理解

Promise是一种对于异步编程的心方法,解决了地狱回调的问题。

async是Promise的一种语法糖,Promise虽然解决了地狱回调问题,但是他还是一直在调用then方法,代码看起来还是一个链式调用,使用async会让代码看起来更像是同步代码。

22.Promise内置的方法有哪些?

Promise.resolve直接进入成功状态调用.then,同理Promise.reject直接进入失败状态。

Promise.all可以完成并行任务,接收的promise对象都是成功all就是成功,有一个失败all就是失败。

Promise.race和all类似,但是他执行完第一个resolved就返回了。

Promise.finally是不管什么状态都会执行。

23.对象继承的方法有哪些?

1.原型链继承:会造成修改混乱

2.利用构造函数继承:只能继承父类的属性,不能使用父类原型上的属性和方法

3.以上两种组合继承:但是我们是把父类的实例作为子类的原型,这样会造成子类中多了不必要的属性。

4.原型继承:利用Object.create来进行浅拷贝,但是也可能造成修改混乱

5.寄生事继承:

6.寄生组合类继承:使用父类原型的副本作为子类的原型,避免创建不必要的属性。

24.什么是深浅拷贝?如何实现深拷贝?

  1. 浅拷贝是拷贝的内存地址
  2. 深拷贝会开辟一个新栈,不会改变另一个对象的属性。
  • 可以用lodash中的 _.cloneDeep()
  • 可以用jquery中的 jQuery.extend()

25.什么是事件循环?

事件循环就是实现单线程非阻塞的方法。 在js中,所有的任务分为同步任务和异步任务,异步任务又分成宏任务和微任务。在执行任务时,首先在主线程中执行同步任务,异步任务进到队列。待主线程中的任务执行完毕,再将异步任务从队列中拉到主线程中执行。

26.什么是递归?

递归就是函数定义中使用函数自身的方法。

尾递归只需要保存一个调用栈

27.什么是函数缓存

就是把函数运算结构进行缓存,可以用闭包或者柯里化实现函数缓存。

28.怎么理解防抖和节流

防抖:n秒后执行,如果n秒内重复执行则重新计时 节流:n秒内只能运行一次,重复执行只生效一次

vue部分

1.vue的理解?

vue是一个MVVM框架,利用Object.defineProperty实现了响应式,并且使用了组件化编程,使代码逻辑更加清晰简单。

2.双向数据绑定的原理

在Observe种对data执行响应化的处理

在Compile中找到动态绑定的数据,从data中获取并初始化视图

定义一个更新函数和Watcher,当有数据变化时,Watcher会调用更新函数,

由于动态绑定的数据可能会出现多次,所以它所有的Watcher都需要一个Dep来管理。

3.对SPA的理解

SPA是单页面应用,是使用vue-router来实现的。

4.vue-router有那两种模式,有什么区别?

1.hash模式:现在是基本是SPA的标配,hash值会出现在URL中,URL有#,不会出现在http请求中,对后端没有影响。

2.history模式:URL没有#,输入URL需要后台配置支持。

5. 路由如何传参?

可以用query和params方式来传递参数,params模式需要进行占位,通过$router来获取

6.路由守卫

全局有三个路由钩子:router.beforeEach,router.afterEach和router.beforeResolve

路由独享守卫:beforeEnter

组件内部钩子:beforeRouteUpdate、beforeRouteEnter、beforeRouteLeave

7.对vuex的理解

vuex实际上就是一个vue提供的仓库,有三个模块,actions,mutations,state。利用dispatch将方法和参数提交给actions,一般想后台请求数据就在这个模块中完成。利用commit提交给mutations,mutations是修改state的唯一推荐方法。而state就是存储数据的库。getters就相当于计算属性

7.v-show和v-if的区别

v-show的显示隐藏是给该元素添加css属性,元素还在,但是v-if是直接讲dom元素添加或删除。

v-if切换有一个局部的编译/卸载,切换时会适当销毁和重建内部的监听和子组件。

v-if时false时不会操作,知道时true才开始操作,一般用于不会变化的值时,v-show一般用于频繁发生改变的操作。

8.v-for和v-if为啥不建议一起用?

因为v-for的优先级比v-if高,所以会先循环再判断,造成性能浪费,可以在外层嵌套template进行v-if判断。如果判断在内部,那么用计算属性先过滤再循环

9.对于生命周期的理解

共分为8个阶段,创建前后,挂载前后,更新前后,销毁前后。

created用于获取异步数据,

mounted获取数据和dom

10.NextTick是什么?

当数据更新了,在dom中渲染后,自动执行该函数,一般在created中操作dom要用到这个函数

11.data为什么是个函数不是对象?

因为vue会存在多个组件,每个组件中都有data,在A组件修改data的时候,实际上也会更改其他组件中的data造成数据污染。

12.对于mixin的理解

如果当不同组件需要相同代码的时候,可以用mixin给这些代码提出来

13.什么是虚拟DOM

它是对于真实DOM的抽象,在节点发生改变时,经过diff算法得到需要修改的值,再更新视图,减少dom操作,提高性能

14.组件间的通信方式有几种?

  1. 通过props传递
  2. 通过ref
  3. 通过$emit触发自定义事件
  4. EvenBus全局事件
  5. Vuex

15.给对象添加新属性,界面不会刷新,为什么?怎么搞?

新增加的属性并没有通过Object.definepropty设置成响应式数据。

使用Vue.set方法

16.了解Vue.observable吗?

Vue.observable是给对象添加响应式。返回的对象可以直接用在函数或者计算属性中。

一般在非父子通信时可以用到。

17.key有啥用?

key给每一个vnode一个唯一的id,是diff的一种优化策略,可以根据key更快更准确的找到节点。可以更高效的刷新dom。

18.怎么缓存组件?

使用keep-alive,一般用于缓存路由组件

缓存后如何获取数据?beforeRouteEnter或者自身的actived

19.vue中有哪些常见的修饰符

  • 表单修饰符 trim lazy number
  • 事件修饰符 once prevent stop
  • 鼠标修饰符
  • 键盘修饰符

20.封装过axios?封装哪些内容?

封装baceURL,timeout,请求拦截器和响应拦截器

HTTP协议

1.HTTP1.0 1.1 2.0的区别

1.0:每次与服务器交互都会新开一个连接

1.1:建立一次连接可以进行多次请求,将这些请求按次序执行

2.0:一次连接,多路复用,无序通畅

2.状态码

  • 1 表示消息
  • 2 表示成功
  • 3 表示重定向
  • 4 表示请求错误
  • 5 表示服务器错误

3.GET和POST的区别

  • GET请求是获取数据,POST请求是向指定资源提交,比如注册用户

  • GET请求将参数放在URL中,相比于POST不安全。

  • get请求URL地址有长度限制,根据浏览器的不同,限制字节长度不同

4.HTTP常见的请求头有哪些?什么作用?

  • Accept:浏览器能够处理的内容类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

5.输入URL敲下回车后?

  • URL解析
  • DNS 查询
  • TCP 连接
  • HTTP 请求
  • 响应请求
  • 页面渲染

6. http和https的却别

  • HTTP 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
  • HTTP 是明文传输,HTTPS 通过 SSL\TLS 进行了加密
  • HTTP 的端口号是 80,HTTPS 是 443
  • HTTPS 需要到 CA 申请证书,一般免费证书很少,需要交费
  • HTTP 的连接很简单,是无状态的;
  • HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

7.cookie 和localStorage和sessionStorage的区别

  • cookie可以设置失效时间,如果不设置的话即使关闭浏览器默认失效
  • local是永久保存的,除非手动清除。
  • session是仅在当前页面下有效
  • cookie仅能存放4kb数据,而另外两个可以存放5MB
  • cookie会携带HTTP头,如果存放过多数据会造成性能问题,而另外两个是在浏览器中保存,不参与服务器的通信

CSS部分

1.标准盒子与怪异盒子的理解?

标准盒子的width和length不带边框和边距;可以用box-sizing: border-box来转成怪异盒子模型。

2.有哪些选择器?

id选择器,类选择器,标签选择器,后代选择器,子代选择器。还有一些伪类选择器和伪选择器

3.px、em、rem、vh与vw

px是绝对单位,按照精确的像素展示

em是相对单位,基于自身字体大小

rem也是相对单位,基于html的字体大小

vh和vw主要用于页面视口大小的布局。

4.使元素水平居中的方法

  1. 利用定位 + margin:auto
  2. 先移动50%,再margin负值。
  3. 先移动50%,再用transform移动-50%
  4. flex布局

5.如何实现两栏一栏自适应,三栏一栏自适应

利用flex弹性布局,自适应部分flex:1

6.如何理解回流和重绘

回流:布局或属性需要改变。 重绘:布局不发生改变的情况下,改变样式。

  • 在CSS中可以使用visibility代替display:none
  • 尽量避免使用table布局
  • 避免多层内嵌样式
  • 动画应用到定位的元素上。
  • 在js中可以避免频繁操作样式,频繁访问DOM,可以用变量缓存起来

7.