GO

1.umi包含了些什么?

umi是react快速开发的框架,里面包含了react,antd,redux等组件

Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。

redux 是 js 应用的可预测状态的容器。 可以理解为全局数据状态管理工具(状态管理机),用来做组件通信等。

2.从输入一个 URL 地址到浏览器完成渲染的整个过程?

在浏览器中输入url地址,按回车键

浏览器解析url地址,查看是否存在缓存,并看缓存是否过期

dns解析url对应的ip地址

根据ip建立tcp连接

发送http请求

服务器接收http请求,浏览器接收服务器响应的数据

浏览器根据响应的数据渲染页面

关闭tcp链接

3.什么是事件代理(事件委托) 有什么好处

事件委托的原理:不给每个子节点添加事件监听器,而是在其父节点上添加监听器,利用冒泡的原理设置每个子节点

4.addEventListener 默认是捕获还是冒泡

默认是冒泡

addEventListener第三个参数默认为false代表执行事件冒泡行为,当为true时执行事件捕获行为

5.apply call bind 区别

三者都是改变函数的this指向,如果对象是undefined或者null,就指向window

call(Object,param1,param2...)     立即执行

applay(Object,[param1,param2,param3...])  立即执行

bind(Object,param1,param2.....)     返回的是函数

6.css 优先级是怎么计算的

!important>内联样式>ID选择器>类、伪类>标签>子类选择器、兄弟选择器>继承的样式没有权值

7.position 有哪些值,作用分别是什么

static:默认值,存在于正常的文档流中,不受top、left、bottom、right、z-index的影响

relative: 相对定位,一般用于父子关系,存在于正常的文档流中

absolute:绝对定位,脱离文档流,看父级设置position没,如没有就按照body定位,有就按照父级position定位

inherit:继承父级的position,ie8及以上的浏览器不支持

fixed:是absolute的特殊版。相对于body定位,例如很多侧边栏的小广告

sticky:设置该元素,在屏幕范围内该元素的位置不受定位的影响,滚动条划出了规定的范围,此时属性变为fixed,使用场景:跟随窗口

 8.垂直水平居中实现方式

 =================================================定宽高:=================================================================

=========绝对定位和负margin值================》

父:{

positon:relative;

}

子:{

  width:100px;

  height:100px;

  position:absolute;

  left:50%;

  top:50%;

  margin-left:-50px;

  margin-top:-50px;

}

===============绝对定位+transform=============================>

父:{

  position:relative;

}

子:{

  width:100px;

  height:100px;

  position:absolute;

  top:50%;

  left:50%;

  transform:translate(-50%,-50%);

}

=============绝对定位+left、top、bottom、top +margin ===============================>

父:{

  position:relative;

}

子:{

  position:absolute;

  top:0;

  left:0;

  right:0;

  bottom:0;

  margin:auto;

}

=============flex布局==============================>

父:{

  width:200px;

  height:200px;

  display:flex;

  justify-content:center;

  align-items:center;

}

子:{

  width:100px;

  height:100px;

}

====================grid布局=================================>

父:{

  display:grid;

  width:200px;

  height:200px;

}

子:{

  margin:auto;

  width:100px;

  height:100px;

}

 ================================================= 不定宽高:=================================================================

==============transform+绝对定位====================>

父:{

  position:relative;

}

子:{

  position:absolute;

  left:50%;

  top:50%;

  transform:translate(-50%,-50%)

}

==========table-cell 布局=====================>

父:{

  display:table-cell;

  text-align:center;

  vertical-align:middle;

}

子:{

  display:inline-block;

}

=========flex 布局======================>

父:{

  display:flex;

  justify-content:center;

  align-items:center;

}

9.vue 组件通讯方式有哪些方法

$parent:当前组件的父组件

$children 当前组件的子组件

父组件传递给子组件,通过props

子组件传递给父组件,通过$emit方法

vuex:状态管理

$refs :获取组件实例

