js常用代碼段整理
更新時間:2011年11月30日 22:27:06 作者:
以下是平時收集的幾個常用代碼段,大多數(shù)是從網(wǎng)上搜集而來。也均為未找到是誰誰原創(chuàng),是否允許轉(zhuǎn)載等要求, 所以如果看到的朋友發(fā)現(xiàn)其中有些代碼是自己寫的,還請?jiān)徳谙罗D(zhuǎn)帖出來
每段代碼前邊都有功能注解和參數(shù)要求等說明文字,難度不大也就沒做更多注釋。 為看得清楚,這里依先后順序做個小目錄:
重寫window.setTimeout,
理解遞歸程序的返回規(guī)律,
截取長字符串,
取得元素在頁面中的絕對位置,
統(tǒng)計(jì)、去除重復(fù)字符(多種方法實(shí)現(xiàn)),
把有序的數(shù)組元素隨機(jī)打亂(多種方法實(shí)現(xiàn))。
/*
功能:修改 window.setTimeout,使之可以傳遞參數(shù)和對象參數(shù) (同樣可用于setInterval)
使用方法: setTimeout(回調(diào)函數(shù),時間,參數(shù)1,...,參數(shù)n) (FF已經(jīng)原生支持,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); /**//*
功能:理解遞歸程序的返回規(guī)律(從內(nèi)到外)
對象之間成員的互引用
*/
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
alert(ninja.yell(4))//結(jié)果為:hiyaaaa;
var samurai = { yell: ninja.yell };
//var ninja = {}; // 此處 注釋與否 對結(jié)果有影響
try {
alert(samurai.yell(4));
} catch(e){
alert("Uh, this isn't good! Where'd ninja.yell go?" );
} /** 功能:截取長字符串
* @param {string} str 要截取的字符串
* @param {number} size 截取長度(單字節(jié)長度)
*/
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);
}/**//*
功能:統(tǒng)計(jì)、去除重復(fù)字符
@param str 需要統(tǒng)計(jì)的字符串
說明:常用于字符串中重復(fù)字符,或者數(shù)組中重復(fù)的字母、數(shù)字等個數(shù)統(tǒng)計(jì)。
此處從網(wǎng)上收集兩種典型的類型,分別有兩種實(shí)現(xiàn)方法,其他還有許多變種,從不同角度編寫,可搜索學(xué)習(xí)。 待統(tǒng)計(jì)的數(shù)據(jù),不論是數(shù)組和字符串都可以,只用借助String.split()或 Array.join()
轉(zhuǎn)換為函數(shù)參數(shù)要求的類型即可。
*/ // 類型一:借助新建對象來保存數(shù)據(jù)
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 + "次數(shù):" + maxCount;
}function s_0(a) { // 此處參數(shù)應(yīng)為數(shù)組類型
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;
}// 類型二:正則表達(dá)式匹配統(tǒng)計(jì)
var count2 = function (str) {
var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重復(fù)字符
most = most.sort(function (a, b) { return a.length - b.length }).pop(); //按出現(xiàn)頻繁排序
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;
}/**//*
功能:把有序數(shù)組打亂(產(chǎn)生無序隨機(jī)數(shù)組)
說明:基本的排序算法大家應(yīng)該都很清楚。但是在編程中也經(jīng)常用到相反的操作,即把原來有序的數(shù)組元素隨機(jī)打亂。
以下給出三種方法,第一種是以前我自己寫出來的,由于水平差,寫出的代碼時間復(fù)雜度太大,
于是從網(wǎng)上搜索一些簡單而且效率高的方法來。
第二種據(jù)說是“洗牌算法”,想必很多人都聽說過;
第三種是利用JS的內(nèi)置sort方法,這種實(shí)現(xiàn)起來很簡單。
*/
// 方法1(給大家做失敗的教訓(xùn)借鑒)
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)之間的隨機(jī)數(shù),把它們做下標(biāo)的兩個元素交換位置(這樣亂序效率高)
/* 說明:這是“洗牌算法” 有人證明打亂的效果如下:
隨機(jī)交換nums/2次的效果很差,平均約1/3的對象還在原來的位置
隨機(jī)交換nums次才基本可用,平均約15%的對象還在原來的位置
隨機(jī)交換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:
// 讓比較函數(shù)隨機(jī)傳回-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);
重寫window.setTimeout,
理解遞歸程序的返回規(guī)律,
截取長字符串,
取得元素在頁面中的絕對位置,
統(tǒng)計(jì)、去除重復(fù)字符(多種方法實(shí)現(xiàn)),
把有序的數(shù)組元素隨機(jī)打亂(多種方法實(shí)現(xiàn))。
復(fù)制代碼 代碼如下:
/*
功能:修改 window.setTimeout,使之可以傳遞參數(shù)和對象參數(shù) (同樣可用于setInterval)
使用方法: setTimeout(回調(diào)函數(shù),時間,參數(shù)1,...,參數(shù)n) (FF已經(jīng)原生支持,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); /**//*
功能:理解遞歸程序的返回規(guī)律(從內(nèi)到外)
對象之間成員的互引用
*/
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
alert(ninja.yell(4))//結(jié)果為:hiyaaaa;
var samurai = { yell: ninja.yell };
//var ninja = {}; // 此處 注釋與否 對結(jié)果有影響
try {
alert(samurai.yell(4));
} catch(e){
alert("Uh, this isn't good! Where'd ninja.yell go?" );
} /** 功能:截取長字符串
* @param {string} str 要截取的字符串
* @param {number} size 截取長度(單字節(jié)長度)
*/
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);
}/**//*
功能:統(tǒng)計(jì)、去除重復(fù)字符
@param str 需要統(tǒng)計(jì)的字符串
說明:常用于字符串中重復(fù)字符,或者數(shù)組中重復(fù)的字母、數(shù)字等個數(shù)統(tǒng)計(jì)。
此處從網(wǎng)上收集兩種典型的類型,分別有兩種實(shí)現(xiàn)方法,其他還有許多變種,從不同角度編寫,可搜索學(xué)習(xí)。 待統(tǒng)計(jì)的數(shù)據(jù),不論是數(shù)組和字符串都可以,只用借助String.split()或 Array.join()
轉(zhuǎn)換為函數(shù)參數(shù)要求的類型即可。
*/ // 類型一:借助新建對象來保存數(shù)據(jù)
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 + "次數(shù):" + maxCount;
}function s_0(a) { // 此處參數(shù)應(yīng)為數(shù)組類型
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;
}// 類型二:正則表達(dá)式匹配統(tǒng)計(jì)
var count2 = function (str) {
var most = str.split('').sort().join('').match(/(.)\1*/g); //排列重復(fù)字符
most = most.sort(function (a, b) { return a.length - b.length }).pop(); //按出現(xiàn)頻繁排序
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;
}/**//*
功能:把有序數(shù)組打亂(產(chǎn)生無序隨機(jī)數(shù)組)
說明:基本的排序算法大家應(yīng)該都很清楚。但是在編程中也經(jīng)常用到相反的操作,即把原來有序的數(shù)組元素隨機(jī)打亂。
以下給出三種方法,第一種是以前我自己寫出來的,由于水平差,寫出的代碼時間復(fù)雜度太大,
于是從網(wǎng)上搜索一些簡單而且效率高的方法來。
第二種據(jù)說是“洗牌算法”,想必很多人都聽說過;
第三種是利用JS的內(nèi)置sort方法,這種實(shí)現(xiàn)起來很簡單。
*/
// 方法1(給大家做失敗的教訓(xùn)借鑒)
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)之間的隨機(jī)數(shù),把它們做下標(biāo)的兩個元素交換位置(這樣亂序效率高)
/* 說明:這是“洗牌算法” 有人證明打亂的效果如下:
隨機(jī)交換nums/2次的效果很差,平均約1/3的對象還在原來的位置
隨機(jī)交換nums次才基本可用,平均約15%的對象還在原來的位置
隨機(jī)交換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:
// 讓比較函數(shù)隨機(jī)傳回-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);
相關(guān)文章
小程序自定義tabbar導(dǎo)航欄及動態(tài)控制tabbar功能實(shí)現(xiàn)方法(uniapp)
在項(xiàng)目中遇到一個需求,根據(jù)不同的賬號,生成不同的tabBar,下面這篇文章主要給大家介紹了關(guān)于小程序自定義tabbar導(dǎo)航欄及動態(tài)控制tabbar功能實(shí)現(xiàn)方法(uniapp)的相關(guān)資料,需要的朋友可以參考下2022-12-12Javascript 構(gòu)造函數(shù),公有,私有特權(quán)和靜態(tài)成員定義方法
其中公有方法聲明的部分采用的兩種方式,在實(shí)際應(yīng)用中一般采取一種方式就可以了,如果兩種方式都要采用的話,應(yīng)注意順序,防止前面寫的方法被清空或覆蓋。2009-11-11JavaScript獲取對象在頁面中位置坐標(biāo)的方法
這篇文章主要介紹了JavaScript獲取對象在頁面中位置坐標(biāo)的方法,涉及JavaScript操作頁面元素屬性的相關(guān)技巧,需要的朋友可以參考下2016-02-02微信小程序動態(tài)添加和刪除組件的現(xiàn)實(shí)
這篇文章主要介紹了微信小程序動態(tài)添加和刪除組件的現(xiàn)實(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02