前端面试总结(六)

目录

async/await和promise的区别

promise实现多请求并发

computed原理

computed和watch哪个支持异步

前端加密方法

MD5加密

vue-element-admin 导出excel

防抖和节流区别和应用场景

一、防抖 (多次触发 只执行最后一次,重在清零)

1. 防抖的应用场景

2. 防抖的实现思路

一、节流 (规定时间内 只触发一次,重在加锁)

1. 节流的应用场景

2. 节流的实现思路

总结 (简要答案)

页面优化的方法

页面加载渲染:

1.css放在最上面,javascript放在最下面。

2.减少重绘和回流。

重绘

回流

3.减少DOM元素的数量和深度。

4.图片懒加载

5.预加载

渲染完成后的页面交互优化

防抖和节流

网络加载

1.减少http请求,合理设置http缓存。

2.避免页面中空的href和src

3.使用异步JavaScript资源async和defer

4.为HTML指定Cache-Control或Expires.

ps:小知识 

首页加载白屏什么原因 怎么处理:

答案一:

答案二:

解决方案

vue同页面跳转不刷新

方案一:给router-view添加唯一key

方案二:监控$route中的数据变化

方案三:通过beforeRouteUpdate获取路由变化

小程序数据缓存机制

小程序数据缓存相关知识

参数

保存数据缓存

 获取数据缓存

 示例:在onLoad中存入并获取

注意⚠️:

微信小程序如何刷新当前页面或者刷新上一个页面


async/await和promise的区别

async 它就是 Generator 函数的语法糖

参考参考  async函数实现多个请求处理_山海入梦的博客-优快云博客_async 请求

ES6 async 函数_w3cschool

promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

promise实现多请求并发

promise.all里面最多只能放10个请求

使用promise实现多请求并发_小约翰仓鼠的博客-优快云博客_promise并发请求

computed原理

computed 本质是一个惰性求值的观察者。

computed 内部实现了一个惰性的 watcher,也就是 computed watcher,computed watcher 不会立刻求值,同时持有一个 dep 实例。

其内部通过 this.dirty 属性标记计算属性是否需要重新求值。

当 computed 的依赖状态发生改变时,就会通知这个惰性的 watcher,

computed watcher 通过 this.dep.subs.length 判断有没有订阅者,

有的话,会重新计算,然后对比新旧值,如果变化了,会重新渲染。 (Vue 想确保不仅仅是计算属性依赖的值发生变化,而是当计算属性最终计算的值发生变化时才会触发渲染 watcher 重新渲染,本质上是一种优化。)

没有的话,仅仅把 this.dirty = true。 (当计算属性依赖于其他数据时,属性并不会立即重新计算,只有之后 其他地方需要读取属性 的时候,它才会真正计算,即具备 lazy(懒计算)特性。比如这个属性并没有被其他地方用到,就不会重新去计算它)

computed和watch哪个支持异步

watch

详细请看  watch跟computed的区别_前端开发小司机的博客-优快云博客_watch和computed的区别

前端加密方法

1、明文保存;2、对称加密算法来保存;3、MD5、SHA1等单向HASH算法;4、PBKDF2算法;5、bcrypt、scrypt等算法。

具体请看  密码加密的方式有哪些?-常见问题-PHP中文网

MD5加密

md5 加密:
用户注册时将加密后的密码发送给后端存储
当登陆的时候,再将加密后的密码和数据库中加密的密码相匹配。
此加密无须解密

实在需要解密 ,请看专家教你简单又轻松的MD5解密方法,一看就会_哈客部落的博客-优快云博客_md5解密 

md5的在vue中的用法:
1.安装。

npm install js-md5 -D

2.使用。

(1)项目中引入md5模块。

import md5 from “js-md5”

(2)在main.js里面将md5转换为vue原型

import md5 from "js-md5"
Vue.prototype.$md5=md5

3.示例

<input type="number" v-model="value">
 
console.log("加密密码:"+ this.$md5(this.value))

原文链接 vue 前端常用加密处理 md5 加密_船长在船上的博客-优快云博客_前端md5解密

vue-element-admin 导出excel

这个好像vue-element-admin有自带的一个方法

参考 参考 vue-element-admin 导出excel_小坚果_的博客-优快云博客

防抖和节流区别和应用场景

一、防抖 (多次触发 只执行最后一次,重在清零)

