js 優(yōu)化

避免全局查找

在一個函數(shù)中會用到全局對象存儲為局部變量來減少全局查找,因為訪問局部變量的速度要比訪問全局變量的速度更快些

function search() {
    // 當(dāng)我要使用當(dāng)前頁面地址和主機(jī)域名
    alert(window.location.href + window.location.host)
}
// 最好的方式是如下這樣 先用一個簡單變量保存起來
function search() {
    var location = window.location
    alert(location.href + location.host)
}

定時器

如果針對的是不斷運(yùn)行的代碼,不應(yīng)該使用 setTimeout,而應(yīng)該是用 setInterval,因為 setTimeout 每一次都會初始化一個定時器,而 setInterval 只會在開始的時候初始化一個定時器

var timeoutTimes = 0
function timeout() {
    timeoutTimes++
    if (timeoutTimes < 10){
        setTimeout(timeout, 10)
    }
}
timeout()
// 可以替換為
var intervalTimes = 0
function interval() {
    intervalTimes++
    if (intervalTimes >= 10){
        clearInterval(interv)
    }
}
var interv = setInterval(interval, 10)

字符串連接

如果要連接多個字符串,應(yīng)該少使用 +=,如
s+=a
s+=b
s+=c
應(yīng)該寫成 s+=a + b + c
二如果是收集字符串,比如多次對同一個字符串進(jìn)行+=操作的話,最好使用一個緩存,使用JavaScript 數(shù)組來收集,最后使用 join 方法連接起來

var buf = []
for (let i = 0;i < 100;i++){
    buf.push(i.toString())
}
var all = buf.join("");

數(shù)字轉(zhuǎn)字符串

一般最好用 "" + 1 來將數(shù)字轉(zhuǎn)換成字符串,雖然看起來比較丑一點,但事實上這個效率是最高的,性能上來說:
(""+)>String()>.toString()>new String()

浮點數(shù)轉(zhuǎn)換成整型

很多人喜歡使用 parseInt(),其實 parseInt() 是用于將字符串轉(zhuǎn)換成數(shù)字,而不是浮點數(shù)和整型之間的轉(zhuǎn)換,我們應(yīng)該使用 Math.floor()去掉小數(shù)部分,負(fù)數(shù)減一去掉小數(shù) 或者 Math.round()四舍五入

各種類型的轉(zhuǎn)換

var myVar = "3.14159",
str = "" + myVar,       // to string
i_int = ~~myVar,        // to integer
f_float = 1 * myVar,    // to float
b_bool = !!myVar,       /* to boolean - any string with length
                            and any number except 0 are true */
array = [myVar];        // to array

如果定義了 toString() 方法來進(jìn)行類型轉(zhuǎn)換的話,推薦顯式調(diào)用 toString(),因為內(nèi)部的操作在嘗試所有可能性之后,會嘗試對象的 toString() 方法嘗試能否轉(zhuǎn)化為 String,所以直接調(diào)用這個方法效率會更高

多個類型聲明

在 JavaScript 中所有變量都可以使用單個 var 語句來聲明,這樣就是組合在一起的語句,以減少整個腳本的執(zhí)行時間,就如上面代碼一樣,上面代碼格式也挺規(guī)范,讓人一看就明了。

插入迭代器

var name=values[i];i++;前面兩條語句可以寫成var name=values[i++];

使用直接量

var aTest = new Array()   // 替換為
var aTest = [];
var aTest = new Object    // 替換為
var aTest = {};
var reg = new RegExp();   // 替換為
var reg = /../;
//如果要創(chuàng)建具有一些特性的一般對象,也可以使用字面量,如下:
var oFruit = new O;
oFruit.color = "red";
oFruit.name = "apple";
//前面的代碼可用對象字面量來改寫成這樣:
var oFruit = { color: "red", name: "apple" };

使用 DocumentFragment 優(yōu)化多次 append

一旦需要更新 DOM, 請考慮使用文檔碎片來構(gòu)建 DOM 結(jié)構(gòu),然后再將其添加到現(xiàn)存的文檔中。

for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    document.body.appendChild(el);
}
//可以替換為:
var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);

使用一次 innerHTML 賦值代替構(gòu)建 dom 元素

對于大的 DOM 更改,使用 innerHTML 要比使用標(biāo)準(zhǔn)的 DOM 方法創(chuàng)建同樣的 DOM 結(jié)構(gòu)快得多。

var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);
//可以替換為:
var html = [];
for (var i = 0; i < 1000; i++) {
    html.push('<p>' + i + '</p>');
}
document.body.innerHTML = html.join('');

通過模板元素 clone,替代 createElement

很多人喜歡在 JavaScript 中使用 document.write 來給頁面生成內(nèi)容。事實上這樣的效率較低,如果需要直接插入 HTML,可以找一個容器元素,比如指定一個 div 或者 span,并設(shè)置他們的 innerHTML 來將自己的 HTML 代碼插入到頁面中。通常我們可能會使用字符串直接寫 HTML 來創(chuàng)建節(jié)點,其實這樣做,1 無法保證代碼的有效性 2 字符串操作效率低,所以應(yīng)該是用 document.createElement() 方法,而如果文檔中存在現(xiàn)成的樣板節(jié)點,應(yīng)該是用 cloneNode() 方法,因為使用 createElement() 方法之后,你需要設(shè)置多次元素的屬性,使用 cloneNode() 則可以減少屬性的設(shè)置次數(shù)——同樣如果需要創(chuàng)建很多元素,應(yīng)該先準(zhǔn)備一個樣板節(jié)點

var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);
//替換為:
var frag = document.createDocumentFragment();
var pEl = document.getElementsByTagName('p')[0];
for (var i = 0; i < 1000; i++) {
    var el = pEl.cloneNode(false);
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內(nèi)容