js常用代码段收集

 更新时间:2011年10月28日 23:47:55   作者:  
以下是平时收集的几个常用代码段,大多数是从网上搜集而来。也均为未找到是谁谁原创,是否允许转载等要求, 所以如果看到的朋友发现其中有些代码是自己写的,还请原谅在下转帖出来。
每段代码前边都有功能注解和参数要求等说明文字,难度不大也就没做更多注释。 为看得清楚,这里依先后顺序做个小目录:
重写window.setTimeout,
理解递归程序的返回规律,
截取长字符串,
取得元素在页面中的绝对位置,
统计、去除重复字符(多种方法实现),
把有序的数组元素随机打乱(多种方法实现)。

复制代码 代码如下:

/*
功能:修改 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?" );
}

/** 功能:截取长字符串
* @param {string} str 要截取的字符串
* @param {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));

/**//*
功能:取得元素在页面中的绝对位置(相对于页面左上角)
@param {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);
}

/**//*
功能:统计、去除重复字符
@param 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);

相关文章

  • Bootstrap模态对话框用法简单示例

    Bootstrap模态对话框用法简单示例

    这篇文章主要介绍了Bootstrap模态对话框用法,结合实例形式分析了Bootstrap模态对话框的简单创建与使用操作技巧,需要的朋友可以参考下
    2018-08-08
  • 有关suggest快速删除后仍然出现下拉列表的bug问题

    有关suggest快速删除后仍然出现下拉列表的bug问题

    写suggest的时候,有时我们快速删除输入框的文字后,但是suggest下拉列表还有出现,导致的原因是因为ajax异步请求造成的,下面通过本文给大家分享下解决方法,感兴趣的朋友一起看看
    2016-12-12
  • JS中作用域和变量提升(hoisting)的深入理解

    JS中作用域和变量提升(hoisting)的深入理解

    相信大家也都发现了,在网上关于JS的变量和作用域的文章有很多,但真正能讲清楚,能深入理解的文章很少。在阅读了很多人的文章以后,我决定综合起来,结合实际代码,希望能够以一个比较清楚完整的方式让大家真正理解。有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 解决Layui数据表格显示无数据提示的问题

    解决Layui数据表格显示无数据提示的问题

    今天小编就为大家分享一篇解决Layui数据表格显示无数据提示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 通过js示例讲解时间复杂度与空间复杂度

    通过js示例讲解时间复杂度与空间复杂度

    这篇文章主要给大家介绍了关于如何通过js示例讲解时间复杂度与空间复杂度的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • JS中mouseover和mouseout多次触发问题如何解决

    JS中mouseover和mouseout多次触发问题如何解决

    这篇文章主要介绍了JS中mouseover和mouseout多次触发问题如何解决的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • javascript克隆元素样式的实现代码

    javascript克隆元素样式的实现代码

    这是一个实验用的玩意,它可以克隆指定元素的最终样式,并包装成一个css类,它还可以证明Oprea 11.10 是个混球
    2011-10-10
  • 浅谈bootstrap使用中的一些问题以及解决过程

    浅谈bootstrap使用中的一些问题以及解决过程

    下面小编就为大家带来一篇浅谈bootstrap使用中的一些问题以及解决过程。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 关于js里的this关键字的理解

    关于js里的this关键字的理解

    this关键字相信大家都非常熟悉,js中提供的this关键在要比oo语言中混乱,下面通过本文给大家介绍js里this关键字的理解,需要的朋友可以参考下
    2015-08-08
  • JS自定义函数实现时间戳转换成date的方法示例

    JS自定义函数实现时间戳转换成date的方法示例

    这篇文章主要介绍了JS自定义函数实现时间戳转换成date的方法,结合具体实例形式分析了javascript时间戳与日期格式的计算与转换相关操作技巧,需要的朋友可以参考下
    2017-08-08

最新评论