防抖策略(debounce)是当事件被触发后,延迟n秒后再执行回调,如果在这n秒内事件又被触发,则重新计时。

作用: 高频率触发的事件,在指定的单位时间内,只响应最后一次,如果在指定的时间内再次触发,则重新计算时间。

1. 防抖的应用场景

  • 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖
  • 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖
  • 文本编辑器实时保存,当无任何更改操作一秒后进行保存

2. 防抖的实现思路

 
实现代码:

    // 防抖函数
    function debounce(fn, wait) {
        let timer;
        return function() {
            let _this = this;
            let args = arguments;
            if(timer) { clearTimeout(timer) }
            timer = setTimeout(function(){
                fn.apply(_this, args)
            }, wait);      
        }
    }
    // 使用
    window.onresize = debounce(function() {console.log('resize')}, 500)


应用示例:

<body>
    <input type="text" id="inp">
    <script>
    
        // 1.封装防抖函数 **防抖重在清零 clearTimeout(timer)**
        function debounce(fn, time) {
            // 4.创建一个标记用来存放定时器的返回值
            let timeout = null;
            return function () {
                // 5.每当用户触发input事件  把前一个 setTimeout 清楚掉
                clearTimeout(timeout);
                // 6.然后又创建一个新的 setTimeout, 这样就能保证输入字符后等待的间隔内 还有字符输入的话,就不会执行 setTimeout里面的内容
                timeout = setTimeout(() => {
                    // 7.这里进行防抖的内容
                    fn();
                }, time);
            };
        }

        // 2.获取inpt元素
        var inp = document.getElementById('inp');
		// 8. 测试防抖临时使用的函数
        function sayHi() {
            console.log('防抖成功');
        }
        // 3.给inp绑定input事件  调用封装的防抖函数  传入要执行的内容与间隔事件 
        inp.addEventListener('input', debounce(sayHi, 5000)); 

    </script>
</body>


一、节流 (规定时间内 只触发一次,重在加锁)

 节流策略(throttle),控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务端(server)及网关(gateway)控制的限流 (Rate Limit) 类似。

作用: 高频率触发的事件,在指定的单位时间内,只响应第一次。

1. 节流的应用场景

  • 鼠标连续不断地触发某事件(如点击),单位时间内只触发一次;
  • 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断。例如:懒加载;
  • 浏览器播放事件,每个一秒计算一次进度信息等

2. 节流的实现思路

在这里插入图片描述

实现代码:

    // 方式1: 使用时间戳
    function throttle1(fn, wait) {
        let time = 0;
        return function() {
            let _this = this;
            let args = arguments;
            let now = Date.now()
            if(now - time > wait) {
                fn.apply(_this, args);
                time = now;
            }
        }
    }
    
    // 方式2: 使用定时器
    function thorttle2(fn, wait) {
        let timer;
        return function () {
            let _this = this;
            let args = arguments;
            
            if(!timer) {
                timer = setTimeout(function(){
                    timer = null;
                    fn.apply(_this, args)
                }, wait)
            }
        }
    }


应用示例:

    <script>
        // 1.封装节流函数(使用定时器) 节流重在加锁 timer=timeout
        function throttle(fn, time) {
            //3. 通过闭包保存一个 "节流阀" 默认为false
            let temp = false;
            return function () {
                //8.触发事件被调用 判断"节流阀" 是否为true  如果为true就直接trurn出去不做任何操作
                if (temp) {
                    return;
                } else {
                    //4. 如果节流阀为false  立即将节流阀设置为true
                    temp = true; //节流阀设置为true
                    //5.  开启定时器
                    setTimeout(() => {
                        //6. 将外部传入的函数的执行放在setTimeout中
                        fn.apply(this, arguments);
                        //7. 最后在setTimeout执行完毕后再把标记'节流阀'为false(关键)  表示可以执行下一次循环了。当定时器没有执行的时候标记永远是true,在开头被return掉
                        temp = false;
                    }, time);
                }
            };
        }
        function sayHi(e) {
            // 打印当前 document 的宽高
            console.log(e.target.innerWidth, e.target.innerHeight);
        }
        // 2.绑定事件,绑定时就调用节流函数  
        // 敲黑板!!! 这里是重点 绑定是就要调用一下封装的节流函数 触发事件是触发封装函数内部的函数
        window.addEventListener('resize', throttle(sayHi, 2000));
    </script>


