版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JS开发常用工具函数(小结)
1'isStatic:检测数据是不是除了symbol外的原始数据
functionisStatic(value)
{return(
typeofvalue==='string'||
typeofvalue==='number'||
typeofvalue==='boolean'||
typeofvalue==='undefined'||
value===null
)
)
2、isPrimitive:检测数据是不是原始数据
functionisPrimitive(value){
returnisStatic(value)||typeofvalue==='symbol'
)
3'isObject:判断数据是不是引用类型的数据(例如:arrays,functions,objects,regexes,newNumber(O)以及newStringf'))
functionisObject(value)
{lettype=typeofvalue;
returnvalue!=null&&(type=='object'||type=='function');
)
4'isObjectLike:检查value是否是类对象。如果一个值是类对象•那么它不应该是null•而且typeof后的结果是"object"
functionisObjectLike(value){
returnvalue!=null&&typeofvalue=='object';
)
5、getRawType:获取数据类型*返回结果为Number、String、Object、Array等
functiongetRawType(value){
returnOtotype.toString.call(value).slice(8,-1)
)
//getoRawType([])==>Array
6'isPlainObject:判断数据是不是Object类型的数据
functionisPlainObject(obj){
returnOtotype.toString.call(obj)==='[objectObject]'
)
7-isArray:判断数据是不是数组类型的数据
functionisArray(arr){
returnOtotype.toString.call(arr)==='[objectArray]'
)
将isArray挂载到Array上
Array.isArray=Array.isArray||isArray;
8'isRegExp:判断数据是不是正则对象
functionisRegExp(value){
returnOtotype.toString.call(value)==='[objectRegExp]'
)
9'isDate:判断数据是不是时间对象
functionisDate(value){
returnOtotype.toString.call(value)==='[objectDate]'
)
10、isNative:判断value是不是浏览器内置函数
内置函数toString后的主体代码块为mativecode]•而非内置函数则为相关代码,所以非内置函数可以进行拷贝(toString后掐
头去尾再由Function转)
functionisNative(value){
returntypeofvalue==='function'&&/nativecode/.test(value.toString())
11'isFunction:检查value是不是函数
functionisFunction(value){
returnOtotype.toString.call(value)==='[objectFunction]'
)
12'isLength:检查value是否为有效的类数组长度
functionisLength(value){
returntypeofvalue=='number'&&value>-1&&value%1==0&&value<=Number.MAX_SAFE_INTEGER;
)
13'isArrayLike:检查value是否是类数组
如果一个值被认为是类数组,那么它不是一个函数,并且value.length是个整数,大于等于0,小于或等于
Number.MAX_SAFE_INTEGER。这里字符串也将被当作类数组
functionisArrayLike(value){
returnvalue!=null&&isLength(value.length)&&!isFunction(value);
)
14'isEmpty:检查value是否为空
如果是null•直接返回true;如果是类数组■判断数据长度;如果是Object对象,判断是否具有属性;如果是其他数据•直接
返回false(也可改为返回true)
functionisEmpty(value)
{if(value==null)
{returntrue;
)
if(isArrayLike(value))
{returnIvalue.length;
}else
if(isPlainObject(value)){for
(letkeyinvalue){
if(hasOwnProperty.call(value,key))
{returnfalse;
)
)
returntrue;
)
returnfalse;
)
15-cached:记忆函数:缓存函数的运算结果
functioncached(fn){
letcache=Object.create(null);
returnfunctioncachedFn(str)
{lethit=cache[str];
returnhit||(cache[str]=fn(str))
)
)
16、camelize:横线转驼峰命名
letcamelizeRE=/-(\w)/g;
functioncamelize(str){
returnstr.replace(camelizeRE,function(_,c)
{returnc?c.toUpperCase():
))
}
//ab-cd-ef==>abCdEf
//使用记忆函数
let_camelize=cached(camelize)
17-hyphenate:驼峰命名转横线命名:拆分字符串,使用-相连•并且转换为小写
lethyphenateRE=AB([A-Z])/g;
functionhyphenate(str){
returnstr.replace(hyphenateRE,'-$1').toLowerCase()
//abCd==>ab-cd
〃使用记忆函数
let.hyphenate=cached(hyphenate);
18、capitalize:字符串首位大写
functioncapitalize(str){
returnstr.charAt(0).tollpperCase()+str.slice(l)
)
//abc==>Abe
〃使用记忆函数
letcapitalize=cached(capitalize)
19、extend:将属性混合到目标对象中
functionextend(to,_from)
{for(letkeyin_from)
{to[key]=_from[key];
)
returnto
)
20、Object.assign:对象属性复制,浅拷贝
Object.assign=Object.assign||function(){
if(arguments.length==0)thrownewTypeError('Cannotconvertundefinedornulltoobject*);
lettarget=arguments[0],
args=Atotype.slice.call(arguments,1),
key
args.forEach(function(item){for(
keyinitem){
item.hasOwnProperty(key)&&(target[key]=item[key])
}
})
returntarget
)
使用Object.assign可以浅克隆一个对象:
letclone=Object.assign({},target)
简单的深克隆可以使用JSON.parse()和JSON.stringify()•这两个api是解析json数据的•所以只能解析除symbol外的原始类型及
数组和对象
letclone=JSON.parse(JSON.stringify(target))
21'clone:克隆数据,可深度克隆
这里列出了原始类型•时间、正则、错误、数组、对象的克隆规则,其他的可自行补充
functionclone(value,
deep){if(isPrimitive(value)
){returnvalue
if(isArrayLike(value)){//是类数组
value=Atotype.slice.call(value)
returnvalue.map(item=>deep?clone(item,deep):item)
}elseif(isPlainObject(value)){//是对象
lettarget={},key;
for(keyinvalue){
value.hasOwnProperty(key)&&(target[key]=deep?clone(value[key],deep):value[key])
)
)
lettype=getRawType(value)
switch(type){c
ase'Date':
case'RegExp':
case'Error':value=newwindow[type](value);break;
)
returnvalue
22、识别各种浏览器及平台
//运行环境是浏览器
letinBrowser=typeofwindow!=='undefined';
〃运行环境是微信
letinWeex=typeofWXEnvironment!=='undefined'&&!!WXEnvironment.platform;
letweexPlatform=inWeex&&WXEnvironment.platform.toLowerCase();
〃浏览器UA判断
letUA=inBrowser&&window.navigator.userAgent.toLowerCase();
letislE=UA&&/msie|trident/.test(UA);
letislE9=UA&&UA.indexOfCmsie9.0')>0;
letisEdge=UA&&UA.indexOf('edge/')>0;
letisAndroid=(UA&&IIA.indexOf('android')>0)||(weexPlatform==='android');
letislOS=(UA&&/iphone|ipad|ipod|ios/.test(UA))||(weexPlatform===*ios');
letisChrome=UA&&ZchromeV\d+/.test(UA)&&JisEdge;
23'getExplorerlnfo:获取浏览器信息
functiongetExplorerlnfo(){
lett=navigator.userAgent.toLowerCase();
return0<=t.indexOf("msie")?{//ie<11
type:"IE",
version:Number(t.match(/msie([\d]+)/)[1])
}:!!t.match(/tridentV.+?rv:(([\d.]+))/)?{//ie11
type:"IE",
version:11
}:0<=t.indexOf("edge")?
{type:,'Edge';
version:Number(t.match(/edgeV([\d]+)/)[1])
}:0<=t.indexOf("firefox")?
{type:"Firefox",
version:Number(t.match(/firefoxV([\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("SafariM)?
{type:"Safari",
version:Number(t.match(/versionV((\d]+)/)[1])
):{
type:t,
version:-1
)
)
24、isPCBroswer:检测是否为PC端浏览器模式
functionisPCBroswer(){
lete=navigator.userAgent.toLowerCase()
,t="ipad"==e.match(/ipad/i)
,i=Miphone"==e.match(/iphone/i)
,r="midp”==e.match(/midp/i)
,n="rv:"==e.match(/rv:/i)
,a="ucweb"==e.match(/ucweb/i)
,o="android"==e.match(/android/i)
,s="windowsce"==e.match(/windowsce/i)
,I="windowsmobile"==e.match(/windowsmobile/i);
return!(t||i||r||n||a||o||s||I)
)
25、unique:数组去重•返回一个新数组
function
unique(arr){if(!isArrayLink(arr)){//不
是类数组对象returnarr
)
letresult=[]
letobjarr=口
letobj=Object.create(null)
arr.forEach(item=>{
if(isStatic(item)){//是除了symbol外的原始数据
letkey=item++getRawType(item);
if(!obj[key]){
obj[key]=true
result.push(item)
)
}else{//引用类型及symbol
if(!objarr.includes(item)){obja
rr.push(item)
result.push(item)
)
)
})
returnresulte
)
26、Set简单实现
window.Set=window.Set||(function()
{functionSet(arr){
this.items=arr?unique(arr):口;
this.size=this.items.length;//Array的大小
)
Stotype={
add:function(value){
//添加元素,若元素已存在,则跳过,返回Set结构本身。
if(Ithis.has(value))
{this.items.push(value);
this.size++;
)
returnthis;
},
clear:function(){
//清除所有成员•没有返回值。
this.items=[]
this.size=0
},
delete:function(value){
//删除某个值•返回一个布尔值•表示删除是否成功。
returnthis.items.some((v,i)=>{
if(v===
value){this.items.spl
ice(i,1)returntrue
)
returnfalse
})
},
has:function(value){
//返回一个布尔值,表示该值是否为Set的成员。
returnthis.items.some(v=>v===value)
},
values:function()
{returnthis.items
),
)
returnSet;
}());
27'repeat:生成一个重复的字符串,有n个str组成,可修改为填充为数组等
functionrepeat(str,n)
{letres=
while(n){
if(n%2===1){
res+=str;
)
if(n>1)
{str+=
str;
)
n»=1;
)
returnres
);
//repeat('123',3)==>123123123
28'dateFormater:格式化时间
functiondateFormater(formater,t){
letdate=t?newDate(t):newDate(),
Y=date.getFullYear()+",
M=date.getMonth()+1,
D=date.getDate(),
H=date.getHours(),
m=date.getMinutes(),
s=date.getSeconds();
returnformater.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?'O':U)+H)
.replace(/mm/g,(m<10?'O':H)+m)
.replace(/ss/g,(s<10?'O':")+s)
)
//dateFormater('YYYY-MM-DDt)==>2019-06-2618:30
//dateFormater('YYYYMMDDHHmm',t)==>201906261830
29dateStrForma:将指定字符串由一种时间格式转化为另一种
from的格式应对应str的位置
functiondateStrForma(str,from,to){
//'20190626''YYYYMMDD''YYYY^MM^DDB'
str+="
letY="
if(~(Y=
from.indexOf('YYYY'))){Y=
str.substr(Y,4)
to=to.replace(/YYYY|yyyy/g,Y)
}elseif(~(Y=
from.indexOf('YY'))){Y=
str.substr(Y,2)
to=to.replace(/YY|yy/g,Y)
letk,i
i=from.indexOf(s+s)
k=~i?str.substr(i,2):"
to=to.replace(s+s,k)
})
returnto
)
//dateStrForma('20190626','YYYYMMDD','YYYY^MM^DDS1)==>2019年06月26曰
//dateStrForma('121220190626','—YYYYMMDDTYYYY年MM月DD日)==>2019年06月26日
//(^尼$1尸0m12('2019年06月26日','丫丫丫丫年MM月DD日','YYYYMMDD')==>20190626
//一般的也可以使用正则来实现
"2019年06月26日」eplace(/(\d{4})年(\d{2})月(\d{2})日/,'$1-$2-$3')==>2019-06-26
30、getPropByPath:根据字符串路径获取对象属性:'obj[0].count,
functiongetPropByPath(obj,path,strict)
{lettempObj=obj;
path=path.replace(A[(\w+)\]/g,'.$1');//将[0]转化为.0
path=path.replace(/A\./,");//去除井头的.
letkeyArr=path.split。);//根据.切割
leti=0;
for(letlen=keyArr.length;i<len-1;++i)
{if(itempObj&&(strict)break;
letkey=keyArr[i];
if(keyintempObj){
tempObj=tempObj[key];
}else{
if(strict){//开启严格模式•没找到对应key值,抛出错误
thrownewError('pleasetransferavalidproppathtoformitem!');
)
break;
)
)
return{
o:tempObj,//原始数据
k:keyArrfi],//key值
v:tempObj?tempObj[keyAir[i]]:null//key值对应的值
};
};
31'GetUrlParam:获取Uri参数,返回一个对象
functionGetUrlParam(){
leturl=document.location.toStringO;
letarrObj=url.split("?H);
letparams=Object.create(null)
if(arrObj.length>1){
arrObj=arrObj[1].split(n&");
arrObj.forEach(item=>{ite
m=item.split(M=M);
params[item[O]]=item[1]
})
}
returnparams;
)
//?a=1&b=2&c=3==>{a:N1",b:"2",c:"3"}
32'downloadFile:base64数据导出文件•文件下载
functiondownloadFile(filename,data){
letDownloadLink=document.createElement('a');
if
(DownloadLink){document.body.appendChild(D
ownloadLink);DownloadLink.style='display:
none';DownloadLink.download=filename;
DownloadLink.href=data;
if(document.createEvent){
letDownloadEvt=document.createEvent('MouseEvents');
DownloadEvt.initEventCclick,,true,false);
DownloadLink.dispatchEvent(DownloadEvt);
}
elseif(document.createEventObject)
DownloadLink.fireEvent('onclick,);
elseif(typeofDownloadLink.onclick=='function')
DownloadLink.onclick();
document.body.removeChild(DownloadLink);
)
)
33'toFullScreen:全屏
functiontoFullScreen(){
letelem=document.body;
elem.webkitRequestFullScreen
elem.webkitRequestFullScreenO
:elem.mozRequestFullScreen
elem.mozRequestFullScreen()
:elem.msRequestFullscreen
elem.msRequestFullscreenO
:elem.requestFullScreen
elem.requestFullScreen()
:alert("浏览器不支持全屏");
}
34、exitFullscreen:退出全屏
functionexitFullscreen(){
letelem=parent.document;
elem.webkitCancelFullScreen
elem.webkitCancelFullScreen()
:elem.mozCancelFullScreen
elem.mozCancelFullScreenO
:elem.cancelFullScreen
elem.cancelFullScreen()
:elem.msExitFullscreen
elem.msExitFullscreen()
:elem.exitFullscreen
elem.exitFullscreen()
:alertf切换失败,可尝试Esc退出)
}
35、requestAnimationFrame:window动画
window.requestAnimationFrame=window.requestAnimationFrame||
window.webkitRequestAnimationFrame||
window.mozRequestAnimationFrame||
window.msRequestAnimationFrame||
window.oRequestAnimationFrame||
function(callback){
//为了使setTimteout的尽可能的接近每秒60帧的效果
window.setTimeout(callback,1000/60);
);
window.cancelAnimationFrame=window.cancelAnimationFrame||
Window.webkitCancelAnimationFrame||
window.mozCancelAnimationFrame||
window.msCancelAnimationFrame||
window.oCancelAnimationFrame||
function(id){
//为了使setTimteout的尽可能的接近每秒60帧的效果
window.clearTimeout(id);
}
36'JsNaN:检查数据是否是非数字值
原生的isNaN会把参数转换成数字(value。。,inull、true、false以及长度小于等于1的数组(元素为非NaN数据)会被转换成数字•
这不是我想要的。Symbol类型的数据不具有valueof接口,所以isNaN会抛出错误•这里放在后面•可避免错误
function_isNaN(v){
return!(typeofv==='string'||typeofv==='number1)||isNaN(v)
)
37、max:求取数组中非NaN数据中的最大值
functionmax(arr){
arr=arr.filter(item=>!JsNaN(item))
returnarr.length?Math.max.apply(null,arr):undefined
)
//max([1,2,'11',null,'fdf',[]])==>11
38-min:求取数组中非NaN数据中的最小值
functionmin(arr){
arr=arr.filter(item=>!_isNaN(item))
returnarr.length?Math.min.apply(null,arr):undefined
)
//min([1,2,'11',null,'fdf,[]])==>1
39'random:返回一个lower-upper之间的随机数
lower'upperS论正负与大小,但必须是券NaN的数据
functionrandom(lower,
upper){lower=+lower||0
upper=+upper||0
returnMath.random()*(upper-lower)+lower;
)
//random(0,0.5)==>0.3567039135734613
//random(2,1)===>1.6718418553475423
//random(-2,-1)==>-1.4474325452361945
40'Object.keys:返回一个由一个给定对象的自身可枚举属性组成的数组
Object.keys=Object.keys||functionkeys(object)
{if(object===null||object===undefined))
thrownewTypeError('Cannotconvertundefinedornulltoobject');
)
letresult=[]
if(isArrayLike(object)||
isPlainObject(object)){for(letkeyinobject){
object.hasOwnProperty(key)&&(result.push(key))
returnresult
}
41'Object.values:返回一个给定对象自身的所有可枚举属性值的数组
Object.values=Object.values||functionvalues(object)
{if(object===null||object===undefined)(
thrownewTypeError('Cannotconvertundefinedornulltoobject');
)
letresult=口
if(isArrayLike(object)||
isPlainObject(object)){for(letkeyinobject){
object.hasOwnProperty(key)&&(result.push(object[key]))
)
}
returnresult
42、arr.fill:使用value值来填充array-从start位置开始,至Uend位置结束(但不包含end位置)•返回原数组
Atotype.fill=Atotype.fill||functionfill(value,start,end)
{letctx=this
letlength=ctx.length;
start=parselnt(start)
if(isNaN(start)){
start=0
}elseif(start<0){
start="start>length?0:(length+start);
)
end=parselnt(end)
if(isNaN(end)||end>
length){end=length
}elseif(end<0)
{end+=length;
)
while(start<end)
{ctx[start++]=value;
)
returnctx;
)
//Array(3).fill(2)===>[2,2,2]
43'arr.includes:用来判断一个数组是否包含一个指定的值•如果是返回true•否则false•可指定开始查询的位置
Atotype.includes=Atotype.includes||functionincludes(value,
start){letctx=this
letlength=ctx.length;
start=parselnt(start)
if(isNaN(start)){
start=0
}elseif(start<0){
start=-start>length?0:(length+start);
)
letindex=ctx.indexOf(value)
returnindex>=start;
)
44、arr.find:返回数组中通过测试(函数fn内判断)的第一个元素的值
Atotype.find=Atotype.find||functionfind(fn,
ctx){fn=fn.bind(ctx)
letresult;
this.some((value,index,arr),thisValue)=>{
returnfn(value,index,arr)?(result=value,true):false
})
returnresult
45、arr.findlndex:返回数组中通过测试(函数fn内判断)的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47179-2026科普教育基地服务基本要求
- 婴幼儿口腔护理与亲子互动
- 甘肃省武威市凉州区洪祥中学2026届初三第十七次模拟考试数学试题含解析
- 江苏省苏州市姑苏区2026届初三下学期统练(五)数学试题试卷含解析
- 黑龙江省哈尔滨第六十九中学2026届高一年级5月学情调研数学试题试卷含解析
- 贵州遵义市正安县2025-2026学年初三下学期三模考试数学试题含解析
- 湖北恩施沐抚大峡谷重点达标名校2026届初三下学期期中(第三次月考)考试数学试题含解析
- 广东省汕头市潮南区2025-2026学年初三下学期第二次阶段考试数学试题含解析
- 广东省广州市番禺区广博校2026年初三教学质量调研(四模)考试物理试题含解析
- 公司研发部绩效考核制度
- 社会组织法律风险防范指南
- Web服务版本发布规范
- HJ349-2023环境影响评价技术导则陆地石油天然气开发建设项目
- GB/T 2423.21-2025环境试验第2部分:试验方法试验M:低气压
- 留园完整版本
- 建设工程工程量清单计价标准(2024版)
- 2025新热处理工程师考试试卷及答案
- 《数智时代下的供应链管理:理论与实践》课件 第1-7章 理解供应链- 供应链经典的生产计划
- 知情同意告知培训
- 江苏单招试题题库及答案
- 废旧空桶处置合同协议
评论
0/150
提交评论