js 優(yōu)化

避免全局查找

在一個(gè)函數(shù)中會(huì)用到全局對(duì)象存儲(chǔ)為局部變量來(lái)減少全局查找犬金,因?yàn)樵L問(wèn)局部變量的速度要比訪問(wèn)全局變量的速度更快些

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

定時(shí)器

如果針對(duì)的是不斷運(yùn)行的代碼,不應(yīng)該使用 setTimeout六剥,而應(yīng)該是用 setInterval晚顷,因?yàn)?setTimeout 每一次都會(huì)初始化一個(gè)定時(shí)器,而 setInterval 只會(huì)在開(kāi)始的時(shí)候初始化一個(gè)定時(shí)器

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)

字符串連接

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

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

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

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

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

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

各種類(lèi)型的轉(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() 方法來(lái)進(jìn)行類(lèi)型轉(zhuǎn)換的話锅锨,推薦顯式調(diào)用 toString(),因?yàn)閮?nèi)部的操作在嘗試所有可能性之后恋沃,會(huì)嘗試對(duì)象的 toString() 方法嘗試能否轉(zhuǎn)化為 String必搞,所以直接調(diào)用這個(gè)方法效率會(huì)更高

多個(gè)類(lèi)型聲明

在 JavaScript 中所有變量都可以使用單個(gè) var 語(yǔ)句來(lái)聲明,這樣就是組合在一起的語(yǔ)句囊咏,以減少整個(gè)腳本的執(zhí)行時(shí)間恕洲,就如上面代碼一樣,上面代碼格式也挺規(guī)范梅割,讓人一看就明了霜第。

插入迭代器

var name=values[i];i++;前面兩條語(yǔ)句可以寫(xiě)成var name=values[i++];

使用直接量

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

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

一旦需要更新 DOM, 請(qǐng)考慮使用文檔碎片來(lái)構(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 元素

對(duì)于大的 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('');

通過(guò)模板元素 clone弹砚,替代 createElement

很多人喜歡在 JavaScript 中使用 document.write 來(lái)給頁(yè)面生成內(nèi)容。事實(shí)上這樣的效率較低枢希,如果需要直接插入 HTML桌吃,可以找一個(gè)容器元素,比如指定一個(gè) div 或者 span苞轿,并設(shè)置他們的 innerHTML 來(lái)將自己的 HTML 代碼插入到頁(yè)面中茅诱。通常我們可能會(huì)使用字符串直接寫(xiě) HTML 來(lái)創(chuàng)建節(jié)點(diǎn),其實(shí)這樣做呕屎,1 無(wú)法保證代碼的有效性 2 字符串操作效率低让簿,所以應(yīng)該是用 document.createElement() 方法,而如果文檔中存在現(xiàn)成的樣板節(jié)點(diǎn)秀睛,應(yīng)該是用 cloneNode() 方法尔当,因?yàn)槭褂?createElement() 方法之后,你需要設(shè)置多次元素的屬性蹂安,使用 cloneNode() 則可以減少屬性的設(shè)置次數(shù)——同樣如果需要?jiǎng)?chuàng)建很多元素椭迎,應(yīng)該先準(zhǔn)備一個(gè)樣板節(jié)點(diǎn)

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市田盈,隨后出現(xiàn)的幾起案子畜号,更是在濱河造成了極大的恐慌,老刑警劉巖允瞧,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件简软,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡述暂,警方通過(guò)查閱死者的電腦和手機(jī)痹升,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)畦韭,“玉大人疼蛾,你說(shuō)我怎么就攤上這事∫张洌” “怎么了察郁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)转唉。 經(jīng)常有香客問(wèn)我皮钠,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮骚灸,結(jié)果婚禮上公你,老公的妹妹穿的比我還像新娘原朝。我一直安慰自己驯嘱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布喳坠。 她就那樣靜靜地躺著鞠评,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壕鹉。 梳的紋絲不亂的頭發(fā)上剃幌,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音晾浴,去河邊找鬼负乡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脊凰,可吹牛的內(nèi)容都是我干的抖棘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狸涌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼切省!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起帕胆,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朝捆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后懒豹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芙盘,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年脸秽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了何陆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豹储,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淘这,到底是詐尸還是另有隱情剥扣,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布铝穷,位于F島的核電站钠怯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏曙聂。R本人自食惡果不足惜晦炊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧断国,春花似錦贤姆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至薄疚,卻和暖如春碧信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背街夭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工砰碴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人板丽。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓呈枉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親檐什。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碴卧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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