zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js常用代码段收集

JS 常用 收集 代码段
2023-06-13 09:14:31 时间
每段代码前边都有功能注解和参数要求等说明文字,难度不大也就没做更多注释。为看得清楚,这里依先后顺序做个小目录:
重写window.setTimeout,
理解递归程序的返回规律,
截取长字符串,
取得元素在页面中的绝对位置,
统计、去除重复字符(多种方法实现),
把有序的数组元素随机打乱(多种方法实现)。

复制代码代码如下:

/*
功能:修改window.setTimeout,使之可以传递参数和对象参数(同样可用于setInterval)
使用方法:setTimeout(回调函数,时间,参数1,...,参数n)(FF已经原生支持,IE不支持)
*/
var__sto=setTimeout;
window.setTimeout=function(callback,timeout,param){
varargs=Array.prototype.slice.call(arguments,2);
var_cb=function(){
callback.apply(null,args);
}
__sto(_cb,timeout);
}
functionaaaaa(a,b,c){
alert(a+b+c);
}
window.setTimeout(aaaaa,2000,5,6,7);

/**//*
功能:理解递归程序的返回规律(从内到外)
对象之间成员的互引用
*/
varninja={
yell:function(n){
returnn>0?ninja.yell(n-1)+"a":"hiy";
}
};
alert(ninja.yell(4))//结果为:hiyaaaa;
varsamurai={yell:ninja.yell};
//varninja={};//此处注释与否对结果有影响
try{
alert(samurai.yell(4));
}catch(e){
alert("Uh,thisisn"tgood!Where"dninja.yellgo?");
}

/**功能:截取长字符串
*@param{string}str要截取的字符串
*@param{number}size截取长度(单字节长度)
*/
varsubStr=function(str,size){
varcurSize=0,arr=[];
for(vari=0,len=str.length;i<len;i++){
arr.push(str.charAt(i));
if(str.charCodeAt(i)>255){
curSize+=2;
if(size===curSize||size===curSize-1){
returnarr.join("");
}
}else{
curSize++;
if(size===curSize){
returnarr.join("");
}
}
}
};
varstr="#%*……什么东西1234abcd还不够长";
alert(str.length);
alert(str.substr(0,15));
alert(subStr(str,15));

/**//*
功能:取得元素在页面中的绝对位置(相对于页面左上角)
@param{string}node待求位置的DOM元素
*/
functiongetAbsPosition(node){
vart=node.offsetTop;
varl=node.offsetLeft;
while(node=node.offsetParent){
t+=node.offsetTop;
l+=node.offsetLeft;
}
alert("top="+t+"\n"+"left="+l);
}

/**//*
功能:统计、去除重复字符
@paramstr需要统计的字符串
说明:常用于字符串中重复字符,或者数组中重复的字母、数字等个数统计。
此处从网上收集两种典型的类型,分别有两种实现方法,其他还有许多变种,从不同角度编写,可搜索学习。
待统计的数据,不论是数组和字符串都可以,只用借助String.split()或Array.join()
转换为函数参数要求的类型即可。
*/
//类型一:借助新建对象来保存数据
varcount1=function(str){
varmap={},maxCount=0,maxChar,undefined,i=str.length;
while(i--){
vart=str.charAt(i);
map[t]==undefined?map[t]=1:map[t]+=1;
if(map[t]>maxCount){
maxChar=t;
maxCount=map[maxChar];
}
}
return"字符:"+maxChar+"次数:"+maxCount;
}
functions_0(a){//此处参数应为数组类型
varb={},c=[],i;
for(i=0;i<a.length;i++){
if(!b[a[i]]){
c[c.length]=a[i],b[a[i]]=true;
}
}
returnc;
}
//类型二:正则表达式匹配统计
varcount2=function(str){
varmost=str.split("").sort().join("").match(/(.)\1*/g);//排列重复字符
most=most.sort(function(a,b){returna.length-b.length}).pop();//按出现频繁排序
returnmost.length+":"+most[0];
}
functions_1(a){
vara=a.join(""),b=[];
while(a.length>0)
a=a.replace(newRegExp((b[b.length]=a.charAt(0)),"g"),"");
returnb;
}

/**//*
功能:把有序数组打乱(产生无序随机数组)
说明:基本的排序算法大家应该都很清楚。但是在编程中也经常用到相反的操作,即把原来有序的数组元素随机打乱。
以下给出三种方法,第一种是以前我自己写出来的,由于水平差,写出的代码时间复杂度太大,
于是从网上搜索一些简单而且效率高的方法来。
第二种据说是“洗牌算法”,想必很多人都听说过;
第三种是利用JS的内置sort方法,这种实现起来很简单。
*/
//方法1(给大家做失败的教训借鉴)
functionrandArray(num){
varrands=[];
varra=parseInt(num*Math.random());
rands.push(ra);
for(varr=0;r<num-1;r++){
ra=parseInt(num*Math.random());
for(varm=0;m<rands.length;m++){
while(rands[m]==ra){
ra=parseInt(num*Math.random());
m=-1;
}
}
rands.push(ra);
}
//alert(rands);
returnrands;
}
//方法2:
//选择两个[0...array.Length)之间的随机数,把它们做下标的两个元素交换位置(这样乱序效率高)
/*说明:这是“洗牌算法”有人证明打乱的效果如下:
随机交换nums/2次的效果很差,平均约1/3的对象还在原来的位置
随机交换nums次才基本可用,平均约15%的对象还在原来的位置
随机交换nums*2次才真正可用,平均约2%的对象还在原来的位置
*/
functiondaluan(nums){
vararray=[];
for(vari=0;i<nums;i++){
array[i]=i;
}
for(vari=0;i<nums;i++){
varrand=parseInt(nums*Math.random());
vartemp=array[i];
array[i]=array[rand];
array[rand]=temp;
}
returnarray;
}
//方法3:
//让比较函数随机传回-1或1就可以了(这样乱序效率可能不高)
vartestArray3=[1,2,3,4,5,6,7,8,9,10,22,33,55,77,88,99];
testArray3.sort(function(){returnMath.random()>0.5?-1:1;});
alert(testArray3);