JS必会基础知识3

描述cookie和localStorage和sessionStorage的区别

从容量和API易用性角度。

cookie

  1. cookie 本身用于浏览器和 server 通讯,被“借用”到本地存储
  2. api为document.cookie,不够友好
  3. 容量最大为4kB
  4. http请求时需要一同发送到服务器,增加了请求的数据量

localStorage和sessionStorage

  1. 专为本地存储而设计的,最大为5MB
  2. API简单易用,setItemgetItem
  3. 不会随http请求发送出去
  4. localStorage数据永久存储,除非被动删除
  5. sessionStorage中存在当前会话,浏览器关闭后就会清空

从输入URL到渲染出页面的整个过程

  1. DNS解析:域名 -> IP地址
  2. 浏览器根据IP地址向服务器发送http请求
  3. 服务器处理http请求,并返回给浏览器
  4. 根据html代码生成DOM树
  5. 根据CSS代码生成CSSOM
  6. 将DOM树和CSSOM整合成RenderTree
  7. 根据RenderTree渲染页面,遇到script标签则暂停渲染,优先加载脚本并执行js代码,完成后再继续。暂停是因为JS进程和渲染进程是公用一个线程的,js可能会改变DOM结构
  8. 直到渲染完成

其中link要放在head中,因为放在后面可能会造成再次渲染问题,js放在最后,是因为JS进程和渲染进程是公用一个线程的,而且有可能js加载时间很长,然后就会造成页面卡顿现象,img标签不会暂停渲染,不会阻塞DOM渲染,不会造成重排现象。

window.onload和DOMContentLoaded的区别

window.addEventListener('load', function() {
  // 页面全部资源加载完才会执行,包括图片、视频
  console.log('load');  // 后输出
})
document.addEventListener('DOMContentLoaded', function() {
  // DOM渲染完成即可执行,此时图片、视频可能还未加载完成
  console.log('DOMContentLoaded');  // 先输出,所以操作 js 最好在这个方法里面
})

性能优化

原则:

  1. 多使用内存、缓存
  2. 减少CPU计算,减少网络加载耗时
  3. 以空间换取时间

从何入手

1. 让加载更快

1.1 减少资源的体积:压缩代码
1.2 减少访问次数:合并代码、SSR渲染、缓存
1.3 使用更快的网络

2. 让渲染更快

2.1 css放在head部分,js放在body最后
2.2 尽早执行js,用DOMContentLoaded触发
2.3 懒加载:图片懒加载、上滑加载更多
2.4 对DOM查询缓存
2.5 频繁DOM操作,合并到一起插入DOM结构
2.6 节流和防抖

防抖debounce

场景:监听一个输入框的文字,变化后触发change事件,直接用keyup事件,则会频繁触发change事件,使用防抖,只有在用户输入结束或暂停的时候,才会触发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>

节流throttle

场景:拖拽一个元素师,要随时拿到该元素的拖拽位置,直接用drag事件,则会频繁触发,很容易造成卡顿,此时使用节流的话,无论拖拽速度多快,都快每隔一段时间触发一次

<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的区别

  • var是ES5语法,let和const是ES6语法,var有变量提升
  • var和let是变量,可修改,const是常量,不可改变
  • let和const有块级作用域,var没有

手写一个深度比较

// 判断是否是对象
function isObject(target) {
    return typeof target === "object" && target !== null;
}
function isEqual(source, target) {
    // 只要其中有一个不是对象,那就直接比较
    // 如 isEqual(1, { a: 2 })
    // 如 isEqual(1, 1)
    if (!isObject(source) || !isObject(target)) {
        return source === target;
    }
    // 如过两个都引用的是一个对象,直接比较
    // 如 isEqual(a, a)
    if (source === target) {
        return true;
    }
    //  两个都是对象或数组,而且不相等
    // 1. 先取出 source 和 target 的keys, 比较个数
    const sourceKeys = Object.keys(source);
    const targetKeys = Object.keys(target);
    if (sourceKeys.length !== targetKeys.length) {
        return false;
    }
    // 以 source 为基准,和 target 依次递归比较
    for (let key in sourceKeys) {
        const res = isEqual(source[key], target[key]);
        // 如果 res 中有一个为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参数

// 传统方法
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"}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342