站三界导航
首页 JS代码JavaScript常用代码段

JavaScript常用代码段

  • JS代码
  • 来源:站三界导航
  • 154阅读
  • 2022-05-04

功能:修改 window.setTimeout,使之可以传递参数和对象参数 (同样可用于setInterval)  

使用方法:  setTimeout(回调函数,时间,参数1,...,参数n) (FF已经原生支持,IE不支持)


var  __sto  =  setTimeout;    
window.setTimeout  =  function(callback,timeout,param){    
    var  args  =  Array.prototype.slice.call(arguments,2);    
    var  _cb  =  function(){    
            callback.apply(null,args);    
    }    
    __sto(_cb,timeout);    
}    
function  aaaaa(a,b,c){    
    alert(a  +  b  +  c);    
}          
window.setTimeout(aaaaa,2000,5,6,7); 

功能:理解递归程序的返回规律(从内到外) 
对象之间成员的互引用



var ninja = { 
    yell: function(n){ 
        return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
    } 
}; 
alert(ninja.yell(4))//结果为:hiyaaaa;
var samurai = { yell: ninja.yell }; 
//var ninja = {}; // 此处 注释与否 对结果有影响
try { 
       alert(samurai.yell(4)); 
} catch(e){ 
       alert("Uh, this isn't good! Where'd ninja.yell go?" ); 
} 

功能:截取长字符串
{string} str 要截取的字符串
{number} size 截取长度(单字节长度)
var subStr = function(str, size){
    var curSize = 0, arr = [];
    for(var i = 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){
                return arr.join('');
            }
        }else{
            curSize++;
            if(size === curSize){
                return arr.join('');
            }
        }
    }
};
var str = '#%*……&#什么东西1234abcd 还不够长';
alert(str.length);
alert(str.substr(0, 15));
alert(subStr(str, 15));

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

功能:统计、去除重复字符 
str 需要统计的字符串
说明:常用于字符串中重复字符,或者数组中重复的字母、数字等个数统计。
此处从网上收集两种典型的类型,分别有两种实现方法,其他还有许多变种,从不同角度编写,可搜索学习。
待统计的数据,不论是数组和字符串都可以,只用借助String.split()或 Array.join()
转换为函数参数要求的类型即可。 
  

类型一:借助新建对象来保存数据


var count1 = function (str) {
    var map = {}, maxCount = 0, maxChar, undefined, i = str.length;
    while (i--) {
        var t = str.charAt(i);
        map[t] == undefined ? map[t] = 1 : map[t] += 1;
        if (map[t] > maxCount) {
            maxChar = t;
            maxCount = map[maxChar];
        }
    }
    return "字符:" + maxChar + "次数:" + maxCount;
}

function s_0(a) { // 此处参数应为数组类型
    var b = {}, c = [], i;
    for (i = 0; i < a.length; i++){
        if (!b[a[i]]) {
            c[c.length] = a[i], b[a[i]] = true;
        }
    }
    return c;
}
类型二:正则表达式匹配统计


var count2 = function (str) {
    var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重复字符
    most = most.sort(function (a, b) { return a.length - b.length }).pop(); //按出现频繁排序
    return most.length + ': ' + most[0];
}

function s_1(a) {
    var a = a.join(""), b = [];
    while (a.length > 0)
            a = a.replace(new RegExp((b[b.length] = a.charAt(0)), "g"), "");
    return b;
}

功能:把有序数组打乱(产生无序随机数组)
说明:基本的排序算法大家应该都很清楚。但是在编程中也经常用到相反的操作,即把原来有序的数组元素随机打乱。
以下给出三种方法,第一种是以前我自己写出来的,由于水平差,写出的代码时间复杂度太大,
于是从网上搜索一些简单而且效率高的方法来。
第二种据说是“洗牌算法”,想必很多人都听说过;
第三种是利用JS的内置sort方法,这种实现起来很简单。
 
方法1(给大家做失败的教训借鉴)


function randArray(num) {
    var rands = [];
    var ra = parseInt(num * Math.random());
    rands.push(ra);
    for (var r = 0; r < num - 1; r++) {
        ra = parseInt(num * Math.random());
        for (var m = 0; m < rands.length; m++) {
            while (rands[m] == ra) {
                ra = parseInt(num * Math.random());
                m = -1;
            }
        }
        rands.push(ra);
    }
    //alert(rands);
    return rands;     
}

方法2:

选择两个[0...array.Length)之间的随机数,把它们做下标的两个元素交换位置(这样乱序效率高)

说明:这是“洗牌算法” 有人证明打乱的效果如下:
随机交换nums/2次的效果很差,平均约1/3的对象还在原来的位置
随机交换nums次才基本可用,平均约15%的对象还在原来的位置

随机交换nums*2次才真正可用,平均约2%的对象还在原来的位置

function daluan(nums) {
    var array=[];
    for (var i = 0; i < nums; i++) {
        array[i] = i;
    }
    for (var i = 0; i < nums; i++) {
        var rand = parseInt(nums * Math.random());
        var temp = array[i];
        array[i] = array[rand];
        array[rand] = temp;
    }
    return array;
}        
方法3:

让比较函数随机传回-1或1就可以了(这样乱序效率可能不高)
var testArray3=[1,2,3,4,5,6,7,8,9,10,22,33,55,77,88,99]; 
testArray3.sort(function(){return Math.random()>0.5?-1:1;}); 
alert(testArray3); 


本文结束
本文来自投稿,不代表站三界导航立场,如若转载,请注明出处:https://www.zhansanjie.com/article/details/8302.html

版权声明:

1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

2、本站仅提供信息发布平台,不承担相关法律责任。

3、若侵犯您的版权或隐私,请联系本站管理员删除。

4、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。

分享
站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。