总结 (简要答案)

  • 防抖:防止抖动,单位时间内事件触发会被重置,避免事件被误伤触发多次。代码实现重在清零 clearTimeout。防抖可以比作等电梯,只要有一个人进来,就需要再等一会儿。业务场景有避免登录按钮多次点击的重复提交。
  • 节流:控制流量,单位时间内事件只能触发一次,与服务器端的限流 (Rate Limit) 类似。代码实现重在开锁关锁 timer=timeout; timer=null。节流可以比作过红绿灯,每等一个红灯时间就可以过一批。

页面优化的方法

页面加载渲染:

1.css放在最上面,javascript放在最下面。

2.减少重绘和回流。

重绘

重绘:元素样式的改变(但宽高、大小、位置等不变)

如:outline、visibility、color、background-color等

只改变自身样式,不会影响到其他元素

回流

回流:元素的大小或者位置发生改变(当页面布局和几何信息发生改变的时候),触发了重新布局导致渲染树重新计算布局和渲染

如添加或删除可见的DOM元素;元素的位置发生变化;元素的尺寸发生变化、内容发生变化(如文本变化或图片被另一个不同尺寸的图片所代替);页面一开始渲染的时候(无法避免);

因为回流是根据视口大小来计算元素的位置和大小的,所以浏览器窗口尺寸变化也会引起回流

注意:回流一定会触发重绘,而重绘不一定会回流

3.减少DOM元素的数量和深度。

4.图片懒加载

5.预加载

渲染完成后的页面交互优化

防抖和节流

网络加载

1.减少http请求,合理设置http缓存。

2.避免页面中空的href和src

3.使用异步JavaScript资源async和defer

4.为HTML指定Cache-Control或Expires.

ps:小知识 

前端模块化:
根据需要和不同规则,代码分别写在不同文件里,这些文件都有自己的作用域。、

css模块化的优点:
方便代码的复用,避免命名冲突,层级结构更加清晰

原文链接 前端页面优化方法_小齐睡不够的博客-优快云博客_前端页面优化

首页加载白屏什么原因 怎么处理:

答案一:

定位问题:

1、先确保网络连接通畅。
2、查看网络url地址是否输入有误。
3、打开控制台查看报错信息。
4、查看接口访问是否有请求。
5、查看路由是否有path或者name的错误,导致加载了不存在的页面。

可能原因:

1)URL网址无效或含有中文字符;

2)JS封装代码有问题;

3)缓存导致白屏;

4)硬件内存不足、进程崩溃;


答案二:

当前很多页面都使用前端模板进行数据渲染,那么在糟糕的网速情况下,一进去页面,看到的不是白屏就是 loading,这称为白屏问题。

此问题发生的原因基本可以归结为网速跟静态资源

1、css文件加载需要一些时间,在加载的过程中页面是空白的。 解决:可以考虑将css代码前置和内联。

2、首屏无实际的数据内容,等待异步加载数据再渲染页面导致白屏。 解决:在首屏直接同步渲染html,后续的滚屏等再采用异步请求数据和渲染html。

3、首屏内联js的执行会阻塞页面的渲染。 解决:尽量不在首屏html代码中放置内联脚本。

解决方案

根本原因是客户端渲染的无力,因此最简单的方法是在服务器端,使用模板引擎渲染所有页面。同时

  1. 减少文件加载体积,如html压缩,js压缩

  2. 加快js执行速度 比如常见的无限滚动的页面,可以使用js先渲染一个屏幕范围内的东西

  3. 提供一些友好的交互,比如提供一些假的滚动条

  4. 使用本地存储处理静态文件。

原文链接  首页白屏解决与优化方案 - sunidol - 博客园

vue同页面跳转不刷新

方案一:给router-view添加唯一key

增加一个不同:key值,这样vue就会识别这是不同的<router-view>了。

原理:Vue 会复用相同组件, 即 /aaa/1 =>>> /aaa/2 或者 /bbb?id=1 =>>> /bbb?id=2 这类链接跳转时, 将不再执行created, mounted之类的钩子
设置 router-view 的 key 属性值为 $route.fullPath后,就会比较完整路径,path和参数都会进行比较,地址发生改变时(包括参数改变),就会重新渲染页面,组件被强制不复用, 相关钩子加载顺序为:
beforeRouteUpdate => created => mounted

