2022前端面试整合

1.原型对象,原型链,数据类型,闭包

2.vue原理 ,react基本

3.浏览器渲染过程,https,http缓存

4.数组的方法

5.webpack打包流程和loader,plugin的配置优化

6.js作用域

7.浏览器时间循环

8.事件循环

9.keep-alive生命周期

 1.activated:页面第一次进入的时候,钩子触发的顺序created-mounted-activated

 2.deactivated:页面退出会触发deactivated,当再次前进或后退时触发activated

10.keep-alive属性:正则/数组需要v-bind绑定

 1.include字符串或正则表达式,只有匹配的组件会被缓存

eg:

//将缓存name为test-keep-alive的组件

[if !supportLists]2. [endif]exclude字符串或正则表达式,任何名称或组件都不会被缓存

 eg:

[if !supportLists]3. [endif]max数字,最多可以缓存多少组件实例


11.Vue中计算属性、方法与侦听属性的区别

计量属性computed在使用时,函数里面所有的变量都会被监听,只要里面某一个值变动,便会将整个函数执行一遍

 特性

1. 是计算值

2. 应用:就是简化tempalte里面{{}}计算和处理props或$emit的传值

3. 具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,而不是再次执行函数


而watch只是监听某一个值,若是监听的值里面也有很多变量,也会全部监听

 特性

1. 是观察动作

2. 应用:监听props,$emit或本组件的值执行异步操作

3.无缓存性,页面重新渲染时值不变化也会执行




12.Vue生命周期:(四个阶段,八个钩子函数)

1. 创建阶段(create):beforeCreate(){创建前},created(){创建后}

2. 挂载阶段(Mount):beforeMount(){载入前},mounted(){载入后}

3. 更新阶段(Update):beforeUpdate(){更新前},updated(){更新后}

4. 销毁阶段(destroy):beforeDestroy(){销毁前},destroyed(){销毁后}


13.侦听object数据----定义属性:

Let contact = ‘陈涵’

Object.defineProperty(demo,’name’,{

Enumberable:true,

Configurable:true,

Get(){

Return contact

},

Set(){}

})

14.什么是BFC

BFC:块级格式化上下文,它是指一个独立的块级渲染区域,只有Block-level Box参与,该区域拥有一套渲染规则来约束块级盒子的布局,且与区域外部无关。

现象:一个盒子不设置height,内容子元素都浮动时,无法撑起自身,这个盒子就没有形成BFC

形成BFC的办法:(父元素设置)

1.float不是none

2.position的值不是static或者relative

3.display的值是inline-block,flex,inline-flex

4.overflow:hidden(最好的办法)

好处:

1.解决margin塌陷,如图


2.阻止元素被浮动元素覆盖,实用性为0,实际开发中浮动就都浮动,不浮动就都不浮动,否则会脱离文档流。如图:


15.深浅拷贝及symbol

数据存储

1,一般数据类型:number  string  boolean  null  undefined   symbol (唯一性,修饰的作用,不相等,遍历用reflect.ownKeys(object),symbol.for(), symbol.keyFor() )

symbol实际应用:


2,  引用数据类型:object    数组   set  map 

第一个打印的是:基本数据类型,第二个打印的是:symbol数据类型,第三个都打印,如下图

赋值和浅拷贝的区别:

1.赋值

浅拷贝需要创建一个新的对象,而赋值不是

这是赋值

结果都是:科比

2.浅拷贝-一般数据类型

这是浅拷贝

没有改变原数据:所以结果是:乔丹,科比

3.浅拷贝-引用数据类型

因为hobby是引用类的数据类型,拷贝的是内存的地址 ,也就指向同一个房间。拷贝前和拷贝后是相互影响的,所以结果都是冰球

4.深拷贝(入过属性是引用数据类型,那么就会开辟一个新房间)

应用场景:组件

16.xss攻击:比如一个神秘的URL没有做转义,加了一个script代码,然后渲染到页面中被执行

1.什么情况下会产生xss攻击:

1,渲染到页面中,以script标签注入,不做转义就会产生xss攻击

2,a链接跳转的时候,即使做了转义也会产生xss攻击,用白名单的方法解决

3,URL以 “javascript:” 开头也会产生xss攻击,用白名单的方法解决,禁止调 “javascript:” 链接、非法scheme等

