JavaScript性能陷阱小結(jié)(附實(shí)例說(shuō)明)
更新時(shí)間:2010年12月28日 15:26:20 作者:
JavaScript陷阱太多,因此我們得步步為營(yíng),下面這些點(diǎn),相信很多同學(xué)都會(huì)遇到,希望朋友們多注意下。JavaScript陷阱太多,因此我們得步步為營(yíng),下面是一些常見(jiàn)的影響性能的陷阱。
1.避免使用eval或者Function構(gòu)造函數(shù)
2.避免使用with
3.不要在性能要求關(guān)鍵的函數(shù)中使用try-catch-finally
4.避免使用全局變量
5.避免在性能要求關(guān)鍵的函數(shù)中使用for-in
6.使用字符串累加計(jì)算風(fēng)格
7.原操作會(huì)比函數(shù)調(diào)用快
8.設(shè)置setTimeout() 和 setInterval() 時(shí)傳遞函數(shù)名而不是字符串
9.避免在對(duì)象中使用不需要的DOM引用
10.最清晰的目標(biāo)速度,最小化作用域鏈
11.試著在腳本中少使用注釋,避免使用長(zhǎng)變量名
12.在當(dāng)前作用域存儲(chǔ)應(yīng)用的外部變量
13.使用變量緩存值
1.避免使用eval或者Function構(gòu)造函數(shù)
使用eval或者Function構(gòu)造函數(shù)的代價(jià)是非常昂貴的,每次都需要腳本引擎轉(zhuǎn)換源代碼到可執(zhí)行代碼。
此外,使用eval處理字符串必須在運(yùn)行時(shí)解釋。
運(yùn)行緩慢的代碼:
function addMethod(object, property, code) {
object[property] = new Function(code);
}
addMethod(myObj, 'methodName', 'this.localVar=foo');
運(yùn)行更快的代碼:
function addMethod(object, property, func) {
object[property] = func;
}
addMethod(myObj, 'methodName', function () { 'this.localVar=foo'; });
2.避免使用with
盡管很方便,with需要附加的查找引用時(shí)間,因?yàn)樗诰幾g的時(shí)候并不知道作用域的上下沒(méi)。
運(yùn)行緩慢的代碼:
with (test.object) {
foo = 'Value of foo property of object';
bar = 'Value of bar property of object';
}
運(yùn)行更快的代碼:
var myObj = test.object;
myObj.foo = 'Value of foo property of object';
myObj.bar = 'Value of bar property of object';
3.不要在性能要求關(guān)鍵的函數(shù)中使用try-catch-finally
try-catch-finally在運(yùn)行時(shí)每次都會(huì)在當(dāng)前作用域創(chuàng)建一個(gè)新的變量,用于分配語(yǔ)句執(zhí)行的異常。
異常處理應(yīng)該在腳本的高層完成,在異常不是很頻繁發(fā)生的地方,比如一個(gè)循環(huán)體的外面。
如果可能,盡量完全避免使用try-catch-finally。
運(yùn)行緩慢的代碼:
var object = ['foo', 'bar'], i;
for (i = 0; i < object.length; i++) {
try {
// do something that throws an exception
} catch (e) {
// handle exception
}
}
運(yùn)行更快的代碼:
var object = ['foo', 'bar'], i;
try {
for (i = 0; i < object.length; i++) {
// do something
}
} catch (e) {
// handle exception
}
4.避免使用全局變量
如果你在一個(gè)函數(shù)或者其它作用域中使用全局變量,腳本引擎需要遍歷整個(gè)作用域去查找他們。
全局作用域中的變量在腳本的生命周期里都存在,然后局部范圍的會(huì)在局部范圍失去的時(shí)候被銷毀。
運(yùn)行緩慢的代碼:
var i,
str = '';
function globalScope() {
for (i=0; i < 100; i++) {
str += i; // here we reference i and str in global scope which is slow
}
}
globalScope();
運(yùn)行更快的代碼:
function localScope() {
var i,
str = '';
for (i=0; i < 100; i++) {
str += i; // i and str in local scope which is faster
}
}
localScope();
5.避免在性能要求關(guān)鍵的函數(shù)中使用for-in
for-in循環(huán)需要腳本引擎建立一張所有可枚舉屬性的列表,并檢查是否與先前的重復(fù)。
如果你的for循環(huán)作用域中的代碼沒(méi)有修改數(shù)組,可以預(yù)先計(jì)算好數(shù)組的長(zhǎng)度用于在for循環(huán)中迭代數(shù)組。
運(yùn)行緩慢的代碼:
var sum = 0;
for (var i in arr) {
sum += arr[i];
}
運(yùn)行更快的代碼:
var sum = 0;
for (var i = 0, len = arr.length; i < len; i++) {
sum += arr[i];
}
6.使用字符串累加計(jì)算風(fēng)格
使用+運(yùn)算會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的字符串并把連接的值賦給它。僅僅是將這個(gè)結(jié)果賦值給一個(gè)變量。
為了避免連接結(jié)果的中間變量,可以使用+=來(lái)直接賦值結(jié)果。
運(yùn)行緩慢的代碼:
a += 'x' + 'y';
運(yùn)行更快的代碼:
a += 'x'; a += 'y';
7.原操作會(huì)比函數(shù)調(diào)用快
可以考慮在性能要求關(guān)鍵的循環(huán)和函數(shù)中使用可以替代的原操作。
運(yùn)行緩慢的代碼:
var min = Math.min(a, b);
arr.push(val);
運(yùn)行更快的代碼:
var min = a < b ? a : b;
arr[arr.length] = val;
8.設(shè)置setTimeout() 和 setInterval() 時(shí)傳遞函數(shù)名而不是字符串
如果你傳遞一個(gè)字符串到setTimeout() 或者 setInterval()中,字符串將會(huì)被eval計(jì)算而導(dǎo)致緩慢。
使用一個(gè)匿名函數(shù)包裝來(lái)代替,這樣在編譯的時(shí)候就可以被解釋和優(yōu)化。
運(yùn)行緩慢的代碼:
setInterval('doSomethingPeriodically()', 1000);
setTimeOut('doSomethingAfterFiveSeconds()', 5000);
運(yùn)行更快的代碼:
setInterval(doSomethingPeriodically, 1000);
setTimeOut(doSomethingAfterFiveSeconds, 5000);
9.避免在對(duì)象中使用不需要的DOM引用
不要這么做:
var car = new Object();
car.color = "red";
car.type = "sedan"
更好的一種形式:
var car = {
color : "red";
type : "sedan"
}
10.最清晰的目標(biāo)速度,最小化作用域鏈
低效率方法:
var url = location.href;
一種高效形式:
var url = window.location.href;
11.試著在腳本中少使用注釋,避免使用長(zhǎng)變量名
盡可能的保證注釋少或者避免使用注釋,特別是在函數(shù),循環(huán)以及數(shù)組中。
注釋不必要的減緩腳本執(zhí)行并且增加了文件大小。比如:
不建議的形式:
function someFunction()
{
var person_full_name="somename"; /* stores the full name*/
}
更好的寫法:
function someFunction()
{
var name="somename";
}
12.在當(dāng)前作用域存儲(chǔ)應(yīng)用的外部變量
當(dāng)一個(gè)函數(shù)被執(zhí)行的運(yùn)行上下問(wèn)被穿件,一個(gè)活動(dòng)的對(duì)象會(huì)包含所有局部變量會(huì)被推到上下文鏈的前面。
在作用域鏈中,最慢的是清楚的識(shí)別標(biāo)識(shí)符,意味著局部變量是最快的。存儲(chǔ)頻繁使用的外部變量讀和寫都會(huì)明顯的加快。這對(duì)于全局變量和其他深層次的標(biāo)識(shí)符查找特別明顯。
同樣,在當(dāng)前作用域中的變量(var myVar)比對(duì)象像屬性的訪問(wèn)速度快(this.myVar)。
運(yùn)行緩慢的代碼:
function doSomething(text) {
var divs = document.getElementsByTagName('div'),
text = ['foo', /* ... n ... */, 'bar'];
for (var i = 0, l = divs.length; i < l; i++) {
divs[i].innerHTML = text[i];
}
}
運(yùn)行更快的代碼:
function doSomethingFaster(text) {
var doc = document,
divs = doc.getElementsByTagName('div'),
text = ['foo', /* ... n ... */, 'bar'];
for (var i = 0, l = divs.length; i < l; i++) {
divs[i].innerHTML = text[i];
}
}
如果你需要訪問(wèn)一個(gè)元素(如 head)在一個(gè)大的循環(huán)中,使用一個(gè)本地的DOM訪問(wèn)(如例子中的get)會(huì)更快。
運(yùn)行更快的代碼:
function doSomethingElseFaster() {
var get = document.getElementsByTagName;
for (var i = 0, i < 100000; i++) {
get('head');
}
}
13.使用變量緩存值
在做重復(fù)工作的地方使用局部變量緩存值。
下面的一組例子表明了存儲(chǔ)值到局部變量的廣泛意義。
例子1.計(jì)算執(zhí)行前在循環(huán)體內(nèi)使用變量存儲(chǔ)數(shù)學(xué)函數(shù)
錯(cuò)誤的方法:
var d=35;
for (var i=0; i<1000; i++) {
y += Math.sin(d)*10;
}
更好的處理:
var d = 55;
var math_sind = Math.sin(d)*10;
for (var i=0; i<1000; i++) {
y += math_sind;
}
例子2.保存數(shù)組的長(zhǎng)度在循環(huán)中使用
糟糕的處理:
數(shù)組的長(zhǎng)度每次都會(huì)被重復(fù)計(jì)算
for (var i = 0; i < arr.length; i++) {
// do something
}
更好的改進(jìn):
更好的方法是保存數(shù)組的長(zhǎng)度
for (var i = 0, len = arr.length; i < len; i++) {
// do something
}
總的來(lái)說(shuō),如果已經(jīng)做了一次,我們就不需要重復(fù)的做不必要的工作。例如,作用域或者函數(shù)中多次使用到計(jì)算的一個(gè)表達(dá)式的值,保存到變量可以使它多次被使用,否則我們會(huì)過(guò)頭的聲明一個(gè)變量并賦值然后只適用一次。所以請(qǐng)記住這些。
補(bǔ)充說(shuō)明:
第2點(diǎn)
順便說(shuō)一下JS主要不是編譯的是解釋的. 雖說(shuō)不影響表達(dá),但學(xué)術(shù)還是嚴(yán)謹(jǐn)點(diǎn)好.
第6點(diǎn)這是不是格式搞亂了?
a += ‘x' + ‘y';
運(yùn)行更快的代碼:
a += 'x'; a += 'y';
9.避免在對(duì)象中使用不需要的DOM引用
new Object也是DOM引用?
這個(gè)應(yīng)該是說(shuō)不要輕意使用new Object()還有new Array(), 以及new Function() 一般情況使用 {...}, [...], f = function(..){...} 即:
這和上面那一點(diǎn)應(yīng)該說(shuō)的是一回事.
最后補(bǔ)充一個(gè)少用 位運(yùn)算, 因?yàn)閖s的所有數(shù)值運(yùn)算最后(到JS引擎這層)都是全部轉(zhuǎn)得浮點(diǎn)來(lái)算的..所以位運(yùn)算可能反而更慢.
2.避免使用with
3.不要在性能要求關(guān)鍵的函數(shù)中使用try-catch-finally
4.避免使用全局變量
5.避免在性能要求關(guān)鍵的函數(shù)中使用for-in
6.使用字符串累加計(jì)算風(fēng)格
7.原操作會(huì)比函數(shù)調(diào)用快
8.設(shè)置setTimeout() 和 setInterval() 時(shí)傳遞函數(shù)名而不是字符串
9.避免在對(duì)象中使用不需要的DOM引用
10.最清晰的目標(biāo)速度,最小化作用域鏈
11.試著在腳本中少使用注釋,避免使用長(zhǎng)變量名
12.在當(dāng)前作用域存儲(chǔ)應(yīng)用的外部變量
13.使用變量緩存值
1.避免使用eval或者Function構(gòu)造函數(shù)
使用eval或者Function構(gòu)造函數(shù)的代價(jià)是非常昂貴的,每次都需要腳本引擎轉(zhuǎn)換源代碼到可執(zhí)行代碼。
此外,使用eval處理字符串必須在運(yùn)行時(shí)解釋。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
function addMethod(object, property, code) {
object[property] = new Function(code);
}
addMethod(myObj, 'methodName', 'this.localVar=foo');
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
function addMethod(object, property, func) {
object[property] = func;
}
addMethod(myObj, 'methodName', function () { 'this.localVar=foo'; });
2.避免使用with
盡管很方便,with需要附加的查找引用時(shí)間,因?yàn)樗诰幾g的時(shí)候并不知道作用域的上下沒(méi)。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
with (test.object) {
foo = 'Value of foo property of object';
bar = 'Value of bar property of object';
}
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
var myObj = test.object;
myObj.foo = 'Value of foo property of object';
myObj.bar = 'Value of bar property of object';
3.不要在性能要求關(guān)鍵的函數(shù)中使用try-catch-finally
try-catch-finally在運(yùn)行時(shí)每次都會(huì)在當(dāng)前作用域創(chuàng)建一個(gè)新的變量,用于分配語(yǔ)句執(zhí)行的異常。
異常處理應(yīng)該在腳本的高層完成,在異常不是很頻繁發(fā)生的地方,比如一個(gè)循環(huán)體的外面。
如果可能,盡量完全避免使用try-catch-finally。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
var object = ['foo', 'bar'], i;
for (i = 0; i < object.length; i++) {
try {
// do something that throws an exception
} catch (e) {
// handle exception
}
}
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
var object = ['foo', 'bar'], i;
try {
for (i = 0; i < object.length; i++) {
// do something
}
} catch (e) {
// handle exception
}
4.避免使用全局變量
如果你在一個(gè)函數(shù)或者其它作用域中使用全局變量,腳本引擎需要遍歷整個(gè)作用域去查找他們。
全局作用域中的變量在腳本的生命周期里都存在,然后局部范圍的會(huì)在局部范圍失去的時(shí)候被銷毀。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
var i,
str = '';
function globalScope() {
for (i=0; i < 100; i++) {
str += i; // here we reference i and str in global scope which is slow
}
}
globalScope();
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
function localScope() {
var i,
str = '';
for (i=0; i < 100; i++) {
str += i; // i and str in local scope which is faster
}
}
localScope();
5.避免在性能要求關(guān)鍵的函數(shù)中使用for-in
for-in循環(huán)需要腳本引擎建立一張所有可枚舉屬性的列表,并檢查是否與先前的重復(fù)。
如果你的for循環(huán)作用域中的代碼沒(méi)有修改數(shù)組,可以預(yù)先計(jì)算好數(shù)組的長(zhǎng)度用于在for循環(huán)中迭代數(shù)組。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
var sum = 0;
for (var i in arr) {
sum += arr[i];
}
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
var sum = 0;
for (var i = 0, len = arr.length; i < len; i++) {
sum += arr[i];
}
6.使用字符串累加計(jì)算風(fēng)格
使用+運(yùn)算會(huì)在內(nèi)存中創(chuàng)建一個(gè)新的字符串并把連接的值賦給它。僅僅是將這個(gè)結(jié)果賦值給一個(gè)變量。
為了避免連接結(jié)果的中間變量,可以使用+=來(lái)直接賦值結(jié)果。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
a += 'x' + 'y';
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
a += 'x'; a += 'y';
7.原操作會(huì)比函數(shù)調(diào)用快
可以考慮在性能要求關(guān)鍵的循環(huán)和函數(shù)中使用可以替代的原操作。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
var min = Math.min(a, b);
arr.push(val);
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
var min = a < b ? a : b;
arr[arr.length] = val;
8.設(shè)置setTimeout() 和 setInterval() 時(shí)傳遞函數(shù)名而不是字符串
如果你傳遞一個(gè)字符串到setTimeout() 或者 setInterval()中,字符串將會(huì)被eval計(jì)算而導(dǎo)致緩慢。
使用一個(gè)匿名函數(shù)包裝來(lái)代替,這樣在編譯的時(shí)候就可以被解釋和優(yōu)化。
運(yùn)行緩慢的代碼:
setInterval('doSomethingPeriodically()', 1000);
setTimeOut('doSomethingAfterFiveSeconds()', 5000);
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
setInterval(doSomethingPeriodically, 1000);
setTimeOut(doSomethingAfterFiveSeconds, 5000);
9.避免在對(duì)象中使用不需要的DOM引用
不要這么做:
復(fù)制代碼 代碼如下:
var car = new Object();
car.color = "red";
car.type = "sedan"
更好的一種形式:
復(fù)制代碼 代碼如下:
var car = {
color : "red";
type : "sedan"
}
10.最清晰的目標(biāo)速度,最小化作用域鏈
低效率方法:
復(fù)制代碼 代碼如下:
var url = location.href;
一種高效形式:
復(fù)制代碼 代碼如下:
var url = window.location.href;
11.試著在腳本中少使用注釋,避免使用長(zhǎng)變量名
盡可能的保證注釋少或者避免使用注釋,特別是在函數(shù),循環(huán)以及數(shù)組中。
注釋不必要的減緩腳本執(zhí)行并且增加了文件大小。比如:
不建議的形式:
復(fù)制代碼 代碼如下:
function someFunction()
{
var person_full_name="somename"; /* stores the full name*/
}
更好的寫法:
復(fù)制代碼 代碼如下:
function someFunction()
{
var name="somename";
}
12.在當(dāng)前作用域存儲(chǔ)應(yīng)用的外部變量
當(dāng)一個(gè)函數(shù)被執(zhí)行的運(yùn)行上下問(wèn)被穿件,一個(gè)活動(dòng)的對(duì)象會(huì)包含所有局部變量會(huì)被推到上下文鏈的前面。
在作用域鏈中,最慢的是清楚的識(shí)別標(biāo)識(shí)符,意味著局部變量是最快的。存儲(chǔ)頻繁使用的外部變量讀和寫都會(huì)明顯的加快。這對(duì)于全局變量和其他深層次的標(biāo)識(shí)符查找特別明顯。
同樣,在當(dāng)前作用域中的變量(var myVar)比對(duì)象像屬性的訪問(wèn)速度快(this.myVar)。
運(yùn)行緩慢的代碼:
復(fù)制代碼 代碼如下:
function doSomething(text) {
var divs = document.getElementsByTagName('div'),
text = ['foo', /* ... n ... */, 'bar'];
for (var i = 0, l = divs.length; i < l; i++) {
divs[i].innerHTML = text[i];
}
}
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
function doSomethingFaster(text) {
var doc = document,
divs = doc.getElementsByTagName('div'),
text = ['foo', /* ... n ... */, 'bar'];
for (var i = 0, l = divs.length; i < l; i++) {
divs[i].innerHTML = text[i];
}
}
如果你需要訪問(wèn)一個(gè)元素(如 head)在一個(gè)大的循環(huán)中,使用一個(gè)本地的DOM訪問(wèn)(如例子中的get)會(huì)更快。
運(yùn)行更快的代碼:
復(fù)制代碼 代碼如下:
function doSomethingElseFaster() {
var get = document.getElementsByTagName;
for (var i = 0, i < 100000; i++) {
get('head');
}
}
13.使用變量緩存值
在做重復(fù)工作的地方使用局部變量緩存值。
下面的一組例子表明了存儲(chǔ)值到局部變量的廣泛意義。
例子1.計(jì)算執(zhí)行前在循環(huán)體內(nèi)使用變量存儲(chǔ)數(shù)學(xué)函數(shù)
錯(cuò)誤的方法:
復(fù)制代碼 代碼如下:
var d=35;
for (var i=0; i<1000; i++) {
y += Math.sin(d)*10;
}
更好的處理:
復(fù)制代碼 代碼如下:
var d = 55;
var math_sind = Math.sin(d)*10;
for (var i=0; i<1000; i++) {
y += math_sind;
}
例子2.保存數(shù)組的長(zhǎng)度在循環(huán)中使用
糟糕的處理:
數(shù)組的長(zhǎng)度每次都會(huì)被重復(fù)計(jì)算
復(fù)制代碼 代碼如下:
for (var i = 0; i < arr.length; i++) {
// do something
}
更好的改進(jìn):
更好的方法是保存數(shù)組的長(zhǎng)度
復(fù)制代碼 代碼如下:
for (var i = 0, len = arr.length; i < len; i++) {
// do something
}
總的來(lái)說(shuō),如果已經(jīng)做了一次,我們就不需要重復(fù)的做不必要的工作。例如,作用域或者函數(shù)中多次使用到計(jì)算的一個(gè)表達(dá)式的值,保存到變量可以使它多次被使用,否則我們會(huì)過(guò)頭的聲明一個(gè)變量并賦值然后只適用一次。所以請(qǐng)記住這些。
補(bǔ)充說(shuō)明:
第2點(diǎn)
順便說(shuō)一下JS主要不是編譯的是解釋的. 雖說(shuō)不影響表達(dá),但學(xué)術(shù)還是嚴(yán)謹(jǐn)點(diǎn)好.
第6點(diǎn)這是不是格式搞亂了?
a += ‘x' + ‘y';
運(yùn)行更快的代碼:
a += 'x'; a += 'y';
9.避免在對(duì)象中使用不需要的DOM引用
new Object也是DOM引用?
這個(gè)應(yīng)該是說(shuō)不要輕意使用new Object()還有new Array(), 以及new Function() 一般情況使用 {...}, [...], f = function(..){...} 即:
這和上面那一點(diǎn)應(yīng)該說(shuō)的是一回事.
最后補(bǔ)充一個(gè)少用 位運(yùn)算, 因?yàn)閖s的所有數(shù)值運(yùn)算最后(到JS引擎這層)都是全部轉(zhuǎn)得浮點(diǎn)來(lái)算的..所以位運(yùn)算可能反而更慢.
您可能感興趣的文章:
- JavaScript中for..in循環(huán)陷阱介紹
- 比較搞笑的js陷阱題
- Javascript 陷阱 window全局對(duì)象
- JavaScript 存在陷阱 刪除某一區(qū)域所有節(jié)點(diǎn)
- 幫助避免錯(cuò)誤的Javascript陷阱清單
- 錯(cuò)誤剖析之JavaScript的9個(gè)陷阱及評(píng)點(diǎn)
- JavaScript的9個(gè)陷阱及評(píng)點(diǎn)分析
- JavaScript中常見(jiàn)陷阱小結(jié)
- 在JavaScript中遭遇級(jí)聯(lián)表達(dá)式陷阱
- JavaScript中常見(jiàn)的八個(gè)陷阱總結(jié)
相關(guān)文章
JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧
這篇文章主要介紹了JavaScript獲取偽元素(Pseudo-Element)屬性的方法技巧,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03js動(dòng)態(tài)生成表格(節(jié)點(diǎn)操作)
這篇文章主要為大家詳細(xì)介紹了js動(dòng)態(tài)生成表格,進(jìn)行節(jié)點(diǎn)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01layer.open彈層查看縮略圖的原圖,自適應(yīng)大小的實(shí)例
今天小編就為大家分享一篇layer.open彈層查看縮略圖的原圖,自適應(yīng)大小的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09js+cavans實(shí)現(xiàn)圖片滑塊驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了js+cavans實(shí)現(xiàn)圖片滑塊驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09websocket4.0+typescript 實(shí)現(xiàn)熱更新的方法
這篇文章主要介紹了websocket4.0+typescript 實(shí)現(xiàn)熱更新的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08javascript實(shí)現(xiàn)checkBox的全選,反選與賦值
這篇文章主要介紹了javascript實(shí)現(xiàn)checkBox的全選,反選與賦值的方法,以實(shí)例形式詳細(xì)分析了實(shí)現(xiàn)的思路及對(duì)應(yīng)的html與js代碼的實(shí)現(xiàn)過(guò)程2015-03-03JavaScript對(duì)數(shù)組進(jìn)行隨機(jī)重排的方法
這篇文章主要介紹了JavaScript對(duì)數(shù)組進(jìn)行隨機(jī)重排的方法,實(shí)例分析了javascript實(shí)現(xiàn)數(shù)組隨機(jī)重新排序的兩種實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07