// 这种是最简单的方法
<router-view :key="$router.currentRoute.fullPath"/>
<!-- 或者下面这个,$route是当前正在跳转的路由 -->
<router-view :key="$route.path"/>

方案二:监控$route中的数据变化

对router进行监控,当router发生变化时,执行初始化界面方法

//监听函数
watch: {
    '$route' () {
      this.initData();//我的初始化方法
    }
  },

方案三:通过beforeRouteUpdate获取路由变化

beforeRouteUpdate路由更新之前,通过this.$route.query获取的参数存在滞后性,通过to.query拿到的是最新的

beforeRouteUpdate(to, from, next) {
  //路由更新前,重新发请求
    this.getData(to.query.id)
    next()
  }

小程序数据缓存机制

localStorage
localStorage.setItem("key",JSON.stringify({test:123}))
- 你如何测试localStorage的大小?
https://www.cnblogs.com/djjlovedjj/p/11202195.html
数据大小5M左右
永久存储
sessionStorage
浏览器关闭的时候自动销毁
cookies 
1. cookies可以控制失效时间
2. 会随着请求发送到后台
4KB 左右

小程序数据缓存相关知识

数据缓存:缓存数据,从而在小程序退出后再次打开时,可以从缓存中读取上次保存的数据,常用的数据缓存API如下表所示:

在这里插入图片描述

  • wx.setStorage(Object object) 存储=> 如果存储复杂类型,不需要序列化字符串=》直接存
  • wx.getStorage(Object object) 获取
  • wx.removeStorage(Object object) 删除
  • wx.setStorageSync(Object object) 存储=> wx.setStorage 的同步版本
  • wx.getStorageSync(Object object) 获取=> wx.getStorage 的同步版本
  • wx.removeStorage(Object object) 删除=> wx.removeStorage 的同步版本

参数

详细参数请见
wx.setStorage(Object object) | 微信开放文档

保存数据缓存

// 保存数据缓存
wx.setStorage({
  key: 'key',			// 本地缓存中指定的key
  data: 'value',		// 需要存储的内容(支持对象或字符串)
  success: res => {},   // 接口调用成功的回调函数	
  fail: res => {}		// 接口调用失败的回调函数
})

 获取数据缓存

// 获取数据缓存
wx.getStorage({
  key: 'key',			// 本地缓存中指定的 key
  success: res => {		// 接口调用成功的回调函数
    console.log(res.data)
  }, 
  fail: res => {}		// 接口调用失败的回调函数
})

 示例:在onLoad中存入并获取

// pages/test/test.js
Page({
  onLoad: function(options) {
    // 保存数据缓存
    wx.setStorage({
      key: 'key', // 本地缓存中指定的key
      data: 'value', // 需要存储的内容(支持对象或字符串)
      success: res => {
        // 获取数据缓存
        wx.getStorage({
          key: 'key', // 本地缓存中指定的 key
          success: res => { // 接口调用成功的回调函数
            console.log(res.data)
          },
          fail: res => { } // 接口调用失败的回调函数
        })
      }, // 接口调用成功的回调函数
      fail: res => {} // 接口调用失败的回调函数
    })
  }
})

注意⚠️:

  • 将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。
  • 单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB
  • 需要存储的内容。只支持原生类型、Date、及能够通过JSON.stringify序列化的对象。

原文链接   小程序数据缓存机制应用_流楚丶格念的博客-优快云博客_微信小程序缓存机制

链接二 小程序 - 数据缓存_Yolo416的博客-优快云博客

微信小程序如何刷新当前页面或者刷新上一个页面

刷新当前页面

const pages = getCurrentPages()
//声明一个pages使用getCurrentPages方法
const perpage = pages[pages.length - 1]
//声明一个当前页面
perpage.onLoad()  
//执行刷新

 刷新上一个页面

//获取页码数进行刷新,跟当前页面的刷新的方式是一样的
var pages = getCurrentPages()
pages[pages.length -2 ].onload()  

原文链接 微信小程序如何刷新当前页面或者刷新上一个页面_程序员里的战斗机的博客-优快云博客_小程序刷新当前页面

 更全面的在这里 微信小程序----返回上一页刷新或当前页刷新_Rattenking的博客-优快云博客_微信小程序 返回上一页并刷新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值