Vue 进阶面试题 (适用一线)P5水平

1.关于跨域的几种方法

1.1jsonp
1.2proxy代理
1.3cors跨域资源共享
1.4Websocket

2.http 与http区别

HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。并且https协议需要到ca申请证书。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

3.同步和异步的区别

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

4.如何判断对象是不是一个空对象

Object.keys(obj).length == 0
JSON.stringify(obj)===‘{}’

5.如何判断是否是数组

arr instanceof Array //有可能不准确
arr.constructor === Array //有可能不准确 注意:constructor可以被重写,所以不能确保一定是数组
Object.prototype.toString.call(arr) === ‘[object Array]’

6.axios二次封装了啥

多环境:开发、测试、生产环境。

统一错误处理:401、404、500等错误。

断网、请求超时处理。

请求取消/请求拦截:防止重复请求发送到服务端,造成服务端压力。

请求权限:某些接口必须要有登录状态才可以访问。

如何对axios二次封装呢?

​ 首先肯定是要使用create,初始化axios实例,然后设置请求拦截和响应拦截,里边跟根据具体业务需求编写逻辑,比如加token呀,或者是响应拦截的错误处理,然后呢就是api的集中式管理,比如用户服务接口,就都封装在user.js文件里,页面如果使用直接调用传值就可以
 

7.原型和原型链

