美文网首页
2020-09-12复习

2020-09-12复习

作者: 钱罗罗_ | 来源:发表于2020-12-20 10:27 被阅读0次

    一、eventLoop

        setTimeout,ajax等异步和dom事件都是使用回调,基于eventLoop

        执行同步代码,遇到异步代码存到另一个地方,同步代码执行完毕,开始启动eventLoop,不断询问callback queue是否有代码可执行,异步代码执行完毕的时候,会把回调推到callback queue内,eventLoop访问到代码,开始到call stack执行代码,执行完毕之后弹出

        js和dom渲染共用一个进程

        call Stack空闲的时候 -> 尝试DOM渲染 -> 再触发eventLoop

    二、promise

        then和catch正常都是返回一个resolved的,里面要是有报错,则直接rejected

        resolve / reject / then / catch / all / race 

        allSettled :等到所有promises都完成(每个promise返回成功或失败),返回一个promise,并带有一个对象数组,每个对象对应每个promise的结果

        any(当其中的一个promise 成功,就返回那个成功的promise的值。) 

    三、async && await

    async返回的是promise对象 ,

    await相当于promise.then   (返回的不是promise的话,就用promise.resolve包裹起来返回,如果promise它reject了,就报错,用try...catch捕获)

    四、异步的本质

        异步的本质就是回调~

        await后面的代码,都可以看成callback里的内容,就是异

    五、异步遍历(for...of)    

    for ... in : 遍历获取的是对象的键名

    for... of: 遍历获取的是对象的键值,等上一个有结果了,才执行下一个(异步循环)

    六、宏任务和微任务

        宏任务:setTimeout / setInterval / ajax / dom事件,DOM渲染完成之后触发回调,浏览器规定

        微任务:promise,DOM渲染完成之前触发,ES6语法规定

        1、call Stack空闲的时候(同步任务完成)

        2、执行当前的微任务 

        3、尝试DOM渲染

        4、 最后触发eventLoop

    七、DOM(Document Object Modal)

    1、数据结构:是从html解析出来树形结构

    2、常用API:

         获取节点:getElementById(),getElementsByTagName(数组) , getElementsByClassName(数组),querySelectorAll(数组)

        property:以js.语法操作的属性,node.style.xxx / node.className 修改对象属性,不体现到html中(推荐)

        attribute:getAttribute() / setAttribute(),修改html属性,体现到html结构中

        两者都会有可能引起重新渲染

    4、节点操作

        新建:const p1 = document.createElement('p')

        插入:div1.appendChild(p1)

        移动:将现有节点appendChild到其他元素下面

        父元素:p1.parentNode

        子元素列表:div1.childNodes,nodeType === 1的是元素节点

        删除子元素:div1.removeChild(p1)

    3、优化dom操作性能 

        避免频繁操作

        DOM查询缓存

        将频繁操作改为一次操作:

            const frag = document.createDocumentFragment()

    八、BOM(Browser Object Modal)

        1、识别浏览器类型

            const ua = window.navigator.userAgent

            浏览器类型检测方法

        2、分解url

                location.href : 

                location.protocal : https

                location.search : 参数(?a=2&b=3)

                location.hash : hash值

                location.host  : www.baidu.com

                location.pathname :  路径

        3、history:

            history.back()

            history.forword()

    九、事件        

    1、阻止事件冒泡

        stopPropagation  /  cancelBubble

    2、阻止默认行为

        preventDefault / return false

    3、事件监听器

        addEventListener / attachEvent

        removeEventListener / detachEvent

    4、事件代理

    基于事件冒泡

    十、同源(协议、域名、端口)

    css / js / img可无视同源策略    

    img可用于统计打点(一般是1px *1px 的gif)

    link和script可用CDN

    script可实现JSONP进行跨域

    十一、ajax

    readyState 状态 状态说明

    (0)未初始化:表示对象已经存在

    (1)载入:表示正在向服务端发送请求。

    (2)载入完成:表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。

    (3)交互:表示正在解析数据。

    (4)完成:表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。

    概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:

    创建-初始化请求-发送请求-接收数据-解析数据-完成

    十二、http

    1、状态码

        1xx:服务器收到请求

        2xx: 请求成功,200

        3xx: 重定向,301(永久重定向),302(临时重定向),304(命中协商缓存,资源未被修改),

        4xx:客户端错误,404(找不到),401(无权限),403(forbidden)

         5xx: 服务端错误,500,503(服务器正在启动),502(bad request),504(网关超时)

    2、headers

        requestHeaders:

            Accept:浏览器可接受数据格式

            Accept-Encoding: 浏览器可接受的压缩算法,gzip

            Accept-Language: 浏览器可接受的压缩算法,zh-CN

            Connection:keep-alive(长链接)

            cookie: 同域自动带

            host: 请求域名

            User-Agent:浏览器信息

            Content-type:发送数据的格式

        responseHeaders:

            Content-type:返回数据的格式    

            Content-length: 返回数据的大小,字节

            Content-Encoding: 返回数据的压缩算法,gzip

            set-cookie:   服务器设置cookie  

            cache-control / expires / etag / last-modified / if-modified-since / if-none-match          

    十三、Restful-API

    请求分成增删改查,4种methods去请求,用method表示操作类型

    十四、http缓存

        js / css / img可以被缓存    

        1、强制缓存:命中返回200状态码

            expires: http1.0的属性,权重低于cache-control

            cache-control : response headers里,控制强制缓存的逻辑,

                max-age: 最大缓存时间,s

                no-cache: 跳过强制缓存,询问服务端(走协商缓存)

                no-store: 不缓存

                public: 浏览器和中间服务器都可缓存

                private: 只有浏览器可以缓存

       2、 协商缓存:命中返回304状态码

           response header 

                Last-modified: 资源最后修改时间,只能精确到秒级

                Etag : 资源的唯一标识(计算起来比较耗性能),更准确

            requset header

                If-Modified-Since

                If-None-Match

            权重:Etag > Last-Modified

        3、刷新对缓存的影响:

            ①、正常操作:地址栏输入url,跳转连接,浏览器前进后退   

                强制缓存,协商缓存都有效

           ②、 手动刷新:F5 ,点击刷新,右键刷新

                强制缓存失效,协商缓存都有效

            ③、强制刷新: Ctrl + F5     

                全部失效

    十五、从输入url到出页面    

    1、DNS解析

    2、发起请求

    3、 请求返回

    4、生成DOM Tree

    5、生成CSSOM

    6、 DOM Tree和CSSOM合成render Tree

    7、根据render Tree渲染页面

    8、遇到js暂停渲染,优先加载执行js,完成再继续渲染

    9、渲染完成

    十六、window.onload和DOMContentLoaded

        window.onload: 全部资源加载完成,触发

        DOMContentLoaded:只有dom渲染完成就触发


    十七、TCP && UDP

    十八、tree-shaking

        依赖于es6的module特性:

           1、只能作为模块顶层的语句出现

            2、import 的模块名只能是字符串常量

            3、import binding 是 immutable(一成不变)的

    也就是说es6的mudule是确定的,静态的,tree-shaking只能识别静态代码(不执行代码),从字面量分析,所以wepack和rollup一定要基于es6才能实现tree-shaking

    wepack和rollup本身是不能进行tree-shaking的,是uglify操作的

    特殊情况:

        tree-shaking不能进行跨文件优化,

         tree-shaking对函数效果较好

    十九、for/forEach/for...in/for...of

    1、for只能遍历数组,遍历数组的下标作为key,可以break,不可以return

    2、forEach也只能遍历数组,遍历数组的,但是不能用break退出循环体,也不能从循环体return出啥来

    3、for...in即可遍历数组,也可以遍历对象,遍历的是数组的下标或者是对象的key,break可以终止,

    4、for...of只能遍历数组,遍历的是数组的值,break可以终止,

     return只能用在函数体

    continue/break 只能用在for、for/of、for/in、while、do/while的循环体

    二十、安全

    1、XSS(跨站请求攻击)

        ①、反射

            就是用户访问的时候,部分不是我们自己的代码会在浏览器执行,造成问题,信息泄露啥的。

            就是可能搜索的地方,用户输入个js代码,发送个啥数据给我,我可能就干坏事了,

            但是搜索只能是自己搜索,你总没有超能力控制受害者输入啥吧,那就可能从url入手,携带恶意代码,被浏览器拿来执行

        ②、存储

            用户的输入被发送并存储到数据库,下次读取的时候,造成问题

            就像是评论,我评论个一个恶意js代码,你再看到时候,就把你的信息发给我,我是不是就要坏事儿了

        ③、DOM:我不知道

        防御:

            httpOnly

            转义

    2、xsrf(跨站请求伪造)

        攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的

        受害者登陆过被攻击网站,并在本地保存着凭证

        受害者点击第三方网站,执行代码,伪造是受害者的请求

        被攻击网站确认时受害者的请求,执行代码

        防御:

            token

            同源

    二十一、css module

    css-loader有配置项在,在配置css-loader的时候,options的配置项

    六、代码规范yorkie

    lint && commitMessage校验

    gitHooks:{

    "pre-commit": 'lint-staged',

    "commit-msg" : "commitlint -e $GIT_PARAMS"

    }

    二十二、scrollTop

    scrollTop:元素被卷去的高度

    scrollHeight:算上被卷去的总高度,内容不超出盒子高度时为盒子的clientHeight

    offsetWidth 水平方向 width + 左右padding + 左右border

    clientWidth 水平方向 width + 左右padding

    offsetTop 获取当前元素到 定位父节点 的top方向的距离

    getBoundingClientRect() 获取元素到body

        *  bottom: 元素底边(包括border)到可视区最顶部的距离

        *  left: 元素最左边(不包括border)到可视区最左边的距离

        *  right: 元素最右边(包括border)到可视区最左边的距离

        *  top: 元素顶边(不包括border)到可视区最顶部的距离

        *  height: 元素的offsetHeight

        *  width: 元素的offsetWidth

        *  x: 元素左上角的x坐标

        *  y: 元素左上角的y坐标

    获取以上元素都会触发回流,慎用

    八、回流和重绘

    会导致回流的操作:

    页面首次渲染。

    浏览器窗口大小发生改变。

    元素尺寸或者位置发生改变。

    元素内容变化(文字数量或者图片大小发生改变)。

    元素字体大小的改变。

    添加或者删除可见的DOM元素。

    激活CSS伪类 (eg::hover)。

    查询某些属性或调用某些方法。

    一些常用且会导致回流的属性和方法。

    clientWidth、clientHeight、clientTop、clientLeft

    offsetWidth、offsetHeight、offsetTop、offsetLeft

    scrollWidth、scrollHeight、scrollTop、scrollLeft

    scrollIntoView()、scrollIntoViewIfNeeded()

    getComputedStyle()

    getBoundingClientRect()

    scrollTo()

    二十三、setTimeout && requsetAnimationFrame

    1、setTimeout是异步执行任务,放进任务队列,可能造成卡顿,页面不可见的情况下,会继续在后台执行,损耗cpu,

    2、requsetAnimationFrame,屏幕的刷新频率是每秒60帧,也就是每16.67ms刷新一次。requsetAnimationFrame会在页面不可见的时候,不执行回调,减少损耗cpu资源,可以取消,该函数返回一个id,使用cancelAnimationFrame(id)取消。由系统来决定回调函数的执行时机,跟着系统的刷新频率走,保证回调函数在屏幕每一次的刷新间隔中只被执行一次,但是兼容性不太好,需要优雅降级

    二十四、数组方法

    forEach:不修改原数组,不能break, continue, return,跳过后面的代码,进行下一次循环

    map:不修改原数组,返回新数组,不能break,可以return,跳过后面的代码,进行下一次循环

    函数体都是return,for循环体都是continue && break;

    pop,shift返回被删除或者被新增的那个元素,unshift push返回新数组的长度

    二十五、关于new

    函数内,不明确return什么的时候,默认是返回    undefined,入砂锅是new操作符的话,默认返回的是this对象。但是但是但是!!!如果明确了return,那不管是直接执行还是new操作,返回的都是return的东西。

    如果是return对象,且new操作了,那么被返回的对象的原型是不指向该类的原型的,也就是说,原型链并不是类的原型链了哦

    相关文章

      网友评论

          本文标题:2020-09-12复习

          本文链接:https://www.haomeiwen.com/subject/xkcwektx.html