本文接上一篇:总结前端开发中常用的JS功能函数(一) 25、unique : 数组去重,返回一个新数组
02 | if (!isArrayLink(arr)){ |
07 | let obj = Object.create( null ) |
11 | let key = item + '_' + getRawType(item); |
17 | if (!objarr.includes(item)){ |
26、Set简单实现
01 | window.Set = window.Set || ( function () { |
03 | this .items = arr ? unique(arr) : []; |
04 | this .size = this .items.length; |
07 | add: function (value) { |
09 | if (! this .has(value)) { |
10 | this .items.push(value); |
20 | delete : function (value) { |
22 | return this .items.some((v, i) => { |
24 | this .items.splice(i,1) |
30 | has: function (value) { |
32 | return this .items.some(v => v === value) |
27、repeat :生成一个重复的字符串,有n个str组成,可修改为填充为数组等
01 | function repeat(str, n) { |
28、dateFormater :格式化时间
01 | function dateFormater(formater, t){ |
02 | let date = t ? new Date(t) : new Date(), |
03 | Y = date.getFullYear() + '' , |
04 | M = date.getMonth() + 1, |
07 | m = date.getMinutes(), |
08 | s = date.getSeconds(); |
09 | return formater.replace(/YYYY|yyyy/g,Y) |
10 | .replace(/YY|yy/g,Y.substr(2,2)) |
11 | .replace(/MM/g,(M<10? '0' : '' ) + M) |
12 | .replace(/DD/g,(D<10? '0' : '' ) + D) |
13 | .replace(/HH|hh/g,(H<10? '0' : '' ) + H) |
14 | .replace(/mm/g,(m<10? '0' : '' ) + m) |
15 | .replace(/ss/g,(s<10? '0' : '' ) + s) |
29、dateStrForma :将指定字符串由一种时间格式转化为另一种。From的格式应对应str的位置
01 | function dateStrForma(str, from, to){ |
05 | if (~(Y = from.indexOf( 'YYYY' ))){ |
07 | to = to.replace(/YYYY|yyyy/g,Y) |
08 | } else if (~(Y = from.indexOf( 'YY' ))){ |
10 | to = to.replace(/YY|yy/g,Y) |
14 | [ 'M' , 'D' , 'H' , 'h' , 'm' , 's' ].forEach(s =>{ |
16 | k = ~i ? str.substr(i, 2) : '' |
17 | to = to.replace(s+s, k) |
30、getPropByPath :根据字符串路径获取对象属性:‘obj[0].count ’
01 | function getPropByPath(obj, path, strict) { |
03 | path = path.replace(/\[(\w+)\]/g, '.$1' ); |
04 | path = path.replace(/^\./, '' ); |
06 | let keyArr = path.split( '.' ); |
08 | for (let len = keyArr.length; i < len - 1; ++i) { |
09 | if (!tempObj && !strict) break ; |
12 | tempObj = tempObj[key]; |
15 | throw new Error( 'please transfer a valid prop path to form item!' ); |
23 | v: tempObj ? tempObj[keyArr[i]] : null |
31、GetUrlParam :获取Url参数,返回一个对象
01 | function GetUrlParam(){ |
02 | let url = document.location.toString(); |
03 | let arrObj = url.split( "?" ); |
04 | let params = Object.create( null ) |
05 | if (arrObj.length > 1){ |
06 | arrObj = arrObj[1].split( "&" ); |
07 | arrObj.forEach(item=>{ |
08 | item = item.split( "=" ); |
09 | params[item[0]] = item[1] |
32、downloadFile:base64 数据导出文件,文件下载
01 | function downloadFile(filename, data) { |
02 | let DownloadLink = document.createElement( 'a' ); |
04 | document.body.appendChild(DownloadLink); |
05 | DownloadLink.style = 'display: none' ; |
06 | DownloadLink.download = filename; |
07 | DownloadLink.href = data; |
08 | if (document.createEvent) { |
09 | let DownloadEvt = document.createEvent( 'MouseEvents' ); |
10 | DownloadEvt.initEvent( 'click' , true , false ); |
11 | DownloadLink.dispatchEvent(DownloadEvt); |
12 | } else if (document.createEventObject) { |
13 | DownloadLink.fireEvent( 'onclick' ); |
14 | } else if ( typeof DownloadLink.onclick == 'function' ) { |
15 | DownloadLink.onclick(); |
17 | document.body.removeChild(DownloadLink); |
33、toFullScreen :全屏
01 | function toFullScreen() { |
02 | let elem = document.body; |
03 | elem.webkitRequestFullScreen |
04 | ? elem.webkitRequestFullScreen() |
05 | : elem.mozRequestFullScreen |
06 | ? elem.mozRequestFullScreen() |
07 | : elem.msRequestFullscreen |
08 | ? elem.msRequestFullscreen() |
09 | : elem.requestFullScreen |
10 | ? elem.requestFullScreen() |
34、exitFullscreen :退出全屏
01 | function exitFullscreen() { |
02 | let elem = parent.document; |
03 | elem.webkitCancelFullScreen |
04 | ? elem.webkitCancelFullScreen() |
05 | : elem.mozCancelFullScreen |
06 | ? elem.mozCancelFullScreen() |
07 | : elem.cancelFullScreen |
08 | ? elem.cancelFullScreen() |
09 | : elem.msExitFullscreen |
10 | ? elem.msExitFullscreen() |
12 | ? elem.exitFullscreen() |
13 | : alert( "切换失败,可尝试Esc退出" ); |
35、requestAnimationFrame :window动画
01 | window.requestAnimationFrame = window.requestAnimationFrame || |
02 | window.webkitRequestAnimationFrame || |
03 | window.mozRequestAnimationFrame || |
04 | window.msRequestAnimationFrame || |
05 | window.oRequestAnimationFrame || |
08 | window.setTimeout(callback, 1000 / 60); |
10 | window.cancelAnimationFrame = window.cancelAnimationFrame || |
11 | window.webkitCancelAnimationFrame || |
12 | window.mozCancelAnimationFrame || |
13 | window.msCancelAnimationFrame || |
14 | window.oCancelAnimationFrame || |
17 | window.clearTimeout(id); |
36、_isNaN :检查数据是否是非数字值
2 | return !( typeof v === 'string' || typeof v === 'number' ) || isNaN(v) |
37、max :求取数组中非NaN数据中的最大值
2 | arr = arr.filter(item => !_isNaN(item)) |
3 | return arr.length ? Math.max.apply( null , arr) : undefined |
38、min :求取数组中非NaN数据中的最小值
2 | arr = arr.filter(item => !_isNaN(item)) |
3 | return arr.length ? Math.min.apply( null , arr) : undefined |
39、random :返回一个lower-upper直接的随机数。(lower 、upper 无论正负与大小,但必须是非NaN的数据)
1 | function random(lower, upper) { |
4 | return Math.random() * (upper - lower) + lower; |
40、Object.keys :返回一个由一个给定对象的自身可枚举属性组成的数组
01 | Object.keys = Object.keys || function keys(object) { |
02 | if (object === null || object === undefined) { |
03 | throw new TypeError( 'Cannot convert undefined or null to object' ); |
06 | if (isArrayLike(object) || isPlainObject(object)) { |
07 | for (let key in object) { |
08 | object.hasOwnProperty(key) && (result.push(key)) |
41、Object.values :返回一个给定对象自身的所有可枚举属性值的数组
01 | Object.values = Object.values || function values(object) { |
02 | if (object === null || object === undefined) { |
03 | throw new TypeError( 'Cannot convert undefined or null to object' ); |
06 | if (isArrayLike(object) || isPlainObject(object)) { |
07 | for (let key in object) { |
08 | object.hasOwnProperty(key) && (result.push(object[key])) |
42、arr.fill :使用value值填充array,从start位置开始,到end位置结束(但不包含end位置),返回原数组
01 | Array.prototype.fill = Array.prototype.fill || function fill(value, start, end) { |
03 | let length = ctx.length; |
05 | start = parseInt(start) |
08 | } else if (start < 0) { |
09 | start = -start > length ? 0 : (length + start); |
13 | if (isNaN(end) || end > length){ |
43、arr.includes :用来判断一个数组是否包含一个指定的值,如果是返回true,否则返回false,可指定开始查询的位置
01 | Array.prototype.includes = Array.prototype.includes || function includes(value, start) { |
03 | let length = ctx.length; |
04 | start = parseInt(start) |
07 | } else if (start < 0) { |
08 | start = -start > length ? 0 : (length + start); |
10 | let index = ctx.indexOf(value); |
11 | return index >= start; |
44、返回数组中通过测试(函数fn内判断)的第一个元素的值
1 | Array.prototype.find = Array.prototype.find || function find(fn, ctx) { |
4 | ctx.some((value, index, arr), thisValue) => { |
5 | return fn(value, index, arr) ? (result = value, true ) : false |
45、arr.findIndex :返回数组中通过测试(函数fn内判断)的第一个元素的下标
01 | Array.prototype.findIndex = Array.prototype.findIndex || function findIndex(fn, ctx){ |
05 | ctx.some((value, index, arr), thisValue) => { |
06 | return fn(value, index, arr) ? (result = index, true ) : false |
46、performance.timing :利用performance.timing 进行性能分析
01 | window.onload = function () { |
02 | setTimeout( function () { |
03 | let t = performance.timing; |
04 | console.log( 'DNS查询耗时 :' + (t.domainLookupEnd - t.domainLookupStart).toFixed(0)) |
05 | console.log( 'TCP链接耗时 :' + (t.connectEnd - t.connectStart).toFixed(0)) |
06 | console.log( 'request请求耗时 :' + (t.responseEnd - t.responseStart).toFixed(0)) |
07 | console.log( '解析dom树耗时 :' + (t.domComplete - t.domInteractive).toFixed(0)) |
08 | console.log( '白屏时间 :' + (t.responseStart - t.navigationStart).toFixed(0)) |
09 | console.log( 'domready时间 :' + (t.domContentLoadedEventEnd - t.navigationStart).toFixed(0)) |
10 | console.log( 'onload时间 :' + (t.loadEventEnd - t.navigationStart).toFixed(0)) |
11 | if (t = performance.memory) { |
12 | console.log( 'js内存使用占比:' + (t.usedJSHeapSize / t.totalJSHeapSize * 100).toFixed(2) + '%' ) |
47、禁止某些键盘事件
01 | document.addEventListener( 'keydown' , function (event) { |
03 | 112 == event.keyCode || |
04 | 123 == event.keyCode || |
05 | event.ctrlKey && 82 == event.keyCode || |
06 | event.ctrlKey && 18 == event.keyCode || |
07 | event.shiftKey && 121 == event.keyCode || |
08 | event.altKey && 115 == event.keyCode || |
09 | "A" == event.srcElement.tagName && event.shiftKey |
10 | ) || (event.returnValue = false ) |
48、禁止右键、选择、复制
1 | [ 'contextmenu' , 'selectstart' , 'copy' ].forEach( function (ev) { |
2 | document.addEventListener(ev, function (event) { |
3 | return event.returnValue = false ; |
以上两篇文章就是整理的48个前端开发常用函数,欢迎大家继续补充。谢谢!
更多JavaScript相关内容请访问PHP中文网:javascript:;
(责任编辑:admin) |