1、校验数据类型
| export const typeOf = function(obj) { |
| return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase() |
| } |
复制
示例:
| typeOf('树哥') |
| typeOf([]) |
| typeOf(new Date()) |
| typeOf(null) |
| typeOf(true) |
| typeOf(() => { }) |
复制
2、防抖
| export const debounce = (() => { |
| let timer = null |
| return (callback, wait = 800) => { |
| timer&&clearTimeout(timer) |
| timer = setTimeout(callback, wait) |
| } |
| })() |
复制
示例:
如 vue 中使用
| methods: { |
| loadList() { |
| debounce(() => { |
| console.log('加载数据') |
| }, 500) |
| } |
| } |
复制
3、节流
| export const throttle = (() => { |
| let last = 0 |
| return (callback, wait = 800) => { |
| let now = +new Date() |
| if (now - last > wait) { |
| callback() |
| last = now |
| } |
| } |
| })() |
复制
4、手机号脱敏
| export const hideMobile = (mobile) => { |
| return mobile.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2") |
| } |
复制
5、开启全屏
| export const launchFullscreen = (element) => { |
| if (element.requestFullscreen) { |
| element.requestFullscreen() |
| } else if (element.mozRequestFullScreen) { |
| element.mozRequestFullScreen() |
| } else if (element.msRequestFullscreen) { |
| element.msRequestFullscreen() |
| } else if (element.webkitRequestFullscreen) { |
| element.webkitRequestFullScreen() |
| } |
| } |
复制
6、关闭全屏
| export const exitFullscreen = () => { |
| if (document.exitFullscreen) { |
| document.exitFullscreen() |
| } else if (document.msExitFullscreen) { |
| document.msExitFullscreen() |
| } else if (document.mozCancelFullScreen) { |
| document.mozCancelFullScreen() |
| } else if (document.webkitExitFullscreen) { |
| document.webkitExitFullscreen() |
| } |
| } |
复制
7、大小写转换
参数:
-
str 待转换的字符串
-
type 1-全大写 2-全小写 3-首字母大写
| export const turnCase = (str, type) => { |
| switch (type) { |
| case 1: |
| return str.toUpperCase() |
| case 2: |
| return str.toLowerCase() |
| case 3: |
| |
| return str[0].toUpperCase() + str.substring(1).toLowerCase() |
| default: |
| return str |
| } |
| } |
复制
示例:
| turnCase('vue', 1) |
| turnCase('REACT', 2) |
| turnCase('vue', 3) |
复制
8、解析URL参数
| export const getSearchParams = () => { |
| const searchPar = new URLSearchParams(window.location.search) |
| const paramsObj = {} |
| for (const [key, value] of searchPar.entries()) { |
| paramsObj[key] = value |
| } |
| return paramsObj |
| } |
复制
示例:
| // 假设目前位于 https://****com/index?id=154513&age=18; |
| getSearchParams(); // {id: "154513", age: "18"} |
复制
9、判断手机是Andoird还是IOS
| |
| |
| |
| |
| |
| export const getOSType=() => { |
| let u = navigator.userAgent, app = navigator.appVersion; |
| let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; |
| let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); |
| if (isIOS) { |
| return 1; |
| } |
| if (isAndroid) { |
| return 2; |
| } |
| return 3; |
| } |
复制
10、数组对象根据字段去重
参数:
| export const uniqueArrayObject = (arr = [], key = 'id') => { |
| if (arr.length === 0) return |
| let list = [] |
| const map = {} |
| arr.forEach((item) => { |
| if (!map[item[key]]) { |
| map[item[key]] = item |
| } |
| }) |
| list = Object.values(map) |
| |
| return list |
| } |
复制
示例:
| const responseList = [ |
| { id: 1, name: '树哥' }, |
| { id: 2, name: '黄老爷' }, |
| { id: 3, name: '张麻子' }, |
| { id: 1, name: '黄老爷' }, |
| { id: 2, name: '张麻子' }, |
| { id: 3, name: '树哥' }, |
| { id: 1, name: '树哥' }, |
| { id: 2, name: '黄老爷' }, |
| { id: 3, name: '张麻子' }, |
| ] |
| |
| uniqueArrayObject(responseList, 'id') |
| // [{ id: 1, name: '树哥' },{ id: 2, name: '黄老爷' },{ id: 3, name: '张麻子' }] |
复制
11、滚动到页面顶部
| export const scrollToTop = () => { |
| const height = document.documentElement.scrollTop || document.body.scrollTop; |
| if (height > 0) { |
| window.requestAnimationFrame(scrollToTop); |
| window.scrollTo(0, height - height / 8); |
| } |
| } |
复制
12、滚动到元素位置
| export const smoothScroll = element =>{ |
| document.querySelector(element).scrollIntoView({ |
| behavior: 'smooth' |
| }); |
| }; |
复制
示例:
复制
13、uuid
| export const uuid = () => { |
| const temp_url = URL.createObjectURL(new Blob()) |
| const uuid = temp_url.toString() |
| URL.revokeObjectURL(temp_url) |
| return uuid.substring(uuid.lastIndexOf('/') + 1) |
| } |
复制
示例:
复制
通常uuid一般应由后端来进行生成
14、金额格式化
参数:
| export const moneyFormat = (number, decimals, dec_point, thousands_sep) => { |
| number = (number + '').replace(/[^0-9+-Ee.]/g, '') |
| const n = !isFinite(+number) ? 0 : +number |
| const prec = !isFinite(+decimals) ? 2 : Math.abs(decimals) |
| const sep = typeof thousands_sep === 'undefined' ? ',' : thousands_sep |
| const dec = typeof dec_point === 'undefined' ? '.' : dec_point |
| let s = '' |
| const toFixedFix = function(n, prec) { |
| const k = Math.pow(10, prec) |
| return '' + Math.ceil(n * k) / k |
| } |
| s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.') |
| const re = /(-?\d+)(\d{3})/ |
| while (re.test(s[0])) { |
| s[0] = s[0].replace(re, '$1' + sep + '$2') |
| } |
| |
| if ((s[1] || '').length < prec) { |
| s[1] = s[1] || '' |
| s[1] += new Array(prec - s[1].length + 1).join('0') |
| } |
| return s.join(dec) |
| } |
复制
示例:
| moneyFormat(10000000) |
| moneyFormat(10000000, 3, '.', '-') |
复制
15、存储操作
| class MyCache { |
| constructor(isLocal = true) { |
| this.storage = isLocal ? localStorage : sessionStorage |
| } |
| |
| setItem(key, value) { |
| if (typeof (value) === 'object') value = JSON.stringify(value) |
| this.storage.setItem(key, value) |
| } |
| |
| getItem(key) { |
| try { |
| return JSON.parse(this.storage.getItem(key)) |
| } catch (err) { |
| return this.storage.getItem(key) |
| } |
| } |
| |
| removeItem(key) { |
| this.storage.removeItem(key) |
| } |
| |
| clear() { |
| this.storage.clear() |
| } |
| |
| key(index) { |
| return this.storage.key(index) |
| } |
| |
| length() { |
| return this.storage.length |
| } |
| } |
| |
| const localCache = new MyCache() |
| const sessionCache = new MyCache(false) |
| |
| export { localCache, sessionCache } |
复制
示例:
| localCache.getItem('user') |
| sessionCache.setItem('name','树哥') |
| sessionCache.getItem('token') |
| localCache.clear() |
复制
16、下载文件
参数:
-
api 接口
-
params 请求参数
-
fileName 文件名
| const downloadFile = (api, params, fileName, type = 'get') => { |
| axios({ |
| method: type, |
| url: api, |
| responseType: 'blob', |
| params: params |
| }).then((res) => { |
| let str = res.headers['content-disposition'] |
| if (!res || !str) { |
| return |
| } |
| let suffix = '' |
| |
| if (str.lastIndexOf('.')) { |
| fileName ? '' : fileName = decodeURI(str.substring(str.indexOf('=') + 1, str.lastIndexOf('.'))) |
| suffix = str.substring(str.lastIndexOf('.'), str.length) |
| } |
| |
| if (window.navigator.msSaveBlob) { |
| try { |
| const blobObject = new Blob([res.data]); |
| window.navigator.msSaveBlob(blobObject, fileName + suffix); |
| } catch (e) { |
| console.log(e); |
| } |
| } else { |
| |
| let url = window.URL.createObjectURL(res.data) |
| let link = document.createElement('a') |
| link.style.display = 'none' |
| link.href = url |
| link.setAttribute('download', fileName + suffix) |
| document.body.appendChild(link) |
| link.click() |
| document.body.removeChild(link) |
| window.URL.revokeObjectURL(link.href); |
| } |
| }).catch((err) => { |
| console.log(err.message); |
| }) |
| }` |
| |
复制
使用:
| downloadFile('/api/download', {id}, '文件名') |
复制
17、时间操作
关于时间操作,没必要自己再写一大串代码了,强烈推荐使用 day.js[2]
Day.js 是一个仅 2kb 大小的轻量级 JavaScript 时间日期处理库,下载、解析和执行的JavaScript更少,为代码留下更多的时间。
18、深拷贝
| export const clone = parent => { |
| |
| const isType = (obj, type) => { |
| if (typeof obj !== "object") return false; |
| const typeString = Object.prototype.toString.call(obj); |
| let flag; |
| switch (type) { |
| case "Array": |
| flag = typeString === "[object Array]"; |
| break; |
| case "Date": |
| flag = typeString === "[object Date]"; |
| break; |
| case "RegExp": |
| flag = typeString === "[object RegExp]"; |
| break; |
| default: |
| flag = false; |
| } |
| return flag; |
| }; |
| |
| |
| const getRegExp = re => { |
| var flags = ""; |
| if (re.global) flags += "g"; |
| if (re.ignoreCase) flags += "i"; |
| if (re.multiline) flags += "m"; |
| return flags; |
| }; |
| |
| const parents = []; |
| const children = []; |
| |
| const _clone = parent => { |
| if (parent === null) return null; |
| if (typeof parent !== "object") return parent; |
| |
| let child, proto; |
| |
| if (isType(parent, "Array")) { |
| |
| child = []; |
| } else if (isType(parent, "RegExp")) { |
| |
| child = new RegExp(parent.source, getRegExp(parent)); |
| if (parent.lastIndex) child.lastIndex = parent.lastIndex; |
| } else if (isType(parent, "Date")) { |
| |
| child = new Date(parent.getTime()); |
| } else { |
| |
| proto = Object.getPrototypeOf(parent); |
| |
| child = Object.create(proto); |
| } |
| |
| |
| const index = parents.indexOf(parent); |
| |
| if (index != -1) { |
| |
| return children[index]; |
| } |
| parents.push(parent); |
| children.push(child); |
| |
| for (let i in parent) { |
| |
| child[i] = _clone(parent[i]); |
| } |
| |
| return child; |
| }; |
| return _clone(parent); |
| }; |
复制
此方法存在一定局限性:一些特殊情况没有处理: 例如Buffer对象、Promise、Set、Map。
如果确实想要完备的深拷贝,推荐使用 lodash 中的 cloneDeep 方法。
19、模糊搜索
参数:
-
list 原数组
-
keyWord 查询的关键词
-
attribute 数组需要检索属性
| export const fuzzyQuery = (list, keyWord, attribute = 'name') => { |
| const reg = new RegExp(keyWord) |
| const arr = [] |
| for (let i = 0; i < list.length; i++) { |
| if (reg.test(list[i][attribute])) { |
| arr.push(list[i]) |
| } |
| } |
| return arr |
| } |
复制
示例:
| const list = [ |
| { id: 1, name: '树哥' }, |
| { id: 2, name: '黄老爷' }, |
| { id: 3, name: '张麻子' }, |
| { id: 4, name: '汤师爷' }, |
| { id: 5, name: '胡万' }, |
| { id: 6, name: '花姐' }, |
| { id: 7, name: '小梅' } |
| ] |
| fuzzyQuery(list, '树', 'name') // [{id: 1, name: '树哥'}] |
| |
复制
20、遍历树节点
| export const foreachTree = (data, callback, childrenName = 'children') => { |
| for (let i = 0; i < data.length; i++) { |
| callback(data[i]) |
| if (data[i][childrenName] && data[i][childrenName].length > 0) { |
| foreachTree(data[i][childrenName], callback, childrenName) |
| } |
| } |
| } |
复制
示例:
假设我们要从树状结构数据中查找 id 为 9 的节点
| const treeData = [{ |
| id: 1, |
| label: '一级 1', |
| children: [{ |
| id: 4, |
| label: '二级 1-1', |
| children: [{ |
| id: 9, |
| label: '三级 1-1-1' |
| }, { |
| id: 10, |
| label: '三级 1-1-2' |
| }] |
| }] |
| }, { |
| id: 2, |
| label: '一级 2', |
| children: [{ |
| id: 5, |
| label: '二级 2-1' |
| }, { |
| id: 6, |
| label: '二级 2-2' |
| }] |
| }, { |
| id: 3, |
| label: '一级 3', |
| children: [{ |
| id: 7, |
| label: '二级 3-1' |
| }, { |
| id: 8, |
| label: '二级 3-2' |
| }] |
| }], |
| |
| let result |
| foreachTree(data, (item) => { |
| if (item.id === 9) { |
| result = item |
| } |
| }) |
| console.log('result', result) // {id: 9,label: "三级 1-1-1"} |
复制
21.base64解码
| export const base64_decode=(data) =>{ |
| var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; |
| var o1, |
| o2, |
| o3, |
| h1, |
| h2, |
| h3, |
| h4, |
| bits, |
| i = 0, |
| ac = 0, |
| dec = "", |
| tmp_arr = []; |
| if (!data) { |
| return data; |
| } |
| data += ""; |
| do { |
| h1 = b64.indexOf(data.charAt(i++)); |
| h2 = b64.indexOf(data.charAt(i++)); |
| h3 = b64.indexOf(data.charAt(i++)); |
| h4 = b64.indexOf(data.charAt(i++)); |
| bits = (h1 << 18) | (h2 << 12) | (h3 << 6) | h4; |
| o1 = (bits >> 16) & 0xff; |
| o2 = (bits >> 8) & 0xff; |
| o3 = bits & 0xff; |
| if (h3 == 64) { |
| tmp_arr[ac++] = String.fromCharCode(o1); |
| } else if (h4 == 64) { |
| tmp_arr[ac++] = String.fromCharCode(o1, o2); |
| } else { |
| tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); |
| } |
| } while (i < data.length); |
| dec = tmp_arr.join(""); |
| dec = utf8_decode(dec); |
| return dec; |
| } |
复制
22.字符串长度截取
| export const cutstr=(str, len)=> { |
| var temp, |
| icount = 0, |
| patrn = /[^\x00-\xff]/, |
| strre = ""; |
| for (var i = 0; i < str.length; i++) { |
| if (icount < len - 1) { |
| temp = str.substr(i, 1); |
| if (patrn.exec(temp) == null) { |
| icount = icount + 1 |
| } else { |
| icount = icount + 2 |
| } |
| strre += temp |
| } else { |
| break; |
| } |
| } |
| return strre + "..." |
| } |
复制
23.时间日期格式转换
| Date.prototype.format = function(formatStr) { |
| var str = formatStr; |
| var Week = ["日", "一", "二", "三", "四", "五", "六"]; |
| str = str.replace(/yyyy|YYYY/, this.getFullYear()); |
| str = str.replace( |
| /yy|YY/, |
| this.getYear() % 100 > 9 |
| ? (this.getYear() % 100).toString() |
| : "0" + (this.getYear() % 100) |
| ); |
| str = str.replace( |
| /MM/, |
| this.getMonth() + 1 > 9 |
| ? (this.getMonth() + 1).toString() |
| : "0" + (this.getMonth() + 1) |
| ); |
| str = str.replace(/M/g, this.getMonth() + 1); |
| str = str.replace(/w|W/g, Week[this.getDay()]); |
| str = str.replace( |
| /dd|DD/, |
| this.getDate() > 9 ? this.getDate().toString() : "0" + this.getDate() |
| ); |
| str = str.replace(/d|D/g, this.getDate()); |
| str = str.replace( |
| /hh|HH/, |
| this.getHours() > 9 ? this.getHours().toString() : "0" + this.getHours() |
| ); |
| str = str.replace(/h|H/g, this.getHours()); |
| str = str.replace( |
| /mm/, |
| this.getMinutes() > 9 |
| ? this.getMinutes().toString() |
| : "0" + this.getMinutes() |
| ); |
| str = str.replace(/m/g, this.getMinutes()); |
| str = str.replace( |
| /ss|SS/, |
| this.getSeconds() > 9 |
| ? this.getSeconds().toString() |
| : "0" + this.getSeconds() |
| ); |
| str = str.replace(/s|S/g, this.getSeconds()); |
| return str; |
| }; |
| |
| |
| Date.prototype.format = function(format) { |
| var o = { |
| "M+": this.getMonth() + 1, |
| "d+": this.getDate(), |
| "h+": this.getHours(), |
| "m+": this.getMinutes(), |
| "s+": this.getSeconds(), |
| "q+": Math.floor((this.getMonth() + 3) / 3), |
| S: this.getMilliseconds() |
| }; |
| if (/(y+)/.test(format)) |
| format = format.replace( |
| RegExp.$1, |
| (this.getFullYear() + "").substr(4 - RegExp.$1.length) |
| ); |
| for (var k in o) { |
| if (new RegExp("(" + k + ")").test(format)) |
| format = format.replace( |
| RegExp.$1, |
| RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length) |
| ); |
| } |
| return format; |
| }; |
| alert(new Date().format("yyyy-MM-dd hh:mm:ss")); |
复制
24.类型判断
判断核心使用Object.prototype.toString,这种方式可以准确的判断数据类型
| |
| |
| |
| |
| |
| function isType(target, type) { |
| let targetType = Object.prototype.toString.call(target).slice(8, -1).toLowerCase() |
| return targetType === type.toLowerCase() |
| } |
复制
示例
| isType([], 'Array') |
| isType(/\d/, 'RegExp') |
| isType(new Date(), 'Date') |
| isType(function(){}, 'Function') |
| isType(Symbol(1), 'Symbol') |
复制
25.对象属性剔除
应用场景很简单,当你需要使用一个对象,但想移除部分属性时,可以使用该方法。同样的,你可以实现一个对象属性选取方法
| |
| |
| |
| |
| |
| function omit(object, props=[]){ |
| let res = {} |
| Object.keys(object).forEach(key=>{ |
| if(props.includes(key) === false){ |
| res[key] = typeof object[key] === 'object' && object[key] !== null ? |
| jsON.parse(jsON.stringify(object[key])): |
| object[key] |
| } |
| }) |
| return res |
| } |
复制
示例
| let data = { |
| id: 1, |
| title: 'xxx', |
| comment: [] |
| } |
| omit(data, ['id']) // {title: 'xxx', comment: []} |
复制
26.日期格式化
灵活的日期格式化函数,可以根据使用者给定的格式进行格式化,能应对大部分场景
| |
| |
| |
| |
| |
| function formatDate(format='Y-M-D h:m', timestamp=Date.now()){ |
| let date = new Date(timestamp) |
| let dateInfo = { |
| Y: date.getFullYear(), |
| M: date.getMonth()+1, |
| D: date.getDate(), |
| h: date.getHours(), |
| m: date.getMinutes(), |
| s: date.getSeconds() |
| } |
| let formatNumber = (n) => n > 10 ? n : '0' + n |
| let res = format |
| .replace('Y', dateInfo.Y) |
| .replace('M', dateInfo.M) |
| .replace('D', dateInfo.D) |
| .replace('h', formatNumber(dateInfo.h)) |
| .replace('m', formatNumber(dateInfo.m)) |
| .replace('s', formatNumber(dateInfo.s)) |
| return res |
| } |
复制
示例
| formatDate() |
| formatDate('M月D日 h:m') |
| formatDate('h:m Y-M-D', 1582526221604) |
复制
27.性能分析
Web Performance API允许网页访问某些函数来测量网页和Web应用程序的性能。
performance.timing 包含延迟相关的性能信息。
performance.memory 包含内存信息,是Chrome中添加的一个非标准扩展,在使用时需要注意。
| window.onload = function(){ |
| setTimeout(()=>{ |
| let t = performance.timing, |
| m = performance.memory |
| console.table({ |
| 'DNS查询耗时': (t.domainLookupEnd - t.domainLookupStart).toFixed(0), |
| 'TCP链接耗时': (t.connectEnd - t.connectStart).toFixed(0), |
| 'request请求耗时': (t.responseEnd - t.responseStart).toFixed(0), |
| '解析dom树耗时': (t.domComplete - t.domInteractive).toFixed(0), |
| '白屏时间': (t.responseStart - t.navigationStart).toFixed(0), |
| 'domready时间': (t.domContentLoadedEventEnd - t.navigationStart).toFixed(0), |
| 'onload时间': (t.loadEventEnd - t.navigationStart).toFixed(0), |
| 'js内存使用占比': m ? (m.usedjsHeapSize / m.totaljsHeapSize * 100).toFixed(2) + '%' : undefined |
| }) |
| }) |
| } |
复制
28.识别浏览器及平台
| function getPlatformInfo(){ |
| |
| let inBrowser = typeof window !== 'undefined'; |
| |
| let inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform; |
| let weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); |
| |
| let UA = inBrowser && window.navigator.userAgent.toLowerCase(); |
| if(UA){ |
| let platforms = { |
| IE: /msie|trident/.test(UA), |
| IE9: UA.indexOf('msie 9.0') > 0, |
| Edge: UA.indexOf('edge/') > 0, |
| Android: UA.indexOf('android') > 0 || (weexPlatform === 'android'), |
| IOS: /iphone|ipad|ipod|ios/.test(UA) || (weexPlatform === 'ios'), |
| Chrome: /chrome\/\d+/.test(UA) && !(UA.indexOf('edge/') > 0), |
| } |
| for (const key in platforms) { |
| if (platforms.hasOwnProperty(key)) { |
| if(platforms[key]) return key |
| } |
| } |
| } |
| } |
复制
29.数组扁平化
| export const flatten = (arr) => { |
| let result = []; |
| for(let i = 0; i < arr.length; i++) { |
| if(Array.isArray(arr[i])) { |
| result = result.concat(flatten(arr[i])); |
| } else { |
| result.push(arr[i]); |
| } |
| } |
| return result; |
| } |
复制
30.数组中获取随机数
| export const sample = arr => arr[Math.floor(Math.random() * arr.length)]; |
复制
31.生成随机字符串
| export const randomString = (len) => { |
| let chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789'; |
| let strLen = chars.length; |
| let randomStr = ''; |
| for (let i = 0; i < len; i++) { |
| randomStr += chars.charAt(Math.floor(Math.random() * strLen)); |
| } |
| return randomStr; |
| }; |
复制
31.手机号中间四位变成*
| export const telFormat = (tel) => { |
| tel = String(tel); |
| return tel.substr(0,3) + "****" + tel.substr(7); |
| }; |
复制
32.全角转换为半角
| export const toCDB = (str) => { |
| let result = ""; |
| for (let i = 0; i < str.length; i++) { |
| code = str.charCodeAt(i); |
| if (code >= 65281 && code <= 65374) { |
| result += String.fromCharCode(str.charCodeAt(i) - 65248); |
| } else if (code == 12288) { |
| result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); |
| } else { |
| result += str.charAt(i); |
| } |
| } |
| return result; |
| } |
复制
33.半角转换为全角
| export const toDBC = (str) => { |
| let result = ""; |
| for (let i = 0; i < str.length; i++) { |
| code = str.charCodeAt(i); |
| if (code >= 33 && code <= 126) { |
| result += String.fromCharCode(str.charCodeAt(i) + 65248); |
| } else if (code == 32) { |
| result += String.fromCharCode(str.charCodeAt(i) + 12288 - 32); |
| } else { |
| result += str.charAt(i); |
| } |
| } |
| return result; |
| } |
复制
34.数字转化为大写金额
| export const digitUppercase = (n) => { |
| const fraction = ['角', '分']; |
| const digit = [ |
| '零', '壹', '贰', '叁', '肆', |
| '伍', '陆', '柒', '捌', '玖' |
| ]; |
| const unit = [ |
| ['元', '万', '亿'], |
| ['', '拾', '佰', '仟'] |
| ]; |
| n = Math.abs(n); |
| let s = ''; |
| for (let i = 0; i < fraction.length; i++) { |
| s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, ''); |
| } |
| s = s || '整'; |
| n = Math.floor(n); |
| for (let i = 0; i < unit[0].length && n > 0; i++) { |
| let p = ''; |
| for (let j = 0; j < unit[1].length && n > 0; j++) { |
| p = digit[n % 10] + unit[1][j] + p; |
| n = Math.floor(n / 10); |
| } |
| s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s; |
| } |
| return s.replace(/(零.)*零元/, '元') |
| .replace(/(零.)+/g, '零') |
| .replace(/^整$/, '零元整'); |
| }; |
复制
35.数字转化为中文数字
| export const intToChinese = (value) => { |
| const str = String(value); |
| const len = str.length-1; |
| const idxs = ['','十','百','千','万','十','百','千','亿','十','百','千','万','十','百','千','亿']; |
| const num = ['零','一','二','三','四','五','六','七','八','九']; |
| return str.replace(/([1-9]|0+)/g, ( $, $1, idx, full) => { |
| let pos = 0; |
| if($1[0] !== '0'){ |
| pos = len-idx; |
| if(idx == 0 && $1[0] == 1 && idxs[len-idx] == '十'){ |
| return idxs[len-idx]; |
| } |
| return num[$1[0]] + idxs[len-idx]; |
| } else { |
| let left = len - idx; |
| let right = len - idx + $1.length; |
| if(Math.floor(right / 4) - Math.floor(left / 4) > 0){ |
| pos = left - left % 4; |
| } |
| if( pos ){ |
| return idxs[pos] + num[$1[0]]; |
| } else if( idx + $1.length >= len ){ |
| return ''; |
| }else { |
| return num[$1[0]] |
| } |
| } |
| }); |
| } |
复制
36.存储loalStorage
| export const loalStorageSet = (key, value) => { |
| if (!key) return; |
| if (typeof value !== 'string') { |
| value = JSON.stringify(value); |
| } |
| window.localStorage.setItem(key, value); |
| }; |
复制
37.获取localStorage
| export const loalStorageGet = (key) => { |
| if (!key) return; |
| return window.localStorage.getItem(key); |
| }; |
复制
38.删除localStorage
| export const loalStorageRemove = (key) => { |
| if (!key) return; |
| window.localStorage.removeItem(key); |
| }; |
复制
39.存储sessionStorage
| export const sessionStorageSet = (key, value) => { |
| if (!key) return; |
| if (typeof value !== 'string') { |
| value = JSON.stringify(value); |
| } |
| window.sessionStorage.setItem(key, value) |
| }; |
复制
40.获取sessionStorage
| export const sessionStorageGet = (key) => { |
| if (!key) return; |
| return window.sessionStorage.getItem(key) |
| }; |
复制
41.删除sessionStorage
| export const sessionStorageRemove = (key) => { |
| if (!key) return; |
| window.sessionStorage.removeItem(key) |
| }; |
复制
42.设置cookie
| export const setCookie = (key, value, expire) => { |
| const d = new Date(); |
| d.setDate(d.getDate() + expire); |
| document.cookie = `${key}=${value};expires=${d.toUTCString()}` |
| }; |
复制
43.读取cookie
| export const getCookie = (key) => { |
| const cookieStr = unescape(document.cookie); |
| const arr = cookieStr.split('; '); |
| let cookieValue = ''; |
| for (let i = 0; i < arr.length; i++) { |
| const temp = arr[i].split('='); |
| if (temp[0] === key) { |
| cookieValue = temp[1]; |
| break |
| } |
| } |
| return cookieValue |
| }; |
复制
44.删除cookie
| export const delCookie = (key) => { |
| document.cookie = `${encodeURIComponent(key)}=;expires=${new Date()}` |
| }; |
复制
45.校验身份证号码
| export const checkCardNo = (value) => { |
| let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; |
| return reg.test(value); |
| }; |
复制
46.校验是否包含中文
| export const haveCNChars => (value) => { |
| return /[\u4e00-\u9fa5]/.test(value); |
| } |
复制
47.校验是否为中国大陆的邮政编码
| export const isPostCode = (value) => { |
| return /^[1-9][0-9]{5}$/.test(value.toString()); |
| } |
复制
48.校验是否为IPv6地址
| export const isIPv6 = (str) => { |
| return Boolean(str.match(/:/g)?str.match(/:/g).length<=7:false && /::/.test(str)?/^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(str):/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str)); |
| } |
复制
49.校验是否为邮箱地址
| export const isEmail = (value) { |
| return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value); |
| } |
复制
50.校验是否为中国大陆手机号
| export const isTel = (value) => { |
| return /^1[3,4,5,6,7,8,9][0-9]{9}$/.test(value.toString()); |
| } |
复制
51.校验是否包含emoji表情
| export const isEmojiCharacter = (value) => { |
| value = String(value); |
| for (let i = 0; i < value.length; i++) { |
| const hs = value.charCodeAt(i); |
| if (0xd800 <= hs && hs <= 0xdbff) { |
| if (value.length > 1) { |
| const ls = value.charCodeAt(i + 1); |
| const uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000; |
| if (0x1d000 <= uc && uc <= 0x1f77f) { |
| return true; |
| } |
| } |
| } else if (value.length > 1) { |
| const ls = value.charCodeAt(i + 1); |
| if (ls == 0x20e3) { |
| return true; |
| } |
| } else { |
| if (0x2100 <= hs && hs <= 0x27ff) { |
| return true; |
| } else if (0x2B05 <= hs && hs <= 0x2b07) { |
| return true; |
| } else if (0x2934 <= hs && hs <= 0x2935) { |
| return true; |
| } else if (0x3297 <= hs && hs <= 0x3299) { |
| return true; |
| } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 |
| || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b |
| || hs == 0x2b50) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
复制
52.获取URL参数列表
| export const GetRequest = () => { |
| let url = location.search; |
| const paramsStr = /.+\?(.+)$/.exec(url)[1]; |
| const paramsArr = paramsStr.split('&'); |
| let paramsObj = {}; |
| |
| paramsArr.forEach(param => { |
| if (/=/.test(param)) { |
| let [key, val] = param.split('='); |
| val = decodeURIComponent(val); |
| val = /^\d+$/.test(val) ? parseFloat(val) : val; |
| if (paramsObj.hasOwnProperty(key)) { |
| paramsObj[key] = [].concat(paramsObj[key], val); |
| } else { |
| paramsObj[key] = val; |
| } |
| } else { |
| paramsObj[param] = true; |
| } |
| }) |
| return paramsObj; |
| }; |
复制
53.检测URL是否有效
| export const getUrlState = (URL) => { |
| let xmlhttp = new ActiveXObject("microsoft.xmlhttp"); |
| xmlhttp.Open("GET", URL, false); |
| try { |
| xmlhttp.Send(); |
| } catch (e) { |
| } finally { |
| let result = xmlhttp.responseText; |
| if (result) { |
| if (xmlhttp.Status == 200) { |
| return true; |
| } else { |
| return false; |
| } |
| } else { |
| return false; |
| } |
| } |
| } |
复制
54.键值对拼接成URL参数
| export const params2Url = (obj) => { |
| let params = [] |
| for (let key in obj) { |
| params.push(`${key}=${obj[key]}`); |
| } |
| return encodeURIComponent(params.join('&')) |
| } |
复制
55.修改URL中的参数
| export const replaceParamVal => (paramName, replaceWith) { |
| const oUrl = location.href.toString(); |
| const re = eval('/('+ paramName+'=)([^&]*)/gi'); |
| location.href = oUrl.replace(re,paramName+'='+replaceWith); |
| return location.href; |
| } |
复制
56.删除URL中指定参数
| export const funcUrlDel = (name) => { |
| const baseUrl = location.origin + location.pathname + "?"; |
| const query = location.search.substr(1); |
| if (query.indexOf(name) > -1) { |
| const obj = {}; |
| const arr = query.split("&"); |
| for (let i = 0; i < arr.length; i++) { |
| arr[i] = arr[i].split("="); |
| obj[arr[i][0]] = arr[i][1]; |
| } |
| delete obj[name]; |
| return baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g,"").replace(/\:/g,"=").replace(/\,/g,"&"); |
| } |
| } |
复制
57.判断是移动还是PC设备
| export const isMobile = () => { |
| if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) { |
| return 'mobile'; |
| } |
| return 'desktop'; |
| } |
复制
58.判断是否是苹果还是安卓移动设备
| export const isAppleMobileDevice = () => { |
| let reg = /iphone|ipod|ipad|Macintosh/i; |
| return reg.test(navigator.userAgent.toLowerCase()); |
| } |
复制
59.判断是否是安卓移动设备
| export const isAndroidMobileDevice = () => { |
| return /android/i.test(navigator.userAgent.toLowerCase()); |
| } |
复制
60.判断是Windows还是Mac系统
| export const osType = () => { |
| const agent = navigator.userAgent.toLowerCase(); |
| const isMac = /macintosh|mac os x/i.test(navigator.userAgent); |
| const isWindows = agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0 || agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0; |
| if (isWindows) { |
| return "windows"; |
| } |
| if(isMac){ |
| return "mac"; |
| } |
| } |
复制
61.判断是否是微信/QQ内置浏览器
| export const broswer = () => { |
| const ua = navigator.userAgent.toLowerCase(); |
| if (ua.match(/MicroMessenger/i) == "micromessenger") { |
| return "weixin"; |
| } else if (ua.match(/QQ/i) == "qq") { |
| return "QQ"; |
| } |
| return false; |
| } |
复制
62.浏览器型号和版本
| export const getExplorerInfo = () => { |
| let t = navigator.userAgent.toLowerCase(); |
| return 0 <= t.indexOf("msie") ? { |
| type: "IE", |
| version: Number(t.match(/msie ([\d]+)/)[1]) |
| } : !!t.match(/trident\/.+?rv:(([\d.]+))/) ? { |
| type: "IE", |
| version: 11 |
| } : 0 <= t.indexOf("edge") ? { |
| type: "Edge", |
| version: Number(t.match(/edge\/([\d]+)/)[1]) |
| } : 0 <= t.indexOf("firefox") ? { |
| type: "Firefox", |
| version: Number(t.match(/firefox\/([\d]+)/)[1]) |
| } : 0 <= t.indexOf("chrome") ? { |
| type: "Chrome", |
| version: Number(t.match(/chrome\/([\d]+)/)[1]) |
| } : 0 <= t.indexOf("opera") ? { |
| type: "Opera", |
| version: Number(t.match(/opera.([\d]+)/)[1]) |
| } : 0 <= t.indexOf("Safari") ? { |
| type: "Safari", |
| version: Number(t.match(/version\/([\d]+)/)[1]) |
| } : { |
| type: t, |
| version: -1 |
| } |
| } |
复制
63.滚动到页面顶部
export const scrollToTop = () => {
const height = document.documentElement.scrollTop || document.body.scrollTop;
if (height > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, height - height / 8);
}
}
复制
64.滚动到页面底部
export const scrollToBottom = () => {
window.scrollTo(0, document.documentElement.clientHeight);
}
复制
65.滚动到指定元素区域
export const smoothScroll = (element) => {
document.querySelector(element).scrollIntoView({
behavior: 'smooth'
});
};
复制
66.获取可视窗口高度
export const getClientHeight = () => {
let clientHeight = 0;
if (document.body.clientHeight && document.documentElement.clientHeight) {
clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight;
}
else {
clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight;
}
return clientHeight;
}
复制
67.获取可视窗口宽度
export const getPageViewWidth = () => {
return (document.compatMode == "BackCompat" ? document.body : document.documentElement).clientWidth;
}
复制
68.打开浏览器全屏
export const toFullScreen = () => {
let element = document.body;
if (element.requestFullscreen) {
element.requestFullscreen()
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen()
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen()
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullScreen()
}
}
复制
69.退出浏览器全屏
export const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen()
} else if (document.msExitFullscreen) {
document.msExitFullscreen()
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen()
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen()
}
}
复制
70.当前时间
export const nowTime = () => {
const now = new Date();
const year = now.getFullYear();
const month = now.getMonth();
const date = now.getDate() >= 10 ? now.getDate() : ('0' + now.getDate());
const hour = now.getHours() >= 10 ? now.getHours() : ('0' + now.getHours());
const miu = now.getMinutes() >= 10 ? now.getMinutes() : ('0' + now.getMinutes());
const sec = now.getSeconds() >= 10 ? now.getSeconds() : ('0' + now.getSeconds());
return +year + "年" + (month + 1) + "月" + date + "日 " + hour + ":" + miu + ":" + sec;
}复制
71.格式化时间
export const dateFormater = (formater, time) => {
let date = time ? new Date(time) : new Date(),
Y = date.getFullYear() + '',
M = date.getMonth() + 1,
D = date.getDate(),
H = date.getHours(),
m = date.getMinutes(),
s = date.getSeconds();
return formater.replace(/YYYY|yyyy/g, Y)
.replace(/YY|yy/g, Y.substr(2, 2))
.replace(/MM/g,(M<10 ? '0' : '') + M)
.replace(/DD/g,(D<10 ? '0' : '') + D)
.replace(/HH|hh/g,(H<10 ? '0' : '') + H)
.replace(/mm/g,(m<10 ? '0' : '') + m)
.replace(/ss/g,(s<10 ? '0' : '') + s)
}
// dateFormater('YYYY-MM-DD HH:mm:ss')
// dateFormater('YYYYMMDDHHmmss')
复制
72.阻止冒泡事件
export const stopPropagation = (e) => {
e = e || window.event;
if(e.stopPropagation) { // W3C阻止冒泡方法
e.stopPropagation();
} else {
e.cancelBubble = true; // IE阻止冒泡方法
}
}
复制
73.节流函数
export const throttle = (fn, delay) => {
let curTime = Date.now();
return function() {
let context = this,
args = arguments,
nowTime = Date.now();
if (nowTime - curTime >= delay) {
curTime = Date.now();
return fn.apply(context, args);
}
};
}
复制
74.数据类型判断
export const getType = (value) => {
if (value === null) {
return value + "";
}
// 判断数据是引用类型的情况
if (typeof value === "object") {
let valueClass = Object.prototype.toString.call(value),
type = valueClass.split(" ")[1].split("");
type.pop();
return type.join("").toLowerCase();
} else {
// 判断数据是基本数据类型的情况和函数的情况
return typeof value;
}
}
复制
75.对象深拷贝
export const deepClone = (obj, hash = new WeakMap()) => {
// 日期对象直接返回一个新的日期对象
if (obj instanceof Date){
return new Date(obj);
}
//正则对象直接返回一个新的正则对象
if (obj instanceof RegExp){
return new RegExp(obj);
}
//如果循环引用,就用 weakMap 来解决
if (hash.has(obj)){
return hash.get(obj);
}
// 获取对象所有自身属性的描述
let allDesc = Object.getOwnPropertyDescriptors(obj);
// 遍历传入参数所有键的特性
let cloneObj = Object.create(Object.getPrototypeOf(obj), allDesc)
hash.set(obj, cloneObj)
for (let key of Reflect.ownKeys(obj)) {
if(typeof obj[key] === 'object' && obj[key] !== null){
cloneObj[key] = deepClone(obj[key], hash);
} else {
cloneObj[key] = obj[key];
}
}
return cloneObj
}
复制
76.封装fetch
| |
| |
| |
| |
| const fetchUtil = { |
| get: (url) => { |
| return new Promise((resolve, reject) => { |
| fetch(url, { |
| method: 'GET', |
| headers: { |
| 'Content-Type': 'application/x-www-form-urlencoded', |
| } |
| }).then((response) => response.json()).then(response => { |
| resolve(response); |
| }).catch(err => { |
| reject(new Error(err)); |
| }); |
| }); |
| }, |
| post: (url, params) => { |
| return new Promise((resolve, reject) => { |
| fetch(url, { |
| method: 'POST', |
| headers: { |
| 'Content-Type': 'application/x-www-form-urlencoded', |
| }, |
| body: params |
| }).then((response) => response.json()).then(response => { |
| resolve(response); |
| }).catch(err => { |
| reject(new Error(err)); |
| }); |
| }); |
| } |
| }; |
| |
| export default fetchUtil; |
复制
示例
| import Fetch from "../util/FetchUtil.js"; |
| |
| post(){ |
| let params = ""; |
| params += "phone=" + "xxxxxx" + "&password="+"123456"; |
| Fetch.post("https://carvedu.com/api/user/sms", this.params) |
| .then(res => { |
| console.log(res); |
| }) |
| .catch(err => { |
| console.log(err); |
| }); |
| } |
| |
| get() { |
| Fetch.get("https://carvedu.com/api/courses") |
| .then(res => { |
| console.log(res); |
| }) |
| .catch(err => { |
| console.log(err); |
| }); |
| } |
复制
77.封装正则库
| export default { |
| |
| regExp:()=>{ |
| return { |
| mPattern :/^1[345789]\d{9}$/, |
| cP : /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, |
| regCode : /^\d{4}$/ |
| |
| } |
| } |
| } |
复制
示例
| import regExp from '../util/regExp.js' |
| |
| reg(){ |
| var value ="" |
| console.log(regExp.regExp().mPattern.test(value)); |
| }, |
复制
78.图片是否加载完成
| export default { |
| |
| imgLoad:(src)=>{ |
| let bgImg = new Image(); |
| bgImg.src = src; |
| bgImg.onerror = () => { |
| console.log("img onerror"); |
| }; |
| bgImg.onload = () => { |
| console.log("加载完成"); |
| return false |
| }; |
| } |
| } |
复制
示例
| import imgLoad from '../util/imgLoad' |
| |
| imgLoad.imgLoad('这里写图片的地址'); |
复制
持续更新!!!
整理不易,希望观众老爷们点点赞。