前端面试题

时间转换为相对时间

时间转换为相对时间


过滤器的使用

1. 定义一个时间过滤器,

vue.filter('timefilter',function(value)){return dayjs().from(value)}

2. 使用{{xxx | timefilter }}         | 管道符号

闭包

概念: 

函数内创建另⼀个函数,通过另⼀个函数访问这个函数的局部变量,利⽤闭包可以突破作⽤链域

优点: 

可以避免全局变量的污染,可以读取函数内部的变量,让变量始终保持在内存中

缺点:

常驻内存,会增加内存的使用量,使用不当会造成内存泄露

组件传值

父子组件传值 

父传子=>>>  在父组件中导入并注册子组件,在子组件中添加:msg="msg"(自己定义),并在子组件使用props:[],进行接收

子传父=>>>  在子组件中可以声明一个点击时间,通过this.$emit(方法名字,方法的值)进行传参,在父组件中的子组件上进行接收


如果是兄弟组件套在父组件中,然后兄弟组件需要互相传值,可以通过this.$parent传递给父组件,在使用父子组件传值传递到另一个兄弟组件。把父组件作为一个桥梁

vuex

vuex的五种属性: 1. state 数据源存放地 2. getter 从state派生的数据,相当于state的属性 3. mutation 提交数据的方法,只能同步操作,是理论上唯一操作state的属性 4. Action 可以进行异步操作,不同直接操作state 5. module 模块化vuex 使每个模块都有自己的5个属性

使用this.$store.state来获取state对象

eventBus

在utils中创建一个bus.js 引入到组件中,设置一个点击事件,在需要传递的组件的地方,使用 bus.$emit()传参 bus.$on()接收  

单向数据流

为了防止子级的prop的更新会流动到父组件中,导致父组件的状态被改变,从而导致应用的数据流难以理解,子组件只能通过$emit来自定义事件,父组件接收后,由父组件自己修改如果修改了porp中的值 vue通过setter属性进行检测,修改值就会触发setter 发出警告

Vue生命周期钩子的应用

统计用户偏好,

关闭当前页面,回到页面,页面保留在当前位置,

或者关闭当前页面,回到当前页面,数据保留


keep-alive

keep-alive是Vue的内置组件,可以使被包含的组件保留状态,防止重新渲染

1.一般结合路由和动态组件一起使用,用于缓存2.提供include和exclude属性,include标识只有名称匹配的组件会被缓存,exclude任何名称匹配的组件都不会被缓存。exclude优先级大

3.对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。

vue SSR

ssR意思就是vue在客户端将标签渲染成整个html片段的工作在服务端完成,服务端形成的html片段直接返回给客户端的这个过程叫服务端渲染

Vue的双向数据绑定

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调

四步:

实现一个监听器Observe 对数组进行遍历,使用object.defineProerty()对属性添加setter,getter,无论对对象的某个属性赋值,都会触发setter

实现一个解析器Complie,解析vue模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,添加监听数据的订阅者,一旦数据发生变化,收到通知,调用函数更新数据

实现一个订阅者Wathch,订阅者是监听器和解析器的桥梁,主要订阅监听器中的属性值变化实现一个订阅器Dep,订阅器采用发布-订阅-设计模式,来收集订阅者和监听器的统一管理

常见浏览器内核


ss


vue原理中,object.defineProperty有什么缺陷,在Vue3.0中使用proxy

1.object.defineProperty无法监听数组,不能实时响应。

2.只能劫持对象的属性,如果属性值是对象,还需要深度遍历。proxy是可以劫持整个对象。返回一个新数组

3.可以代理对象也可以代理数组,还可以代理动态添加的属性

防抖节流

防抖:指的是触发高频事件n秒内函数只会执行一次,如果再次触发则要重新计算时间


节流:指的是在高频事件触发时,在n秒内只会执行一次



Vue 的父组件和子组件生命周期钩子执行顺序


内存泄漏情况

1.意外的全局变量

2.闭包

3.未被清空的定时器

4.未被销毁的事件监听

5. DOM引用

webpack中的loader和plugin

loader: 是一个转换器,单纯的将A文件编译成B文件,属于单纯文件转换过程

plugin: 是一个扩展器,奉佛了webpack本身,针对loader结束后,webpack打包的整个过程,它并不直接操作文件,而是基于事件机制工作,会监听 webpack 打包过程中的某些节点,执行广泛的任务。

渐进增强,优雅降级

渐进增强:针对低版本浏览器进行构建,保证最基础的功能,再向高级浏览器进行效果交互的实现

优雅降级: 针对高级浏览器进行构建,再向低级浏览器做适配兼容

何为事件冒泡,事件委托

事件冒泡:当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到 DOM 树的最上层.

阻止:e.stopPropaga tion() ie9之前     event.canceBubble= true

事件委托:让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

 小程序关联微信公众号如何确定用户的唯一性

可通过 unionid 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 unionid 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid 是相同的

小程序跳转的5个条件

1. navigateTo(): 保留当前页面,跳转到其他的页面,不能跳转到tabbar页面

2. redirectTo() : 关闭当前页面,跳转其他页面,不能跳转到tabbar页面

3. switchTo() :  跳转到tabbar页面,关闭其他的非tabbar页面

4. navigateBack() 关闭当前页面,返回上一页面,

5. relaunch() : 关闭所有页面,打开到应用某个页面

Es6的8种数据类型

boolean null undefined symbol bigint string object number

新增Es6

const Let 模板字符串 箭头函数和this 函数参数默认值(可以设置默认值) 展开运算符 二进制和八进制字面量(0o转八进制 0b转二进制)对象和数组解构 for...of(遍历一个迭代器) 和 for...in(遍历对象中的属性) symbol bigint 对象字面量简写法

const定义的变量不可以改变,

var定义的变量可以修改,不初始化会输出undefined let块级作用域 函数内部使用了

let定义后 对函数外部没有影响

展开运算符:可以用来函数传参 数据结构

for-of:for...of循环不会循环对象的key,只会循环出对象的value,因此for...of不能循环遍历普通对象

for-in普通对象的属性遍历推荐使用for...in

图片懒加载

图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载. (大型电商网站常见)

Es6-symbol

symbol是属于一种基础数据类型,使用typeof检查时,返回的数据类型依旧是symbol 每个symbol的实例都是唯一的,比较两个symbol会返回false

是做什么的: 因为每个symbol的实例都是唯一的 所以我们可以通过这个特性来做一个常量赋一个唯一的值


Es6-bigint

解决因为js的规范,所有数字都是以双精度64位浮点格式表示 导致了大的整数的精度缺失,所以引入了一个bigint

使用: console.log(10000000000000n) 只需要添加一个n在末尾禁止:不能使用===来进行比较 但是可以使用==来比较 在运算符中 不能使用+10n 因为+号运算符比较特殊 使用+可以执行转换到number类型的值

你可能感兴趣的:(前端面试题)