JavaScript常用工具函数
- 检测数据是不是除了symbol外的原始数据
function isStatic(value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
typeof value === 'boolean' ||
typeof value === 'undefined' ||
value === null
)
}
- 检查数据是否为有效的类数组长度
function isLength(value) {
return (
typeof value == 'number' &&
value > -1 &&
value % 1 == 0 &&
value <= Number.MAX_SAFE_INTEGER
)
}
- 检查数据是否为函数
function isFunction(value) {
return Object.prototype.toString.call(value) === '[object Function]'
}
- 判断数据是否为时间对象
function isDate(value) {
return Object.prototype.toString.call(value) === '[object Date]'
}
- 判断数据是否为正则对象
function isRegExp(value) {
return Object.prototype.toString.call(value) === '[object RegExp]'
}
- 判断数据是否为数组类型的数据
function isArray(arr) {
return Object.prototype.toString.call(arr) === '[object Array]'
}
- 获取数组中非undefined数据中的最大值
function max(arr) {
arr = arr.filter(item => !_isNaN(item))
return arr.length ? Math.max.apply(null, arr) : undefined
}
- 获取数组中非undefined数据中的最小值
function min(arr) {
arr = arr.filter(item => !_isNaN(item))
return arr.length ? Math.min.apply(null, arr) : undefined
}
- 横线转驼峰命名
let camelizeRE = /-(\w)/g
function camelize(str) {
return str.replace(camelizeRE, function (_, c) {
return c ? c.toUpperCase() : ''
})
}
- 驼峰命名转横线命名:拆分字符串,使用 - 相连,并且转换为小写
let hyphenateRE = /\B([A-Z])/g
function hyphenate(str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
}
- 字符串首位大写
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1)
}
- 深拷贝
function deepCopy(obj, hash = new WeakMap()) {
// 日期对象直接返回一个新的日期对象
if (obj.constructor === Date) return new Date(obj)
// 正则对象直接返回一个新的正则对象
if (obj.constructor === RegExp) return new RegExp(obj)
// 如果循环引用了就用WeakMap解决
if (hash.has(obj)) return hash.get(obj)
// 遍历传图参数所有键的特性
let allDesc = Object.getOwnPropertyDescriptor(obj)
// 继承原型链
let copyObj = Object.create(Object.getPrototypeOf(obj), allDesc)
hash.set(obj, copyObj)
for (let key of Reflect.ownKeys(obj)) {
copyObj[key] =
isComplexDataType(obj[key]) && typeof obj[key] !== 'function'
? deepCopy(obj[key], hash)
: obj[key]
}
function isComplexDataType(obj) {
return (
(typeof obj === 'object' || typeof obj === 'function') && obj !== null
)
}
return copyObj
}
- 数据深、浅拷贝
function deepCLone(obj) {
// 定义变量检测传递参数是对象还是数组
let objClone = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object' && obj != null) {
// 判断obju存在且类型为对象时,因为null也是
for (let key in obj) {
// 遍历对象类型的obj,判断obj中是否存在key属性
if (obj.hasOwnProperty(key)) {
// 判断如果obj[key]存在且是对象类型时应进行深拷贝,即在堆内存中开辟新的内存
if (obj[key] && typeof obj[key] === 'object') {
// 递归实现深拷贝
objClone[key] = deepCLone(obj[key])
} else {
// 浅拷贝
objClone[key] = obj[key]
}
}
}
}
return objClone
}
- 获取数据类型,返回结果为 Number、String、Object、Array等
function getRawType(value) {
return Object.prototype.toString.call(value).slice(8, -1)
}
- 格式化时间
/**
* @name: dateFormater
* @msg: 格式化时间
* @param {*} formater 预期时间格式
* @param {*} t 时间,可为空
* @return {*}
*/
function dateFormater(formater, t) {
let date = t ? new Date(t) : 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.substring(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)
}
- 获取url参数,返回一个对象
function GetUrlParam() {
let url = document.location.toString()
let arrObj = url.split('?')
let params = Object.create(null)
if (arrObj.length > 1) {
arrObj = arrObj[1].split('&')
arrObj.forEach(item => {
item = item.split('=')
params[item[0]] = item[1]
})
}
return params
}
// ?a=1&b=2&c=3 ==> {a: "1", b: "2", c: "3"}
- base64转blob
/**
* @desc base64转blob
* @param {String} data base64
* @return {Blob} blob
*/
function dataURLtoBlob(data) {
const dataAtob = atob(data)
let dataLength = dataAtob.length
const u8arr = new Uint8Array(dataLength)
while (dataLength--) {
u8arr[dataLength] = dataAtob.charCodeAt(dataLength)
}
return new Blob([u8arr])
}
- base64数据导出文件。文件下载
function downloadFile(filename, data) {
let DownloadLink = document.createElement('a')
if (DownloadLink) {
document.body.appendChild(DownloadLink)
DownloadLink.style = 'display: none'
DownloadLink.download = filename
DownloadLink.href = data
if (document.createEvent) {
let DownloadEvt = document.createEvent('MouseEvents')
DownloadEvt.initEvent('click', true, false)
DownloadLink.dispatchEvent(DownloadEvt)
} else if (document.createEventObject) DownloadLink.fireEvent('onclick')
else if (typeof DownloadLink.onclick == 'function') DownloadLink.onclick()
document.body.removeChild(DownloadLink)
}
}
- 下载文件
/**
* @desc 下载文件
* @param {String} data 二进制流文件
* @param {String} fileName 文件名
* @param {boolean} transformBlob 是否是Blob,默认不传无需转换
*/
export function download(data, fileName, transformBlob) {
const blob = !transformBlob ? data : dataURLtoBlob(data)
const blobUrl = window.URL.createObjectURL(blob)
// desc:兼容IE浏览器blob文件下载
if (navigator.msSaveOrOpenBlob) {
navigator.msSaveOrOpenBlob(blob, fileName)
} else {
const a = document.createElement('a')
a.style.display = 'none'
a.href = blobUrl
a.download = fileName
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
window.URL.revokeObjectURL(blobUrl)
}
}
- 页面全屏
function toFullScreen() {
let el = document.documentElement
let rfs =
el.requestFullScreen ||
el.webkitRequestFullScreen ||
el.mozRequestFullScreen ||
el.msRequestFullScreen
//typeof rfs != "undefined" && rfs
if (rfs) {
rfs.call(el)
} else if (typeof window.ActiveXObject !== 'undefined') {
//for IE,这里其实就是模拟了按下键盘的F11,使浏览器全屏
let wscript = new ActiveXObject('WScript.Shell')
if (wscript != null) {
wscript.SendKeys('{F11}')
}
} else {
alert('浏览器不支持全屏')
}
}
- 退出全屏
function exitFullscreen() {
let el = parent.document
let cfs =
el.cancelFullScreen ||
el.webkitCancelFullScreen ||
el.mozCancelFullScreen ||
el.exitFullScreen
//typeof cfs != "undefined" && cfs
if (cfs) {
cfs.call(el)
} else if (typeof window.ActiveXObject !== 'undefined') {
//for IE,这里和fullScreen相同,模拟按下F11键退出全屏
let wscript = new ActiveXObject('WScript.Shell')
if (wscript != null) {
wscript.SendKeys('{F11}')
}
} else {
alert('切换失败,可尝试Esc退出')
}
}
- 利用performance.timing进行性能分析
window.onload = function () {
setTimeout(function () {
let t = performance.timing
console.log(
'DNS查询耗时 :' + (t.domainLookupEnd - t.domainLookupStart).toFixed(0)
)
console.log('TCP链接耗时 :' + (t.connectEnd - t.connectStart).toFixed(0))
console.log(
'request请求耗时 :' + (t.responseEnd - t.responseStart).toFixed(0)
)
console.log(
'解析dom树耗时 :' + (t.domComplete - t.domInteractive).toFixed(0)
)
console.log(
'白屏时间 :' + (t.responseStart - t.navigationStart).toFixed(0)
)
console.log(
'domready时间 :' +
(t.domContentLoadedEventEnd - t.navigationStart).toFixed(0)
)
console.log(
'onload时间 :' + (t.loadEventEnd - t.navigationStart).toFixed(0)
)
if ((t = performance.memory)) {
console.log(
'js内存使用占比 :' +
((t.usedJSHeapSize / t.totalJSHeapSize) * 100).toFixed(2) +
'%'
)
}
})
}
- 禁止某些键盘事件
document.addEventListener('keydown', function (event) {
return (
!(
(
112 == event.code || //F1
123 == event.code || //F12
(event.ctrlKey && 82 == event.code) || //ctrl + R
(event.ctrlKey && 78 == event.code) || //ctrl + N
(event.shiftKey && 121 == event.code) || //shift + F10
(event.altKey && 115 == event.code) || //alt + F4
('A' == event.srcElement.tagName && event.shiftKey)
) //shift + 点击a标签
) || (event.returnValue = false)
)
})
- 禁止右键、选择、赋值
['contextmenu', 'selectstart', 'copy'].forEach(function (ev) {
document.addEventListener(ev, function (event) {
return (event.returnValue = false)
})
})
常用js工具函数,长期维护更新
JavaScript常用工具函数的更多相关文章
- javascript常用工具函数总结(不定期补充)未指定标题的文章
前言 以下代码来自:自己写的.工作项目框架上用到的.其他框架源码上的.网上看到的. 主要是作为工具函数,服务于框架业务,自身不依赖于其他框架类库,部分使用到es6/es7的语法使用时要注意转码 虽然尽 ...
- javascript常用工具类整理(copy)
JavaScript常用工具类 类型 日期 数组 字符串 数字 网络请求 节点 存储 其他 1.类型 isString (o) { //是否字符串 return Object.prototype.to ...
- vue项目工具文件utils.js javascript常用工具类,javascript常用工具类,util.js
vue项目工具文件utils.js :https://blog.csdn.net/Ajaxguan/article/details/79924249 javascript常用工具类,util.js : ...
- numpy 常用工具函数 —— np.bincount/np.average
numpy 常用工具函数 —— np.bincount/np.average numpy 常用api(一) numpy 常用api(二) 一个函数提供 random_state 的关键字参数(keyw ...
- JavaScript常用工具方法
JavaScript常用工具方法 1.日期格式化 2.将日期字符串转换为Date,字符串格式为(yyyy-mm-dd hh:mm:ss) 3.JS获取当天00:00:00时间和23:59:59的时间 ...
- javascript 实用工具函数
整理日常开发中我们常常会使用到的一些工具函数. var utils = (function(){ var fay = {}; // 返回当前时间的毫秒数 fay.getTime = Date.now( ...
- javascript常用字符串函数和本地存储
concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a.conca ...
- javaScript常用工具库
对应于百度前端技术学院2015年春季的课程2相关内容 https://github.com/baidu-ife/ife/tree/master/2015_spring/task/task0002 ht ...
- 手写JavaScript常用的函数
一.bind.call.apply函数的实现 改变函数的执行上下文中的this指向,但不执行该函数(位于Function构造函数的原型对象上的方法) Function.prototype.myBind ...
随机推荐
- 【JAVA】学习路径35-InputStream使用例子
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; pu ...
- 尝试理解Linux容器进程与宿主机共享内核到底是什么意思?
背景 近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,但是用虚拟机则可以. ...
- C#实现HTTP访问类HttpHelper
在项目开发过程中,我们经常会访问第三方接口,如我们需要接入的第三方接口是Web API,这时候我们就需要使用HttpHelper调用远程接口了.示例中的HttpHelper类使用Log4Net记录了每 ...
- CDH6.2.0 搭建大数据集群
1. 资料准备 现在官网https://www.cloudera.com 需要注册账号,未来可能会收费等问题,十分麻烦,这里有一份我自己百度云的备份 链接: https://pan.baidu.com ...
- 手把手教你君正X2000开发板的OpenHarmony环境搭建
摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...
- 002从零开始入门Entity Framework Core——DbContext生存期、配置和初始化
阅读须知:本文为入门介绍.指引文章,所示代码皆为最简易(或仅为实现功能)的演示示例版本,不一定切实符合个人(企业)实际开发需求. 一.DbContext生存期 DbContext 的生存期从创建实例时 ...
- 输入法词库解析(六)QQ 拼音分类词库.qpyd
详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...
- 新开源HTML5单文件网页版ACME客户端,可在线申请Let's Encrypt、ZeroSSL免费HTTPS多域名通配符泛域名SSL/TLS证书(RSA/ECC/ECDSA)
目录 开源项目的起源 项目地址 使用方法 第一步:选择Let's Encrypt.ZeroSSL或其他证书颁发机构 第二步:证书配置,填写域名 第三步:完成域名所有权的验证 第四步:下载保存证书PEM ...
- Rust基本数据类型
基本类型 Rust 每个值都有其确切的数据类型,总的来说可以分为两类:基本类型和复合类型. 基本类型意味着它们往往是一个最小化原子类型,无法解构为其它类型(一般意义上来说),由以下组成: 数值类型: ...
- 【学习笔记】循环神经网络(RNN)
前言 多方寻找视频于博客.学习笔记,依然不能完全熟悉RNN,因此决定还是回到书本(<神经网络与深度学习>第六章),一点点把啃下来,因为这一章对于整个NLP学习十分重要,我想打好基础. 当然 ...