原型:每一个 JavaScript 对象(null 除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性,其实就是 prototype 对象。
原型链:由相互关联的原型组成的链状结构就是原型链。

8.作用域与作用域链

作用域:规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。换句话说,作用域决定了代码区块中变量和其他资源的可见性。(全局作用域、函数作用域、块级作用域)

作用域链:从当前作用域开始一层层往上找某个变量,如果找到全局作用域还没找到,就放弃寻找 。这种层级关系就是作用域链。

作用域就是变量的可用性的代码范围,就叫做这个变量的作用域。简单理解,
就是在这个范围内,变量是可以使用的,超过这个范围,变量就无法使用,这个范围就是作用域。

作用域分为三种:全局作用域、局部作用域、块级作用域。

全局作用域
顾名思义,全局作用域就是能够在全局使用,可以在代码的任何地方被调用。
示例:创建一个拥有全局作用域的变量a
var a=0;
function fun(){
	conslie.log(a);//在函数内部访问变量a
}
console.log(a);//在最外层访问变量a


局部作用域
局部作用域只能作用于局部的代码片段,常见于函数内部,即函数内创建的变量,
只能作用于函数内部,函数外部无法使用函数内部创建的变量。示例:
创建一个拥有局部作用域的变量b
function fun(){
	var b=1;
	console.log(b);//1
}
console.log(b);//b is not defined


块级作用域
块级作用域是es6新增的,使用let关键字创建变量、
const关键字创建常量(当然let、const也会有自己的语法规范,这里不过多展开),
作用域只存在于{}花括号内。示例:创建一个拥有局部作用域的变量c
function fun(){
	let c=1;
	const d=2;
	console.log(c);//1
	console.log(d);//2
}
console.log(c);//c is not defined


二、什么是作用域链?
当你要访问一个变量时,首先会在当前作用域下查找,如果当前作用域下没有查找到,
则返回上一级作用域进行查找,直到找到全局作用域,这个查找过程形成的链条叫做作用域链。

var a = 0;
var b = 0;

function fun1() {
	var b = 1;
	function fun2() {
		console.log(b);//1 在当前作用域下没有找到,到上一级作用域中查找
	}
    fun2();
	console.log(b);//1
}
fun1();
console.log(b);//0

9.提到测试环境,首先就要搞清楚开发环境,测试环境,生产环境三者有什么区别?

项目部署环境一般可分为三种:生产环境,测试环境,开发环境
1、开发环境:开发环境时程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告和测试工具,是最基础的环境。
2、测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产服务器上,是开发环境到生产环境的过度环境。
3、生产环境:生产环境是指正式提供对外服务的,一般会关掉错误报告,打开错误日志,是最重要的环境。部署分支一般为master分支。
上述环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通产说的真实的环境,最后交给用户的环境。
简单来说,开发环境就是开发人员在开发联调时比如前后端交互的本地环境,他们一般在本地开发完成后会将代码部署到测试环境,也就是提交测试。
对于规模稍微大点的公司来说,测试环境可能不止一套,像我们公司就有2套测试环境,主要用来满足不同版本上线前测试的需要。
公司一般划分为不同的部门或者系统,来具体负责公司的每一块业务。然后不同系统之间就会有交互,所以当是一个软件项目需求时,这些系统就需要保证是在同一套测试环境才可以测试联调。
生产环境就好理解了,测试在测试环境测试完成之后,版本上线日,运维发布上线。生产环境就是线上环境,直接面向用户的环境。
一般来说,生产环境的管理权限是十分严格的,一般开发测试只有查询权限,像修改这些,都掌握在业务或者运维手里,更高的权限可能要经过管理层审批才可以执行。
像之前新闻上的删库跑路事件,就是没有做好生产数据的权限控制,一个普通的开发工程师居然可以删除掉大批生产数据,导致公司业务瘫痪,损失高达数亿金额。
关于如何搭建测试环境,也是面试会经常问到的一个问题,一般常见于一些创业公司,因为测试环境不够完善,可能会遇到搭建环境这个问题。
一般来说,测试环境搭建都属于运维的工作范畴,但是可能有些创业公司就没有运维这个岗位,就只能测试人员来搞了。

10.0.1+0.2===0.3么?  0.1 + 0.2 == 0.3 吗?

10.   0.1+0.2===0.3么?
0.1 + 0.2 == 0.3 吗?
不等于
“0.1 + 0.2 并不等于完整的 0.3,这主要是因为这两个小数无法用「完整」的二进制来表示,只能根据精度舍入,
所以计算机里只能采用近似数的方式来保存,那两个近似数相加,得到的必然也是一个近似数
0.1 + 0.2 == 0.3 吗?

答案是:0.1 + 0.2 不等于 0.3!
通过浏览器控制台可看到结果是令人奇怪的 0.30000000000000004 而不是 0.3

这是因为我们的计算机在存储数据的时候有一个基本的原则:

用有限的存储空间,来存储二进制数据! 也就是俗称的2位  0.3

11.事件流

捕获  冒泡       
【捕获阶段】是从外向内   【冒泡阶段】是从内向外
阻止默认行为发生
某些情况需要阻止默认行为的发生,比如阻止链接的跳转、表单域的跳转

语法:e.preventDefault()

12.闭包

 1.什么是闭包

闭包:内部函数可以访问到其所在外部函数中声明的参数和变量,即使再外部函数在终结之后
全局作用域中是访问不到局部作用域里面的变量的,js提供的解决办法就是在函数里面在定义一个函数,
也就是闭包
闭包函数:声明在一个函数中的函数,叫做闭包函数
2.闭包的优缺点
优点:有利于封装,可以访问到局部变量;不会污染全局变量
缺点:内存占用浪费;内存泄漏
内存泄漏:不再用到的内存,没有及时释放
闭包就是找到同一地址中父级函数中对应变量的值

13.垃圾回收机制

 垃圾回收机制javaScript在创建对象时会主动为它分配内存,不再使用时会释放其内存。
(垃圾回收器会周期性找出不再使用的变量,然后释放其内存。)
回收方式
垃圾回收机制主要有两种方式,一种是标记请除,一种是引用计数
1.标记清楚法
function
 test(){
   var a = 10 ; //被标记 ,进入环境
   var b = 20 ; //被标记 ,进入环境
   }
   test(); //执行完毕 之后 a、b又被标离开环境,被回收。
2.引用计数法

function
    test(){
    var a = {} ; //a的引用次数为0
    var b = a ; //a的引用次数加1,为1
    var c =a; //a的引用次数再加1,为2
    var b ={}; //a的引用次数减1,为1
      }

常见的内存泄露
全局变量,未清除的定时器,DOM的使用,闭包

14.重绘 回流

什么是重绘?
重绘:当渲染树中的一些元素需要更新属性,而这些属性只是影响元素的外观、风格,

而不会影响布局的操作,比如 background-color,我们将这样的操作称为重绘。

什么是回流?
回流:当渲染树中的一部分(或全部)因为元素的规模尺寸、布局

、隐藏等改变而需要重新构建的操作,会影响到布局的操作,这样的操作我们称为回流。

常见引起回流属性和方法:
任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流。
(1)添加或者删除可见的 DOM 元素;
(2)元素尺寸改变——边距、填充、边框、宽度和高度
(3)内容变化,比如用户在 input 框中输入文字
(4)浏览器窗口尺寸改变——resize事件发生时
(5)计算 offsetWidth 和 offsetHeight 属性
(6)设置 style 属性的值
(7)当你修改网页的默认字体时。

小结 : 
回流必定会发生重绘,重绘不一定会引发回流。
回流所需的成本比重绘高的多,改变父节点里的子节点很可能会导致父节点的一系列回流。

15.promise


Promise对象有三种状态
pending (初始态): 等待中,或者进行中,表示还没有得到结果
resolved(Fulfilled): 已经完成,表示得到了我们想要的结果
rejected: 也表示得到原因,但是由于原因并非我们所愿,因此拒绝执行


async/await是对Promise的改进,准确来说是语法糖,本质上还是Promise。

Promise方法:then()

   then() 接受两个回调函数作为参数。当 Promise 执行的内容符合成功条件时,调用resolve函数,
失败就调用 reject 函数。其中第二个参数可以省略(catch()方法的作用),
then方法返回的是一个新的 Promise实例,因此可以链式调用。


Promise方法:catch()
        catch() 该方法相当于then方法的第二个参数,指向reject的回调函数;
、还有一个作用是在执行resolve回调函数时,如果出现错误,抛出异常,不会停止运行,
而是进入catch方法中。

Promise方法:all()
        all()方法可以完成并行任务, 它接收一个数组,数组的每一项都是一个 promise对象。
当数组中所有的 promise的状态都达到 resolved的时候,all方法的状态就会变成 resolved,
如果有一个状态变成了 rejected,那么 all方法的状态就会变成 rejected。

Promise方法:race()
        race() 接受的参数也是一个每项都是 promise的数组,当最先执行完的事件执行完之后,
就直接返回该 promise对象的值。如果第一个 promise对象状态变成 resolved,
那自身的状态变成了resolved;反之第一个 promise变成 rejected,那自身状态就会变成 rejected。

Promise方法:finally()
        finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

猜你喜欢

转载自blog.csdn.net/weixin_53185230/article/details/127687905
今日推荐