10.路由原理 history 和 hash 两种路由方式的特点

hash 模式

location.history的值实际上就是url中#后的东西,hash虽然出现在url中,但是不在http请求中,所以改变hash不会重新加载页面

hash改变,可以通过监听器监听:window.addEventListener("hashchange",funcRef,false)

history 模式

应用于浏览器的历史记录站,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能

 11.常用设计模式有哪些并举例使用场景

工厂模式-传入参数即可创建实例

单例模式-整个程序有且仅有一个实例

发布-订阅模式(vue事件机制)

观察者模式(响应式数据原理)

装饰模式(装饰器的用法)

12.flex:1 是哪些属性组成的

flex-grwo 项目的放大比例

flex-shrink 项目的缩小比例

flex-basis 项目占据主轴空间

13.css盒子模型

width、height:内容的宽度、高度(不是盒子的宽度、高度)

padding:内边距

margin:外边距

border:边框

14.js数据类型、typeOf、instanceof、类型转换

string、boolean、number、object、symbol、null、undefined

typeof判断数据类型,返回值有:string、object、number、function、undefined、boolean

undefined:表示已在作用域中声明,但是未定义

null :表示空对象

instanceof:判断该对象是谁的实例

15.声明是闭包?

有权访问另一个函数作用域中的变量的函数

缺点:函数中变量一直存在内存中,过多的闭包可能会导致内存泄漏

16.es6新增了哪些特性?

const、let用于申明变量,不可重复声明

模板字符串

扩展运算符(字符串、对象)

变量的解构赋值

箭头函数

set和map的数据结构

promise

async函数

class

module语法(import\export)

======================================================== vue =============================================================

17.谈谈对vue生命周期的理解

从一个组件创建、数据初始化、挂载、更新、销毁

 

beforeCreate:创建前,此时data和methods中的数据都还没有初始化

create:vue实例被创建

beforeMount:可以发起服务端请求

mount:vue实例被挂载到真是的dom节点上

mounted:此时可以操作dom

 beforeUpdate

update:当vue实例里的data数据发生变化时,触发组件重新渲染

beforeDestroy

destroyed

18.常用指令

v-if:判断是否隐藏

v-for:数据循环出来

v-bind:class 绑定一个属性

v-model 双向绑定

19.v-for中key的作用

高效对比虚拟dom节点是否是相同的节点,渲染一组列表时,key往往是唯一标识,若不定义key的话,vue只能认为比较的两个节点是同一个

不设置会造成大量的dom更新操作

20.vue组件的通信方式

父-子  props

子-父 $on,$emit

获取父子组件实例:parent,children,Ref

兄弟组件通信:Event Bus 实现跨组件通信 Vue.prototype.$bus = new Vue() Vuex

 21.双向绑定实现原理

object.defineProperty

22.v-model的实现以及它实现原理?

vue中双向绑定是一个指令v-model,可以绑定一个动态值到视图,同时视图中变化能改变该值。v-model是语法糖,默认情况下相当于:value和@input

使用v-model可以减少大量频繁的事件处理代码,提高开发效率,代码可读性也更好

通常在表单项上使用v-model

23.nextTick的实现

nextTick是vue提供的一个全局的api,是在下次dom更新循环结束之后执行延迟回调,在修改数据之后使用$nextTick,则可以在回调中获取更新后的dom

24.vuex、vue-router实现原理

vuex是一个专门为vue.js应用程序开发的状态管理库

25.做过哪些vue的性能优化

尽量减少data中的数据,data中的数据都会增加getter和setter,会收集对应的watcher

v-for和v-if不能连用

更多的情况下,使用v-if替代v-show

key保证唯一

图片懒加载

第三方模块按需导入

长列表滚动到可视区域动态加载

打包优化

压缩代码

使用cdn加载第三方模块

骨架屏

抽离共公组件

26.vue3新特性?他们会带来什么影响

性能的提升:更小巧更快速,在打包时就去除了无用的代码的优化手段