2.xss分类:

1,存储型xss:(后端数据库)用户在提交数据时,后端没有做过滤,直接存储到后端数据库,最后前端从后端取用数据就会产生xss攻击

2,反射性xss:(URL)

3,DOM型xss:(后端数据库/前端存储/URL)较前两种,DOM型取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,而前两种属于服务器的安全漏洞。

17.crsf攻击:


18.proxy:代理

1.proxy与Object.defineProperty对比:(vue3废弃Object.defineProperty)

1.监听对象不需要遍历,而Object.defineProperty需要遍历

2.可以监听到新增加的属性,而Object.defineProperty不可以

Object.defineProperty无法增加hobby属性


proxy可以新增属性

问题:Object.defineProperty无法监听数组的变化,除了proxy之外还有什么办法可以监听?

答案:默认将数组长度设置为1000,监听0-999的属性变化,如图

2.监听push、shift、pop、unshift等方法:

18.闭包:能够读取其他函数内部变量的函数

实际运用:回调函数

1,作用域:(执行上下文)

1,全局作用域  

2,函数作用域


bind实例

2,call-bind-apply的理解与区别:改变this的指向

3,call,apply区别:传入的参数不一样,call需要穿入逐个的,apply可以传一个数组,如下图:

可以改为Math.max.call(null,...[arr1])   -------   展开预算符的拆包

4,应用

1.将 伪数组 转化成 数组

伪数组和数组的区别:伪数组看着是数组,但是并没有方法,通过call改变它的指向

通过call改变它的指向,变成array的slice,转成真正的数组,但是slice  ie8以下识别不了报错,所以用for循环,如下图

答案:

前者是伪数组,后者是数组


arguments:

答案如下:

数组的拼接:

判断数据类型:

封装一个准确判断数据类型的函数:

function getType(obj){

  let type  =typeof obj;

  if(type != "object"){

    return type;

  }

  returnObject.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');

}



区分obj和array:

1.typeof(最低级,最常用,只能判断基本数据类型)

2.instanceof(一般用来判断A是否是B的实例,表达式:A instanceof B    是返回true,不是返回false)

3.constructor

4.Object.prototype.toString.call()
























19.构造函数:用来初始化对象的(——construct)


20.原型(prototype)与原型链(_proto_  ;  =>[[prototype]])

原型:函数特有

原型链:任何数据都有原型链,如数组,对象,number都是有的

从当前实例属性去查找,如果找到了就返回,否则顺着原型链一层一层往上找,直到找到null为止,如果找到null都没找到,就会报错

输入:age , demo
原型链关系图


21.数组的方法:

join():把数组转换成字符串,eg:

push()和pop():添加到末尾 / 移除末尾,都是返回修改后的长度,eg:

shift() 和 unshift():移除开头项,返回移除的项 / 添加到开头,返回长度,eg:

sort():按字符串排序,按数值排序arr.sort(sortNumber),eg:

reverse():倒叙排序,eg:

concat():将参数添加到原数组,不改变原数组,eg:

slice():根据下标截取数组,组成新的数组,eg:

splice():删除,插入,替换,eg:

indexOf()和 lastIndexOf() (ES5新增):从前往后查找 / 从后往前查找,eg:

forEach() (ES5新增):循环遍历,eg:

map() (ES5新增):返回新数组,不改变原数组,eg:

filter() (ES5新增):过滤,eg:

every() (ES5新增):判断数组中每一项是否满足条件,全部满足返回true,只要有一个不满足即返回false,eg:

some() (ES5新增):判断数组中是否有一项满足条件,有一项满足返回true,全部不满足即返回false,eg:

2.类数组转化为数组:

args = Array.prototype.slice.call(arguments)


22.支付安全问题:非对称,rsa ,一般数字签名,然后sha或md5进行加密


23.箭头函数:没有{},不需要return


结果:3
结果是一个对象:{a:2}

1,函数体内的this:

面试题:

2,不可以当做构造函数

3,arguments 是不可以的

4,不可以当做 generator(迭代器)函数


24.ES6快速去重:

let arr = [11,23,45,55,11,23]

let item = [...new Set(arr)]

console.log(item)

25.Promise:

1.构造函数同步执行 -> .then()方法异步执行



26.闭包:

优:1.使用闭包可以通过外部函数访问内部的函数值,提升作用域;2.便于链式调用可重复使用,不会造成全局污染;3.私有性,封装性强,有效防止了命名冲突

缺:1会常驻内存,不会被回收,IE中容易造成内存泄漏,慎用;

1.闭包是什么?  -----  方法里返回一个方法

2.闭包的意义是什么?-----   1.延长变量的生命周期  2.创建私有环境----------项目运行会生成一个临时的变量对象AO(active object),会存储所有的方法以及局部变量,全局变量不会在AO里面

3.作用域链:----- 层层查找,就近原则

打印出:小红

4.vue 中 data() 为什么是一个函数?  ------   保证了每一个组件都有一个私有的作用域

就是一个闭包

27.防抖与节流

1.防抖:=》,在固定的时间内,时间只允许发生一次;

应用场景:1.input框输入自动补全事件;2.频繁的操作点赞或取消点赞之类;3.浏览器窗口大小改变后,只需窗口调整完成后,再执行resize事件中的代码,防止重复渲染;

实现原理:如果在500ms内频繁操作,则每次都会清除一次定时器然后重新创建一个。直到最后一次操作,然后等待500ms后发送ajax

2s之后才会发送请求

2.节流:=》保证一定时间内只调用一次函数

应用场景:1.提交表单;2.高频的监听事件;

2.还有一种方法就是用时间戳节流

28.Vue2响应式:

短路表达式:

29.MVC与MVVM

1.双向数据绑定:

2.v-if和v-show的区别:

v-if:不满足条件,不会渲染dom  =》 单次判断

v-show:隐藏dom   =》 多次切换   -------   不能用于权限操作


30.数据类型:

原始数据类型:String,number,boolean,undefined,null

引用数据类型:数组,对象,函数

存储:

31.栈和堆:

栈:先进后出,自动分配释放

堆:队列优先,先进先出,动态分配空间,一般由程序员分配释放,若程序员不释放,程序结束时可能右OS回收,容易产生内存泄漏

32.js内置对象:

1.值属性,这些全局属性返回一个简单值,这些值没有自己的属性和方法。如:NaN,null,undefined,Infinity

2.函数属性,全局函数可以直接调用,不需要再调用时指定所属对象,结束后会将结果直接返回给调用者。如:eval(),isNaN()

3.基本对象,包括一般对象,函数对象和错误对象。如:Object,Function,Boolean,Symbol,Error

4.数字和日期对象。如:Number,Math,Date

5.字符串。如:String,RegExp

6.可索引的集合对象。如:Array

7.使用键的集合。如:Map,Set,WeakMap,WeakSet

8.矢量集合。如:SIMD

9.结构化数据。如:Json

10.控制抽象对象。如:Promise,Generator

11.反射。如:Proxy,Reflect

12.国际化,为了支持多语言处理而加入 ECMAScript 的对象。如:Intl、Intl.Collator

13.WebAssembly

14.其他。如:arguments

33.diff算法中patch方法:




34.uni-app:

模拟器:夜神模拟器,在电脑模拟真机测试

uni的生命周期:onLaunch(只触发一次),onshow(启动),onHide(前台进入后台),onError(报错)

页面的生命周期:  onLoad(加载),onShow(显示),onReady(初次渲染),onHide(隐藏),onUnload(监听页面卸载) ,onResize(窗口尺寸),onPullDownRefresh(下拉刷新),onReachBottm(页面滚动),onTablemTap(点击tab时触发),onShareAPPMessage(分享)

组件的生命周期:beforeCreat(创建前),created(创建后),beforeMount(挂载前),Mounted(挂载后),beforeUpdate(更新前),undated(更新后),beforeDestroy(销毁前),destroyed(销毁后)

条件注释:#ifdef H5/WP-WEIXIN  开始     #endif结束

组件之间传值:

1.父传子:props

2.子传父:$emit

3.兄弟传值:

获取后台数据:

格式化年月日:

全局










35.


36.

37.

38.

39.








40.vue2---->vue3的变化

新特性:

1.以前data  现在setup 然后return出去

你可能感兴趣的:(2022前端面试整合)