防抖与节流函数
防抖和节流的作用都是在高频事件中防止函数被多次调用,是一种性能优化的方案。
区别在于,防抖函数只会在高频事件结束后 n 毫秒调用一次函数,节流函数会在高频事件触发过程当中每隔 n 毫秒调用一次函数。
防抖函数
触发高频事件后一段时间(wait)只会执行一次函数,如果指定时间(wait)内高频事件再次被触发,则重新计算时间。
封装
1 2 3 4 5 6 7 8 9 10 11 12
| function debounce(func, wait) { let timeout = null; return function () { let context = this; let args = arguments; if (timeout) clearTimeout(timeout); timeout = setTimeout(() => { func.apply(context, args); }, wait); }; }
|
节流函数
规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效
封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function throttle(func, wait) { let timeout = null; return function () { let context = this; let args = arguments; if (!timeout) { timeout = setTimeout(() => { timeout = null; func.apply(context, args); }, wait); } }; }
|
防抖和节流的应用场景
防抖应用场景
- scroll 事件滚动触发事件
- 搜索框输入查询,如果用户一直在输入中,没有必要不停地调用去请求服务端接口,等用户停止输入的时候,再调用,设置一个合适的时间间隔,有效减轻服务端压力。
- 表单验证
- 按钮提交事件。
- 浏览器窗口缩放,resize 事件(如窗口停止改变大小之后重新计算布局)等。
节流的应用场景
- DOM 元素的拖拽功能实现(mousemove)
- 搜索联想(keyup)
- 计算鼠标移动的距离(mousemove)
- Canvas 模拟画板功能(mousemove)
- 射击游戏的 mousedown/keydown 事件(单位时间只能发射一颗子弹)
- 监听滚动事件判断是否到页面底部自动加载更多
将一维数组按照指定的长度转成二维数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function pages(arr, len) { const pages = []; arr.forEach((item, index) => { const page = Math.floor(index / len); if (!pages[page]) { pages[page] = []; } pages[page].push(item); }); return pages; }
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; console.log(pages(arr, 3)); console.log(pages(arr, 8));
|
判断是否为移动端浏览器
1 2 3 4 5 6 7 8
| const flag = navigator.userAgent.match( /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i ); if (flag) { } else { }
|
随机打乱数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function shuffle(arr) { let _arr = arr.slice(); for (let i = 0; i < _arr.length; i++) { let j = getRandomInt(0, i); let t = _arr[i]; _arr[i] = _arr[j]; _arr[j] = t; } return _arr; } function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1) + min); }
|