优化了插槽的生成,可以单独渲染父组件和子组件

 

 

=========================================================  React ===============================================================================================

 27.react中key的作用,有key没key有什么区别?

key是react用于追踪哪些列表中元素被修改了,新增了,删除了的铺助标识

28.react组件间通信方式?

父-子:props

子-父:回调callback

非父子组件,用哪个发布订阅模式的Event模块

项目复杂的话用redux等全局状态管理库

context api 会使组件复用性变差

29.如何解析jsx

调用React.createElement函数创建对象

30.react生命周期有哪几种?

componentWillMount、 compnentWillReceiveProps、componentWillUpdate

31.绑定this的几种方式

bind              箭头函数

32.对fiber的理解

React fiber 基于浏览器的单线程调度算法

33.setState是同步还是异步

合成事件和钩子函数中是异步,在setTimeout和原生事件中是同步

34.可以用哪些方式创建组件?

React.createClass     es6  class   无状态函数

35.react 元素与组件的区别

组件是由元素构成的,元素结构是普通对象,组件结构是类或者纯函数

============================================================ 综合 =============================================================

36.vue和react的差别

react是函数式编程。主张纯组件,数据不可变,单向数据流

不过不优化,导致大量的不必要的dom重新渲染

vue的思想是响应式,数据可变的,通过对每一个属性建立watcher来监听,当属性变化时,响应式更新对于的虚拟dom

vue通过getter、setter以及一些函数的劫持,能精确知道数据的变化,不需要特别的优化就能达到很好的性能

组件通信的区别:jsx和.vue模板

当一个页面数据量大时,vue的性能较差,造成页面卡顿,所以一般比较大的项目建议使用react

 37.vuex 和redux的区别?

redux是不可变数据,每次用新的state替换旧的state。在检测数据变化时,通过diff的方式比较差异

vuex是可变数据,数据直接修改。在检测数据变化时,通过setter或者getter来比较的

 38.http和https的区别?

http的url以“http://”开头,https的url以“https://”开头

http不安全,https安全

在osi网络模型中,http作用于应用层,https安全传输作用于作用层

http无法加密,https对传输的数据进行加密

http端口号80,https默认端口号443

http无需证书,https需要SSL证书

39.get和post的区别

get产生一个tcp包。post产生两个tcp包

get在url上面传数据有长度限制,post没有限制

浏览器返回,get不会再次请求,post会再次请求

get通过ur参数传递,post放在request中的body中

get会被浏览器主动缓存,post不会,需要手动设置

get参数放在地址栏不安全,post放在报文更安全

get一般用于查询信息,post一般用于提交某些数据来做修改操作

 40.前端性能优化的各种方式

资源懒加载

尽量用字体图标或者svg图片

防抖

浏览器缓存

webpack优化开启gzip压缩

41.前后端如何通信

ajax:短链接

websocket:长链接,双向的

Form表单(最原始的)

42.什么是同源策略

一个域下的js脚本未经允许的情况下,不能访问另一个域下的内容。

通常判断跨域的依据是协议、域名、端口号是否相同,不同则跨域。

同源策略是对js脚本的一种限制,像img,script脚本请求不会有跨域的限制。

43.跨域通信的方式?

websocket

scros

nginx反向代理

jsonp

iframe引入,但是不推荐使用

44.说一说浏览器的本地存储?各自优势?

浏览器的本地存储主要包含:Cookie、WebStrorage和IndexDB

webstorage包含:seesionStorage、localStoragee

共同点:都是保存在浏览器端。同源的

不同点:

cookie仅在同源的http请求中携带传递,及在浏览器和服务器间来回传递;localStorage和sessionStorage不会自动把数据发送给服务器,仅在本地保存

存储大小限制也不同:cookie数据不能超过4K,localStorage和sessionStorage可以达到5M

localStorage,数据一直保存在本地,不会受窗口或浏览器关闭影响

