JS-实现的各类函数工具库
2022-04-12 本文已影响0人
coderhzc
一.函数的防抖:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>
没有防抖: <input type="text" class="cur">
</p>
<p>
有防抖: <input type="text" class="debounce">
</p>
<script>
// 函数防抖和节流
// 函数防抖: 在开发当中 经常会遇到一些事件频繁的触发 比如说: 鼠标事件,scroll,resize,input 等等
// 在事件触发N秒后执行一次
// 不防抖
var input = document.querySelector(".cur")
input.addEventListener('keyup', function() {
console.log("拉取服务器的数据");
})
// 防抖函数 (闭包)
// 这个就就叫做闭包
var input1 = document.querySelector('.debounce');
function debounce(callBack, time) {
// 声明一个变量,统计延期个数
let timer;
return function() {
if (timer) clearInterval(timer)
timer = setTimeout(callBack, time)
}
}
// N秒后执行的函数
function handler() {
console.log(121321313);
}
// 绑定事件
input1.addEventListener('keyup', debounce(handler, 1000))
</script>
</body>
</html>
二. 节流
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<!--
应用场景: 比如当你点击按钮按钮100次的时候,你只希望提交一次 那么就可以用一下的代码
-->
<body>
<button>单击按钮</button>
<script>
// 节流: 在N秒内函数执行一次
var btn = document.querySelector('button')
function throttle(callBack, time) {
// 锁头
var lock = true;
return function() {
if (lock) {
lock = false
setTimeout(() => {
lock = true
callBack()
}, time)
}
}
}
function handler() {
console.log("提交数据");
}
btn.addEventListener("click", throttle(handler, 1000))
</script>
</body>
</html>
三. 对象的深拷贝
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
/**
* forEach
* map
* filter
* reduce
* reduceRight
* every
* some
* deepClone
* **/
对象的深拷贝
const obj = {
name: "huzhenchu",
age: 28,
job: "前端开发",
say:function() {
console.log("我会说话");
},
info: {
field: ['JS', "CSS", "JavaScript"],
frameWork: ["React", "Vue", "Angular"],
student: [
{
name: "zhangsan",
age: 18
},
{
name: "lisi",
age: 20
},
]
},
hobby: ["pinao", "trenen"]
}
// 数组的拷贝
const obj = [
{
name: "zhangsan",
age: 18
},
{
name: "lisi",
age: 20
},
]
function deepClone(origin, target) {
var tar = target || {};
var toStr = Object.prototype.toString;
for (var k in origin) {
if (origin.hasOwnProperty(k)) {
if (typeof origin[k] === 'object' && origin[k] !== null) {
tar[k] = toStr.call(origin[k]) === '[object Array]' ? [] : {}
deepClone(origin[k], tar[k]); // 递归函数
} else {
tar[k] = origin[k];
}
}
}
return tar
}
var newObj = deepClone(obj)
console.log(newObj);
</script>
</body>
</html>
对象的实际截图:
image.png
数组的实际截图:
image.png
四. JS 获取当前时间格式化 和 倒计时
//时间案例
function getNewYear() {
var date = new Date();
var arr = ['星期日','星期一','星期二','星期三','星期四','星期五','星期六',]
var year = date.getFullYear(); //获取到的是当年的年份
var month = date.getMonth()+1; //获取到的是几月
var dates = date.getDate();// 获取到的的是几号
var day = date.getDay(); //获取到的是 星期几
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
h = h < 10 ? '0' + h : h;
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
return year + '年/' + month + '月/' + dates + '日/'+arr[day] +'现在时间:'+ h + ':' + m + ':' + s
}
console.log(getNewYear()) //获取到当前面的年月日
//倒计时案例
//核心思维 用结束时间的总秒数 - 现在的时间的总秒数 = 剩余时间的总秒数
function get(time) {
//求结束时间的总毫秒数
//Date.now() 这个是获取到现在的毫秒数 如果把用户输入的时间写在里面的话就会得到结束时间的毫秒数
var endTime = +new Date(time) //大的
// console.log(endTime);
//现在时间总的毫秒数 获取到当前的毫秒数
var newTime = +new Date() //小的
// console.log(newTime);
//3.求现在剩下的时间 已经转换为秒数了
var shengxia = (endTime - newTime) / 1000;
//4.转换为时分秒
//1.时
d = parseInt(shengxia / 60 / 60 / 24); //得到的是总的天数
d = d < 10 ? '0' + d : d;
h = parseInt(shengxia / 60 / 60 % 24); //计算小时
h = h < 10 ? '0' + h : h;
m = parseInt(shengxia / 60 % 60); //计算分钟
m = m < 10 ? '0' + m : m;
s = parseInt(shengxia % 60); //计算当前的秒数
d = s < 10 ? '0' + s : s;
return '剩余的时间' + d + '天 ' + h + '时' + m + '分' + s + ' 秒';
}
console.log(get('2019-9-3 08:08:08'))
//时分秒案例
function getTime() {
var date = new Date();
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
h = h < 10 ? '0' + h : h;
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
return h + ':' + m + ':' + s
}
console.log(getTime());
五. js 前端实现时间实时更新效果
image.png## 简单原理就是:
- 封装一个时间格式的方法,加一个定时器,每秒去刷新一次,模拟成为时间更新效果
## 1. 封装公共方法
export function timeNow() {
let vWeek, vWeek_s, year, month, day, hours, minutes, seconds;
vWeek = ["星期天", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
let date = new Date();
year = date.getFullYear();
month = date.getMonth() + 1;
day = date.getDate();
hours = date.getHours();
hours = hours > 9 ? hours : "0" + hours;
minutes = date.getMinutes();
minutes = minutes > 9 ? minutes : "0" + minutes;
seconds = date.getSeconds();
seconds = seconds > 9 ? seconds : "0" + seconds;
vWeek_s = date.getDay();
let time = year + "年" + month + "月" + day + "日" + "\t" + hours + ":" + minutes + ":" + seconds + "\t" + vWeek[vWeek_s];
return time
}
## 可以根据需求更改展现格式
### 2. 使用
引入:
import { timeNow } from "../../utils/getMaininfo";
从页面加载起,开始执行:
getAll() {
this.tiemEq = setInterval(() => {
/* 时间 */
this.nowTime = timeNow();
}, 1000);
}
[注:这里给定时器生成定义,以便后续销毁]
## 3. 销毁
由于定时器的特殊性,在关闭页面时,及时销毁,避免造成资源浪费甚至内存溢出
// vue生命周期
beforeDestroy() {
/* 关闭页面销毁所有定时器 */
clearInterval(this.tiemEq);
}
六.柯里化的代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function add1(x, y, z) {
return x + y + z
}
function add2(x, y, z) {
x = x + 2;
y = y * 2;
z = z * z;
return x + y + z
}
function makeAdder(count) {
return function (num) {
return count + num;
}
}
function log(date, type, message) {
console.log(`[${date.getHours()}:${date.getMinutes()}]:[${type}]:[${message}]`);
}
// 柯里化函数的实现
function hyCurrying(fn) {
console.log('fn:=>', fn);
function curried(...args) {
console.log("...args:=>", ...args);
console.log("args:=>", args);
// 判断当前已经接收的参数的个数,可以参数本身需要接收的参数是否已经一致了
console.log("args.length是可以拿到函数参数的长度的:=>", args.length); // args.length是可以拿到函数参数的长度的
// 1.当已经传入的参数, 大于等于 需要的参数时,就执行函数
if (args.length >= fn.length) {
console.log('this:=>', this);
return fn.apply(this, args)
} else {
// 没有 达到个数时,需要返回一个新的函数,继续来接收参数
function curried2(...args2) {
// 接收到参数后, 需要递归调用curried 来检查函数的个数时候达到
return curried.apply(this, [...args, ...args2])
}
return curried2
}
}
return curried;
}
var curryAdd = hyCurrying(add1);
console.log(curryAdd(10, 20, 30));
// console.log(curryAdd(10, 20)(30));
// console.log(curryAdd(10)(20)(30));
</script>
</body>
</html>
七.JS 实现全屏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
img {
width: 200px;
height: 200px;
border: 10px solid #999;
}
</style>
</head>
<body>
<div>
<img src="https://img2.baidu.com/it/u=3437217665,1564280326&fm=26&fmt=auto" alt="">
<input type="button" id="full" value="全屏">
<input type="button" id="cancelfull" value="退出全屏">
<input type="button" id="isFull" value="是否全屏">
</div>
<script>
/*
全屏接口的使用
*/
var div = document.querySelector('div');
var img = document.querySelector('img');
/*
1.requestFullScreen():开启全屏显示
不同浏览器需要加不同的前缀
Chrome:webkit firefox: moz ie:ms opera:o
2.cancelfullScreen():退出全屏显示
Chrome:webkit firefox: moz ie:ms opera:o
3.fullScreenElement:是否是全屏状态
Chrome:webkit firefox: moz ie:ms opera:o
*/
//第一个为按钮 全屏操作
document.querySelector('#full').onclick = function () {
//开启全屏显示 webkit :处理兼容性的问题 requestFullScreen:开启全屏显示
img.webkitRequestFullScreen();
}
//退出全屏
document.querySelector('#cancelfull').onclick = function () {
//开启全屏显示 webkit :处理兼容性的问题 CancelfullScreen:开启全屏显示
//这个就不是div来调用了 这个是退出整个文档了 所以是document来调用
document.webkitCancelFullScreen();
}
document.querySelector('#isFull').onclick = function () {
//开启全屏显示 webkit :处理兼容性的问题 CancelfullScreen:开启全屏显示
document.webkitFullScreenElement();
}
/*
ononline:网络连通的时候触发这个事件
onoffline:网络断开时触发
*/
//连通
window.addEventListener('online', function () {
alert('网络连通了')
})
//断开
window.addEventListener('offline', function () {
alert('网络断开了')
});
</script>
</body>
</html>
八. 格式化大数字:
// 格式化大数字:
function formatCount(count) {
var counter = parseInt(count)
if (counter > 100000000) {
return (counter / 100000000).toFixed(1) + "亿"
} else if (counter > 10000) {
return (counter / 10000).toFixed(1) + "万"
} else {
return counter + ""
}
}
// 2. 格式化时长:
function padLeftZero(time) {
time = time + ""
return ("00" + time).slice(time.length)
}
function formatDuration(duration) {
duration = duration / 1000
// 488s / 60 = 8.12
var minute = Math.floor(duration / 60)
// 488s % 60
var second = Math.floor(duration) % 60
return padLeftZero(minute) + ":" + padLeftZero(second)
}
image.png
九. JS 如何处理双引号,反斜杠,中括号这种问题
遇到一下问题怎么处理呢?
image.png let code1 = '"A03"' // 需求: 让 "\"A03\"" 变为: A03, 在网页上显示A03
let code2 = '["A03"]' // 需求: 让 "[\"A03\"]" 变为: A03 在网页上显示A03
let code3 = '[]' // 空 在网页上显示空
let code4 = '"\\"A0201-停机时伴有火花\\""' // 让 "\"\\\"A0201-停机时伴有火花\\\"\"" 变为: A0201-停机时伴有火花 在网页上显示A03 // 统一写一个正则处理所有的问题?
// 1. 使用JS来处理:
// 格式化斜杠 中括号, 双引号
export function getTxt(code) {
if (code === '[]' ||code === "[]") {
return "";
}
if (code) {
var txt = (code + "").replace(/\\|"|""/g, "");
txt = txt.replace("[", "");
txt = txt.replace("]", "");
return txt;
}
}
// 2. 方式二正则:
function getValue(value){
return value.match(/[-\u4e00-\u9fa5a-zA-Z0-9]{0,1}/gm).join(' ')
}