JS必會(huì)基礎(chǔ)知識(shí)3

描述cookie和localStorage和sessionStorage的區(qū)別

從容量和API易用性角度社裆。

cookie

  1. cookie 本身用于瀏覽器和 server 通訊,被“借用”到本地存儲(chǔ)
  2. api為document.cookie境钟,不夠友好
  3. 容量最大為4kB
  4. http請求時(shí)需要一同發(fā)送到服務(wù)器,增加了請求的數(shù)據(jù)量

localStorage和sessionStorage

  1. 專為本地存儲(chǔ)而設(shè)計(jì)的,最大為5MB
  2. API簡單易用,setItem布蔗,getItem
  3. 不會(huì)隨http請求發(fā)送出去
  4. localStorage數(shù)據(jù)永久存儲(chǔ),除非被動(dòng)刪除
  5. sessionStorage中存在當(dāng)前會(huì)話浪腐,瀏覽器關(guān)閉后就會(huì)清空

從輸入U(xiǎn)RL到渲染出頁面的整個(gè)過程

  1. DNS解析:域名 -> IP地址
  2. 瀏覽器根據(jù)IP地址向服務(wù)器發(fā)送http請求
  3. 服務(wù)器處理http請求纵揍,并返回給瀏覽器
  4. 根據(jù)html代碼生成DOM樹
  5. 根據(jù)CSS代碼生成CSSOM
  6. 將DOM樹和CSSOM整合成RenderTree
  7. 根據(jù)RenderTree渲染頁面,遇到script標(biāo)簽則暫停渲染议街,優(yōu)先加載腳本并執(zhí)行js代碼泽谨,完成后再繼續(xù)。暫停是因?yàn)镴S進(jìn)程和渲染進(jìn)程是公用一個(gè)線程的,js可能會(huì)改變DOM結(jié)構(gòu)
  8. 直到渲染完成

其中l(wèi)ink要放在head中吧雹,因?yàn)榉旁诤竺婵赡軙?huì)造成再次渲染問題骨杂,js放在最后,是因?yàn)镴S進(jìn)程和渲染進(jìn)程是公用一個(gè)線程的雄卷,而且有可能js加載時(shí)間很長搓蚪,然后就會(huì)造成頁面卡頓現(xiàn)象,img標(biāo)簽不會(huì)暫停渲染丁鹉,不會(huì)阻塞DOM渲染妒潭,不會(huì)造成重排現(xiàn)象。

window.onload和DOMContentLoaded的區(qū)別

window.addEventListener('load', function() {
  // 頁面全部資源加載完才會(huì)執(zhí)行揣钦,包括圖片杜耙、視頻
  console.log('load');  // 后輸出
})
document.addEventListener('DOMContentLoaded', function() {
  // DOM渲染完成即可執(zhí)行,此時(shí)圖片拂盯、視頻可能還未加載完成
  console.log('DOMContentLoaded');  // 先輸出佑女,所以操作 js 最好在這個(gè)方法里面
})

性能優(yōu)化

原則:

  1. 多使用內(nèi)存、緩存
  2. 減少CPU計(jì)算谈竿,減少網(wǎng)絡(luò)加載耗時(shí)
  3. 以空間換取時(shí)間

從何入手

1. 讓加載更快

1.1 減少資源的體積:壓縮代碼
1.2 減少訪問次數(shù):合并代碼团驱、SSR渲染、緩存
1.3 使用更快的網(wǎng)絡(luò)

2. 讓渲染更快

2.1 css放在head部分空凸,js放在body最后
2.2 盡早執(zhí)行js嚎花,用DOMContentLoaded觸發(fā)
2.3 懶加載:圖片懶加載、上滑加載更多
2.4 對DOM查詢緩存
2.5 頻繁DOM操作呀洲,合并到一起插入DOM結(jié)構(gòu)
2.6 節(jié)流和防抖

防抖debounce

場景:監(jiān)聽一個(gè)輸入框的文字紊选,變化后觸發(fā)change事件,直接用keyup事件道逗,則會(huì)頻繁觸發(fā)change事件兵罢,使用防抖,只有在用戶輸入結(jié)束或暫停的時(shí)候滓窍,才會(huì)觸發(fā)change事件

<input type="text" id="input1" />

<script>
    function debounce(fn, delay = 300) {
        let timer = null;
        return function() {
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(() => {
                fn.call(this, arguments[0]);
                timer = null;
            }, delay);
        };
    }
    const input = document.getElementById("input1");
    input.addEventListener(
        "keyup",
        debounce(function(e) {
            console.log(this.value, e);
        })
    );
</script>

節(jié)流throttle

場景:拖拽一個(gè)元素師卖词,要隨時(shí)拿到該元素的拖拽位置,直接用drag事件吏夯,則會(huì)頻繁觸發(fā)此蜈,很容易造成卡頓,此時(shí)使用節(jié)流的話噪生,無論拖拽速度多快裆赵,都快每隔一段時(shí)間觸發(fā)一次