sessionStorage,浏览器或窗口关闭,数据就没有了

cookie,过期了数据就没有了,不受窗口或浏览器关闭影响

 45.防抖和节流的区别是什么?具体怎么实现的?

防抖和节流的作用都是防止函数多次调用

区别在于:假如一个用户一直触发这个函数,每次触发函数的间隔小于设置的时间,防抖情况下只会调用一次,节流的情况会每隔一定时间调用一次函数

防抖:

 

 

 

节流:

 

 

 46.前端模块化包含?CMD、AMD和CommonJS

    CommonJS是服务器端模块的规范, commonJs模块规范主要分为三部分:模块定义、模块标识、模块引用

  

47.对象深浅拷贝

 

 48.数组去重,数组对象去重

 

 

49.数组扁平化

 50.Es6里的symble

功能类似于一种标识唯一性的Id

51.es6里的set和map

set对象允许存储任何类型的值

map对象保存键值对

52.普通函数和箭头函数的区别?

箭头函数,this指向永远是函数的上下文,什么方法也改变不了,call(),apply(),bind(

普通函数,this指向调用它的对象

53.数组扁平化

多维数组转为一维数组

 

 

 54.字符串去重

const str = "sfdfsdffsdffffff"

const strArray = str.split('')         //['s', 'f', 'd', 'f', 's', 'd', 'f', 'f', 's', 'd', 'f', 'f', 'f', 'f', 'f', 'f']

console.log([...new Set(strArray )])      //['s', 'f', 'd']

 

55.数组去重

 

 

56.数组对象去重

 

 

 57.根据数组中某个键值将数据中的对象从小到大排序

 

 

结果:

 

//找出数组对象中某个key的最大值
const maxval = Math.max.apply(Math,bannerList.map((item)=>{return item.sort}))
console.log('maxval',maxval)




结果:4

58.怎样添加、移除、移动、复制、创建、查找节点?

创建一个具体的元素:createElement()
创建一个文本节点:createTextNode()
添加:appendChild()
移除:removeChild()
替换:replaceChild()
插入:insertChild()
通过元素id查找:getElementById()

59.rem\em\px之间的关系和差别

px:
实际上就是像素,用px设置字体大小时,比较稳定和精准,但是不支持浏览器进行缩放或者不同移动端的兼容,因为像素是固定的,屏幕大小是固定的
em:
是根据父元素来对应大小的,是一种相对值,进行任何数据设置都需要知道父元素的大小,很不方便
rem:
是根据根元素来计算对应大小的,可以在根元素html上写固定大小也可以写百分比

60.position:fixed在android下无效怎么处理

用js判断当前设备是否是安卓,如果是则监听当前页面滚动情况,设置position:absolute;不断改变top值

61.flex布局以及常用的属性

flex-direction属性决定主轴的方向(即项目的排列方向)
flex-direction: row | row-reverse | column | column-reverse;
  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿

 

   flex-wrap属性定义,如果一条轴线排不下,如何换行

  flex-wrap: nowrap | wrap | wrap-reverse;
  

 

 

nowrap(默认):不换行
wrap:换行,第一行在上方
wrap-reverse:换行,第一行在下方

justify-content属性定义了项目在主轴上的对齐方式
justify-content: flex-start | flex-end | center | space-between | space-around;

 

     align-items属性定义项目在交叉轴上如何对齐

align-items: flex-start | flex-end | center | baseline | stretch;
  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用
align-content: flex-start | flex-end | center | space-between | space-around | stretch

 

 

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。
 62.讲讲map和set
map的key相对普通对象来说更灵活,普通对象的key只能以基础数据作为key值,并且所有传入的key值都会被转换为string类型,而Map的key可以是各种数据类型格式
set,可以用于给数组去重 ...new set([1,2,1,2,1,6])

63.深拷贝和浅拷贝的区别
浅拷贝:一般指的是把对象的第一层拷贝到一个新对象上去
var a={count:0,deep:{count:2}}
var b=Object.assign({},a)
深拷贝:一般需要借助递归实现,如果对象的值还是个对象,要进一步深入拷贝,完全替换掉每一个复杂类型的引用

 

 

 

64.事件冒泡和事件捕获,事件代理

事件冒泡:时间会从最内层的元素开始发生,一直向上传播,直到document对象

事件捕获:跟事件冒泡相反,它是从最外层开始发生,一直到最具体的元素

事件代理:

因为事件在冒泡过程中会上传到父节点,并且父节点可以通过事件对象获取到目标节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件代理。

我们想要在点击每个 li 标签时,输出li当中的颜色(innerHTML) 。常规做法是遍历每个 li ,然后在每个 li 上绑定一个点击事件。

这种做法在 li 较少的时候可以使用,但如果有一万个 li ,那就会导致性能降低(少了遍历所有 li 节点的操作,性能上肯定更加优化)。

 65.什么是BFC?BFC的布局规则是什么?如何创建BFC?BFC应用?

BFC即块格式化上下文,是css布局的一个概念,是里面的元素不会影响外面的元素。

规则:box是css布局的对象和基本单位,页面由若干个box组成

创建:浮动元素,display:inline-block ,posittion:absolute

应用:清除内部浮动,自适应多栏布局

66.js数据类型、typeof、instanceof、类型转换

string\number\object\null\undefined\symbol\boolean

typeOf:用来判断数据类型,返回值有:undefined、object、function、string、number、boolean

instanceof:用来判断该对象是谁的实例

null:表示空对象,undefined:表示变量在作用域中定义了,只是没有赋值

67.闭包

有权访问另一个函数作用域中的变量的函数

缺点:会导致函数的变量一直保存在内存中,过多的闭包可能导致内存泄漏

68.原型、原型链

原型:对象中固有的_proto_属性,该属性指向对象中的prototype属性

原型链:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,他就回去他的原型对象中去找这个属性,这个原型对象又会有自己的属性,于是就这样一直找下去。原型链的尽头一般是object.prototype

69.this指向,new关键字

函数调用:this指向全局对象

方法调用:this指向这个对象

构造函数调用:this指向这个用new新创建的对象

apply、bind、call调用模式:

apply接收的参数是数组

call接收的参数列表

bind方法通过传入一个对象,返回一个 this 绑定了传入对象的新函数。这个函数的 this指向除了使用new `时会被改变,其他情况下都不会改变。

70.原生ajax

ajax是一种异步通信的方法,从服务器获取数据达到局部刷新页面的效果

71.简述MVVM

vue实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层

72.vue生命周期

beforeCreate:创建前,此时data和methods中的数据都还没有初始化

create阶段:vue实例被创建

created:创建完毕,data中有值,未挂载

beforeMount:可以发起服务端请求

mount:vue实例被挂载到真实的DOM节点

mounted:此时可以操作dom

update阶段:当vue实例里面的data数据变化是,触发组件的重新渲染

destory阶段:vue实例被销毁

beforeDestory:实例被销毁前,此时可以手动摧毁一些方法

73.$nextTick的使用

当修改data的值,马上获取dom元素的值,是不能获取到更新后的值的,需要使用nextTick回调,让修改后的data值渲染更新到dom元素之后获取

 74.如何解析jsx

调用React.createElement函数创建对象

75.react组件的生命周期

componentWillMount :在渲染前调用

componentDidMount:在第一次渲染后调用

componentWillReceiveProps:在组件接收到新的props时被调用

shouldComponentUpdate:返回一个布尔值,在组件接收到新的props或者state是被调用

componentWillUpdate:在组件接收到新的props或者state但还没有render时被调用

componentDidUpdate:在组件完成更新后立即调用

componentWillUnmount: 在组件从dom中移除之前立刻被调用

 

 

 

 

 

 
posted on 2021-09-26 18:36  忆小样  阅读(113)  评论(0编辑  收藏  举报