<div
    id="div1"
    draggable="true"
    style="width: 200px;height: 100px;background: rebeccapurple;"
/>

<script>
    function throttle(fn, delay = 100) {
        let timer = null;
        return function() {
            if (timer) {  // timer不為空就什么都不做
                return;
            }
            timer = setTimeout(() => {
                fn.call(this, arguments[0]);
                timer = null;
            }, delay);
        };
    }
    const div = document.getElementById("div1");
    div.addEventListener(
        "drag",
        throttle(function(e) {
            console.log(e.offsetX, e.offsetY);
        })
    );
</script>

如何捕獲異常

  1. try...catch
  2. window.onerror = funtion(message, source, lineNumber, colNumber, error) {}

var 和let、const的區(qū)別

  • var是ES5語法跺嗽,let和const是ES6語法战授,var有變量提升
  • var和let是變量舔庶,可修改,const是常量陈醒,不可改變
  • let和const有塊級(jí)作用域惕橙,var沒有

手寫一個(gè)深度比較

// 判斷是否是對象
function isObject(target) {
    return typeof target === "object" && target !== null;
}
function isEqual(source, target) {
    // 只要其中有一個(gè)不是對象,那就直接比較
    // 如 isEqual(1, { a: 2 })
    // 如 isEqual(1, 1)
    if (!isObject(source) || !isObject(target)) {
        return source === target;
    }
    // 如過兩個(gè)都引用的是一個(gè)對象钉跷,直接比較
    // 如 isEqual(a, a)
    if (source === target) {
        return true;
    }
    //  兩個(gè)都是對象或數(shù)組弥鹦,而且不相等
    // 1. 先取出 source 和 target 的keys, 比較個(gè)數(shù)
    const sourceKeys = Object.keys(source);
    const targetKeys = Object.keys(target);
    if (sourceKeys.length !== targetKeys.length) {
        return false;
    }
    // 以 source 為基準(zhǔn)爷辙,和 target 依次遞歸比較
    for (let key in sourceKeys) {
        const res = isEqual(source[key], target[key]);
        // 如果 res 中有一個(gè)為false彬坏,那就直接返回false
        if (!res) {
            return false;
        }
    }
    // 如果res都為true
    return true;
}
const a = { a: 1, b: 2, c: { x: 3, y: 4 } };
const b = { a: 1, b: 2, c: { x: 3, y: 4 } };
const c = { a: 1, b: 2, c: { x: 3, y: 4 }, d: 5 };
const d = { a: 1, b: 2, c: { x: 3, y: 44 } };

console.log(isEqual("aa", "aa")); // true
console.log(isEqual(11, 1)); // false
console.log(isEqual(a, b)); // true
console.log(isEqual(a, c)); // false
console.log(isEqual(a, d)); // false

獲取URL參數(shù)

// 傳統(tǒng)方法
function getURLQueryParams(_url) {
    const params = {};
    const url = _url || location.href; // _url 存在則用 _url, 不存在則用location.href
    const search = url.split("?");
    if (!search[1]) {
        return params;
    }
    const searches = search[1].split("&");

    searches.map(item => {
        const items = item.split("=");

        params[items[0]] = items[1];
    });
    return params;
}
console.log(getURLQueryParams("http:www.baidu.com?name=xxx&age=20")); // {name: "xxx", age: "20"}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膝晾,一起剝皮案震驚了整個(gè)濱河市栓始,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌血当,老刑警劉巖幻赚,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臊旭,居然都是意外死亡落恼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門离熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佳谦,“玉大人,你說我怎么就攤上這事滋戳∽昝铮” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵奸鸯,是天一觀的道長咪笑。 經(jīng)常有香客問我,道長府喳,這世上最難降的妖魔是什么蒲肋? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任蘑拯,我火速辦了婚禮钝满,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘申窘。我一直安慰自己弯蚜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布剃法。 她就那樣靜靜地躺著碎捺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上收厨,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天晋柱,我揣著相機(jī)與錄音,去河邊找鬼诵叁。 笑死雁竞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拧额。 我是一名探鬼主播碑诉,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侥锦!你這毒婦竟也來了进栽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對情侶失蹤恭垦,失蹤者是張志新(化名)和其女友劉穎快毛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體番挺,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祸泪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建芙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片没隘。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖禁荸,靈堂內(nèi)的尸體忽然破棺而出右蒲,到底是詐尸還是另有隱情,我是刑警寧澤赶熟,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布瑰妄,位于F島的核電站,受9級(jí)特大地震影響映砖,放射性物質(zhì)發(fā)生泄漏间坐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一邑退、第九天 我趴在偏房一處隱蔽的房頂上張望竹宋。 院中可真熱鬧,春花似錦地技、人聲如沸蜈七。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽飒硅。三九已至砂缩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間三娩,已是汗流浹背庵芭。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雀监,地道東北人喳挑。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像滔悉,于是被迫代替她去往敵國和親伊诵。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350