js3笔记

20.获取标签方式:
    document.getElementById("box"):通过ID获取标签
    document.getElementsByClassName("box"):通过类名获取元素     复数      IE9及以上
    document.getElementsByTagName("li"):通过标签名获取   复数
    document.getElementsByName("name"):通过Name属性获取   复数              在IE9及IE9以下,是不能通过Name属性获取非表单元素的
    
    w3c发布的获取标签方式:
        document.querySelector("#box"): 选择符合条件的第一个元素节点
        document.querySelectorAll("#box"):返回的是一个集合(nodeList,可以使用数组的方法)
    
    getElementXXX和queryselector的区别:
        getElementXXXX获取的元素是动态的,实时改变
        querySelectorAll  获取的元素是静态的  获取一次以后,长度不再发生变化

21.DOM0和DOM2事件    
    事件流:
           事件流是多个节点对象对同一个事件的响应顺序,事件流分为以下3个
               冒泡型:(IE)
                    事件从最具体的目标(target)向最不特定的目标(document)触发,事件从里到外相应,被称作为冒泡
            捕获型:(网景)
                   事件从最不具体的目标(document)开始触发,向最特定的目标结束,也就是从外向里响应。这样被称作为捕获
            混合型:(W3C事件模型,事件机制,事件流)
                   W3C的事件模型支持冒泡和捕获类型,其中捕获过程先发生,目标阶段在执行,然后,冒泡阶段最后发生
                开发人员可以选择W3C的事件执行时机
            
    DOM0事件:
        DOM0事件绑定的事件流是冒泡~
        两种绑定方法:
             1.静态绑定 把JS的脚本作为属性值,赋值给元素的事件属性
                 <div id="box" οnclick="f()">box  你点我</div>
            2.动态绑定:给元素的DOM对象的事件属性进行赋值
                oCon.onclick = function () { }
        
        表单事件:
            onfocus:获取焦点事件
            onblur:失去焦点事件
            onchange:在输入框失去焦点或用户按下回车时触发(前提是输入框的值要发生改变)
                oninput:实时监测,只要表单的值发生改变就会触发
                form.onsubmit:表单提交时触发(触发form标签onsubmit事件)
        
            鼠标事件:
            onclick:鼠标单击事件
            ondblclick:鼠标双击事件
            oncontextmenu: 鼠标右击事件
            onmousedown:鼠标按下触发
            onmouseup:鼠标抬起触发
            onmousemove:鼠标移动触发(无论是否按下鼠标),只要移动就会一直触发
            onmouseover:鼠标移入(支持冒泡)
            onmouseout:鼠标移出(支持冒泡)
    
            onmouseenter:鼠标移入(不支持冒泡)
            onmouseleave:鼠标移出(不支持冒泡)
            
            鼠标滚轮事件:
           ie/谷歌:
               onmousewheel(DOM0级既可以绑定)
               ev.wheelDelta:
                       滚轮向下拨:  负
                       滚轮向上拨:  正
        
               火狐:
               DOMMouseScroll(DOM2级事件):
                   e.detail
                           滚轮向下拨:  正
                           滚轮向上拨:  负
        
            键盘事件:
            onkeydown:键盘按下事件
            onkeyup:键盘抬起事件
            
        window.onload:当所有的节点和资源都加载完毕后才执行
        img.onload:图片加载完毕后才执行
        window.onunload:页面卸载,这个页面被超链接跳转走、历史记录回退前进、关闭窗口的时候触发
        window.beforeunload:和unload类似,不过更加人性化 会弹出弹窗 让用户确定自己的选择,事件函数的返回值就是窗口的提示信息
        window.onscroll:滚动条事件,实时检测触发,间隔事件可以达到很短
        window.onresize:可视窗口改变后被触发
        
        
    DOM2事件:
        DOM2事件可以选择捕获阶段还是冒泡阶段执行事件
        在DOM2事件模型中,调用对象的addEventListener()方法注册事件
            参数
               1.type:注册事件的类型名称,以事件属性不同,不需要书写on,比如点击事件 就书写 click
               2.listener:监听函数,也就是事件处理函数,事件发生的时候,调用这个函数
               3.useCapture:是一个布尔值,如果为true,则事件会在捕获的阶段发生,如果为flase,则事件会在冒泡的阶段发生
                    //第三个参数也可以是一个对象
                    capture:布尔值,和 useCapture 作用一样
                    once:布尔值,值为 true 表示该回调只会调用一次,调用后会移除监听
                    passive:布尔值,表示永远不会调用 preventDefault
        IE的事件模型(IE8以下)
               使用对象的attachEvent方法绑定事件
                    和addEventListener()类似,但是只有两个参数,只能冒泡,不能选择事件流
        
        DOMContentLoaded:当所有的节点都加载完毕以后就执行
        transitionend: 当过渡动画执行完毕后触发  this.addEventListener("transitionend",fn)
        animationend:当关键帧动画结束
        online:联网触发添加到window上
        offline:掉网触发添加到window上
        storage:A 页面绑定storage事件 一旦B页面设置localStorage,A页面就能通过storage事件得到B页面设置的内容(B页面将数据发送给A页面)
        visibilitychange:可以实时的监听当前页面是否可见,添加到document上
                        // document的hidden属性可以判断当前是否可见 true代表看不见  false代表看的见
                        document.addEventListener('visibilitychange',function () {
                            console.log(document.hidden);
                            if (document.hidden) {
                                clearInterval(timer);
                            }else{
                                timer = setInterval(function () {
                                    i ++;
                                    console.log(i)
                                },100)
                            }
                        })
        
    销毁事件:
           DOM:
                  直接给事件赋值null  覆盖原有事件
        
           DOM2:
                  必须保证绑定的函数和移除的函数是同一个函数
                   使用removeEventListener()移除事件,两个参数,事件名,事件函数
            
    事件委托(delegate):就是我们平时绑定的事件,委托就是把目标节点的事件绑定到祖先元素上
    *   优点1.优化代码性能减少for循环, 2.防止动态的添加删除节点中 注册的事件丢失的现象
    *   原理:冒泡  逐层的冒泡会被祖先元素捕捉到
    
22.BOM
     计时器:
     延迟计时器:window.setTimeout("alert(1)",1000)
     清除计时器:clearTimeout(timer)
     间隙计时器:window.setInterval(function () {},1000)
     清除计时器:clearInterval(timer)
    帧动画:window.requestAnimationFrame():参数是一个回调函数,16.6 毫秒内执行一次回调
    3种弹窗:
        1.alert("有"):确定提示框,由浏览器向用户弹出提示信息,该方法包含一个参数(展示给用户的信息)。
           按钮状态是一  个确定。
        2.confirm("请重新输入"):选择提示框,也是向用户弹出提示信息,包含两个按钮,确定和取消。
                                 如果用户点击确定,则方法返回true,否则返回false
                    confirm()包含一个字符串的参数,如果不写,就没有提示信息,只有按钮
        3.prompt("叫爸爸","爸你大爷"): 可输入提示框  包含两个按钮  确定和取消
                           包含一个输入框,可以供用户输入
                           如果用户点击确定,则返回用户输入的值 否则返回null
                           如果用户不输入,则返回空字符串
                           包含两个参数,一个是给用户的提示信息,一个是输入框的默认值
    
    navigator对象:
        navigator对象储存了与浏览器相关的基本信息,比如,版本、操作系统、名称。
        
    属性:
         userAgent:包含了web浏览器大量的信息
         
    浏览器版本检测:
        var uA = window.navigator.userAgent.toLowerCase();
        var info = {
            ie:/msie/.test(uA) && !/opera/.test(uA),
            op:/opera/.test(uA),
            sa:/version.*safari/.test(uA),
            ch:/chrome/.test(uA),
            ff:/gecko/.test(uA)&&!/webkit/.test(uA)
        }
        info.ie && alert("IE");
        info.op && alert("Opera");
        info.sa && alert("safari");
        info.ch && alert("chrome");
        info.ff && alert("firefox");
        
    获取IE版本号:
        function getIEVer() {
            var uA = navigator.userAgent;
            var b = uA.indexOf("MSIE");
            if (b<0){
                return "不是IE"
            }
            return uA.substring(b+5,uA.indexOf(";",b))
        }
    
        console.log(getIEVer());
    
    
    检测操作系统:
        var uA = navigator.userAgent;
        var isWin = uA.indexOf("Win") != -1;
        var isMac = uA.indexOf("Mac") != -1;
        var isUnix = uA.indexOf("X11") != -1;
        var isLinux = uA.indexOf("Linux") != -1;
        console.log(isWin,isMac,isUnix,isLinux)
    
    
        console.log(navigator.platform);
    
    
    
    location对象:
        储存了与当前文档url相关的一系列信息,简单的说就是当前的网址这个字符串
        
    属性:
        href:声明或者获取当前文档的URL   可以制作重定向(location=url也可以完成重定向)
        
        protocol:协议部分,包含冒号
           host:主机和端口名称 www.baidu.com:8080
        hostname:主机名称 localhost
        port:端口号
        pathname:路径部分
        search:查询部分 包括前导问号
        hash:锚链接部分 包含前导的#
        
    方法:
        location.assign("http://www.baidu.com"):里边传递一个字符串(地址) 然后重定向  和href类似
        location.reload():重新加载当前网页  刷新
        location.replace("http://www.baidu.com"):替换当前网页的url地址 并且替换了当前网页在历史记录的保存
        
    
    
    history对象:
        储存了当前客户端浏览器的历史纪录
        
    属性:
        history.length:可以得到历史记录的长度
        
    方法:
        history.back():在历史记录中返回
           history.forward():在历史记录中前进
        history.go(n):可以输入数字 代表哪一个历史记录  比如 1 前进1页   -2 后退两页
        
    
    
    window对象打开和关闭窗口:
        *   - window.open():可以打开一个新的窗口
        *   - 三个参数:
        *       url:新的页面地址,如果省略则是空白页面
        *       name:新窗口的名称,存在则跳到已经存在的窗口
        *       features:新窗口的特征
        * `         width、height、top、left
                window.open()的返回值 可以调用close(),让新窗口关闭
        *
        *   - window.close():可以关闭窗口
        *   - window.closed:  可以检测窗口是否关闭  如果关闭则返回true
    H5存储技术: 
     localStorage:用在持久化的储存本地数据,除非主动删除,跨页面的同域名同浏览器下都可以访问,大小5M(存储在浏览器的本地的文件中(硬盘),相比sessionStorage比较慢)
     sessionStorage:储存临时数据,网页关闭数据会立马自动删除,只有当前页面可以访问,大小5M(存储在浏览器运行的内存中,速度比较快)
     cookie:用于浏览器和服务器端进行通信的,解决http协议无状态(多个用户给服务器发送请求,服务器无法识别具体用户,会将对个用户的请求返回给多个用户)
             临时cookie(浏览器自带功能):浏览器内存中存储,浏览器关闭了就销毁了(不加maxAge属性)
             持久化cookie:服务器可以通过maxAge属性设置时间
     session:会话储存
                     
                 
    方法:
        localStorage.setItem("name","lily"):设置localStorage
        // 等价于localStorage.name
        localStorage.getItem("name"):获取localStorage,如果localStorage没有"name"属性,获取的是字符串null
        localStorage.removeItem("name"):删除localStorage
        localStorage.clear():清空localStorage
        localStorage.key(i):获取localStorage键名
            length属性:长度
    sessionStorage同localStorage 
    注意: sessionStorage和localStorage必须储存的是文本(字符串或者JSON数据) 
    
23.Web workers
    能够创建一个并行处理的后台线程,并且在这个后台线程中可以基础创建多个子线程
    new Worker("worker1.js"):创建线程
    worker.postMessage("hello world"):向子线程传递数据/向主线程传递数据
    worker.onmessage = function (d) {}:接受子线程返回的数据d/接受主线程返回的数据d
    worker.terminate():关闭线程
    
24.读取文件/读取图片
    读取文件:
        //文件上传后 会触发file的change事件
            oFile.onchange = function () {
                console.log(file);//在file被改变时  file代表当前的节点
                console.log(this.files);//file中的 files代表刚刚上传的内容
                // 在this.files中是一个对象,里边包含上传的文件列表
                // 在文件列表中 包含 文档的名称类型等
    
                // 但是不能直接读取文件中的内容
                // 想要读取文件中的文本内容 需要使用FileReader对象,所以首先实例化一个FileReader对象
                let reader = new FileReader();
    
                // reader就可以读取文件中的文本内容,需要使用readAsTest方法来读取
                reader.readAsText(this.files[0]);
    
                //reader去读取文本的时候需要一定的时间,所以大概读取完成后会通知我们,则需要一个监听事件,
                //当reader读取完毕,则取执行相关代码,  直接使用load事件即可
                reader.onload = function () {
                    //当reader读取完文本的内容,则会进入事件
                    // 当reader读取完成以后,会把读取的内容存放在reader对象的 result属性 中
                    oCon.innerHTML = reader.result;
                }
            }
       读取一张图片:    
        oFile.onchange = function () {
            console.log(this.files);

            // 读取图片依然使用 FileReader对象
            let reader = new FileReader();
            console.log(reader);

            //reader中的readAsDataURL来读取图片的数据
            reader.readAsDataURL(this.files[0]);

            // 当读取完毕以后,可以出发load事件
            reader.onload = function () {
                let newImg = new Image();
                newImg.src = this.result;
                oCon.appendChild(newImg);
            }
        }
       读取多张图片:    
        oFile.onchange = function () {
            console.log(this.files);

            // 读取图片依然使用 FileReader对象


            for(let i in this.files){
                let reader = new FileReader();
                reader.readAsDataURL(this.files[i]);
                // 当读取完毕以后,可以出发load事件
                reader.onload = function () {
                    let newImg = new Image();
                    newImg.src = this.result;
                    oCon.appendChild(newImg);
                }
            }
        }
            
25.canvas画布:
    canvas:在HTML5中 提供了canvasAPI 允许JS在canvas画布上绘制图形,默认的canvas大小是  300*150  默认颜色是透明的
            canvas的宽高 必须通过标签的width和height属性来设置,不能够使用css 来设置宽高
            使用css设置canvas的宽高,是把默认的300*150的画布 拉伸到了你设置的宽度
            oMyCanvas.getContext("2d"):获取画笔
            CTX.beginPath():笔下落或提起笔在落笔
            CTX.moveTo(100,100):确定一个起点坐标
            CTX.lineTo(300,100):绘画直线,两个点之间的连线
            CTX.closePath():关闭路径  用来闭合路径
            CTX.fillStyle  = "pink";
            CTX.fill();填充,如果不设置颜色,默认黑色
            CTX.strokeStyle = "green":笔颜色;
            CTX.lineWidth = "4";
            CTX.stroke();//描边
            CTX.lineCap: 设置线段末端,在描边方法执行之前
                        CTX.lineCap = 'butt';//默认值 以矩形形态结束
                        CTX.lineCap = 'round';//以线段的边缘中心点为圆心,一半的宽度为半径  绘制一个圆  添加在首位
                        CTX.lineCap = 'square';//以线段的边缘宽度为宽,一半的宽度高  绘制一个矩形 添加在首位
            CTX.lineJoin:线段连接处也在stroke方法调用之前设置
                        CTX.lineJoin = 'miter';//默认值 尖角
                        CTX.lineJoin = 'round';//圆角
                        CTX.lineJoin = 'bevel';//平角
            CTX.rect(100,100,200,200):绘制矩形,4个参数,分别是 左上角的x位置  左上角的y的位置  宽度 高度
                        CTX.strokeStyle = "purple";
                        CTX.lineWidth = 4;
                        CTX.strokeRect(100,100,200,200);//绘制矩形
                        CTX.fillStyle = "red";
                        CTX.fillRect(100,100,200,200);//绘制矩形
            CTX.arc(250,250,100,35*Math.PI/180,250*Math.PI/180,true):绘制一个圆形  6个参数,圆心的x   圆心的y   圆的半径  圆的起始角度(写成弧度)  圆的结束角度  顺时针还是逆时针(true代表逆时针  false代表顺时针)
            CTX.arcTo(250,100,250,150,50):绘制一段圆弧,并不是将某个角变成弧度  5个参数 ,分别是  起始位置坐标(拐角点坐标x,拐角点坐标x)  结束位置坐标(x,y) ,半径的长度
            CTX.quadraticCurveTo(183,116,265,47):4个参数,分别是 控制点的 x  y   和 结束点的x  y
            CTX.bezierCurveTo(240,125,222,17,323,40):6个参数  控制点1 的 x和y   控制点2的x和y    结束点的x和y
            CTX.clearRect(60,60,100,100):清除画布,每次清除都是一个矩形区域,参数和rect方法参数一致
            CTX.rotate(30 * Math.PI/180):旋转  参数是一个弧度,而不是角度
            CTX.translate(250,250):改变坐标轴的位置,移动到原来画布的250,250的位置变成原点
            CTX.scale(0.5,0.5):缩放  x和y分别设置
            CTX.createLinearGradient(100,100,300,300):4个参数,分别是两个连线点的坐标,在两个连线之间进行渐变,返回一个渐变对象
            LinearG.addColorStop(0,"red"):添加渐变节点 第一个参数是1-0  渐变的位置  第二个参数是颜色
            CTX.createRadialGradient(150,250,100,400,250,100):6个参数,分别代表两个圆,渐变就在第一个圆的左边到第二个圆的左边进行径向渐变
            CTX.save():存档(画布坐标,画笔形态)
            CTX.restore():恢复存档
            绘制文字:
                    CTX.font = "bold 60px SimSun";设置画笔的文字样式            
                    CTX.textAlign = "start";//默认
                    CTX.textAlign = "end";
                    CTX.textAlign = "center";
                       设置文字的水平对齐方式  以绘制文字时 设置的x坐标为参考点            
                    CTX.textBaseline = 'top'
                    CTX.textBaseline = 'middle'
                    CTX.textBaseline = 'bottom'
                       设置文字的垂直对齐方式
                    CTX.fillText("尚硅谷",100,100);
                    CTX.strokeText("尚硅谷",100,100);
                    绘制文字
               绘制阴影:
                       CTX.shadowColor = "#000";//阴影颜色
                    CTX.shadowBlur = 6;//模糊度
                    CTX.shadowOffsetX = 10;//x轴偏移值
                    CTX.shadowOffsetY = 10;//y轴偏移值
                    CTX.fillStyle = "red";
                    CTX.fillRect(400,300,200,100);
            图形组合方式:
                    在新图和旧图绘制中间,可以控制图形组合方法 globalCompositeOperation 是CTX的属性
                    CTX.globalCompositeOperation = "source-over";//表示新图覆盖在旧图之上
                    CTX.globalCompositeOperation = "destination-over"//表示旧图覆盖在新图之上
                    CTX.globalCompositeOperation = "lighter"//相交处颜色混合
                    CTX.globalCompositeOperation = "xor"//  相交处透明
            CTX.drawImage(oImg,100,100,200,200):绘制图片,5个参数  img节点 图片的x 位置   图片的y位置  图片的宽和图片的高
            CTX.getImageData(150,150,100,100):获取像素点,4个参数  和rect方法的参数一致,返回一个所以像素点的数组  每一个像素点4个值  分别对应r  g  b  a
26.音视频(video):
    音视频的DOM属性:
        oVid.currentTime:获取或设置当前的播放时间
        oVid.duration:获取总时长
        oVid.muted:设置或者返回是否静音    true静音  false不是静音
        oVid.paused:是否被暂停   true是   false不是
        oVid.playbackRate=0.6:设置或返回播放速度
        oVid.volume:设置或返回音量   值范围0到1
        oVid.ended:是否播放结束  true是  false不是
    音视频的方法:
        oVid.play():控制视频播放
        oVid.pause():控制视频暂停
        oVid.load():控制视频返回最初
    音视频的事件:
        oVid.onplay:播放事件
        oVid.onpause:暂停事件
        oVid.ontimeupdate:播放时间变化
        oVid.onended:视频结束
        oVid.onvolumechange:视频声音变化
        oVid.onloadedmetadata:视频元数据加载完成  可以看见视频总时间

27.typeof和instanceOf
    typeof 对于原始类型来说,除了 null 都可以显示正确的类型
    typeof 对于对象来说,除了函数都会显示 object,所以说 typeof 并不能准确判断变量到底是什么类型
        typeof 1 // 'number'
        typeof '1' // 'string'
        typeof undefined // 'undefined'
        typeof true // 'boolean'
        typeof Symbol() // 'symbol'
        typeof [] // 'object'
        typeof {} // 'object'
        typeof console.log // 'function'
    
    instanceOf返回值:
        true/false
        a instanceOf b:a的__proto__(沿着原型链一直往上找)是否在b的prototype上
        
    补充(检测元素类型):
        Object.prototype.toString.call(target).slice(8, -1)

28.ES6/ES8/ES9
    1)let关键字
        1. 与var 类似,用于声明变量
        2. 存在块作用域,不能重复声明
        3. 不会预处理,不存在声明提升
    2)const关键字
        1. 定义一个常量,该常量不能修改
        2. 存在块作用域,不能重复声明
        3. 不会预处理,不存在声明提升
    3)解构赋值
        1. 理解:从对象或数组中提取数据,并赋值给变量(多个)
        2. 对象的解构赋值: let {m,n}={m:'a',n:'b'}
        3. 对象的解构赋值: let {m:n}={m:'a'} //对象m的值给m重命名n
        4. 对象的解构赋值: let {m:{f}}={m:{f:"a"}} //对象m的值给m,在对m解构复值
        5. 数组的解构赋值: let [a,b]=[10,'测试']
    4)模版字符串
        1. 用 ``简化字符串的拼接
        2. ${xxx}可以解析js代码
    5)简化对象的写法
        1. 对象属性名与属性值一样,可以省略属性值
            let name='小明';
            var obj={name}
        2. 简写对象方法
            原来:               
                var obj={
                    sayHi:function(){
                      console.log('您好')
                    }
                }
            现在:
                var obj={
                    sayHi(){
                      console.log('您好')
                    }
                }
    6)箭头函数
        1. 作用: 定义匿名函数
        2. 基本语法: ()=>{console.log('xxxx')}
        3. 参数
            1. 没有参数小括号不能省略
            2. 一个参数小括号可以省略 
            3. 多个参数小括号不能省略
        4. 函数体
            1. 一条语句大括号可以省略,默认返回值是该语句
            2. 一条语句有大括号,需要手动写return
            3. 函数体如果有多个语句,大括号不能省略
        5. this
                    箭头函数没有自己的this,箭头函数的this不是调用的时候决定的,而是在定义的时候外层函数的this就是它的this
             扩展理解: 箭头函数的this看外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有则this是window
    7)三点运算符
        1.打包(打包后的数组为真数组,代替aguments(伪数组))
            function f1(...args) {
              console.log(args) 
            }
            f1(1, 2, 3, 4, 5, 6)
        2.拆包
            let arr1 = [10, 20]
            let arr2 = [10, ...arr2, 20]
            arr2=[10,10,20,20]
    8)形参默认值
        function Person(name = '小明', age = 20) {}    
    9)class
        语法:
            class Person{
                // 类的私有属性
                static set(){};
                //添加在原型上
                set(){};
                //添加在实列对象上
                set=function(){}
            }
        1. 通过class定义类/实现类的继承
        2. 通过extends来实现类的继承
        3. 在类中通过constructor定义构造方法
        4. 通过super调用父类的构造函数
        5. 重写从父类继承的一般方法
        6. 通过new 来创建类的实例
    10)for-of(遍历值)
        for (let key of Objs) {}
    10)Generator函数
        function *foo(x) {
        let y = 2 * (yield (x + 1))
        let z = yield (y / 3)
        return (x + y + z)
        }
        let it = foo(5)
        console.log(it.next())   // => {value: 6, done: false}
        console.log(it.next(12)) // => {value: 8, done: false}
        console.log(it.next(13)) // => {value: 42, done: true}
        1.首先 Generator 函数调用和普通函数不同,它会返回一个迭代器
        2.当执行第一次 next 时,传参会被忽略,并且函数暂停在 yield (x + 1) 处,所以返回 5 + 1 = 6
        3.当执行第二次 next 时,传入的参数等于上一个 yield 的返回值,如果你不传参,yield 永远返回 undefined。此时 let y = 2 * 12,所以第二个 yield 等于 2 * 12 / 3 = 8
        4.当执行第三次 next 时,传入的参数会传递给 z,所以 z = 13, x = 5, y = 24,相加等于 42
    11)async(ES8) 
        async函数是去解决异步回调问题,同步流程表达异步操作,实现原理由generator函数(让异步代码按同步代码的流程来执行的一种手段)封装      
        1. 语法:
            async function foo(){
                await 异步操作;
                await 异步操作;
            }
        2.特点
            async函数返回的总是Promise对象,可以用then方法进行下一步操作
            await是暂停,后面跟着不是Promise对象的话,会像then方法包装成Promise对象
            await后面Promise对象状态为成功是执行下一个await,状态为失败不执行下面await
            await后面Promise对象状态全部为成功时,async函数返回的Promise对象状态为成功,否则为失败
               promise成功的value: 函数执行时候没有错误,那么return 的就是value,或者最后一个await前面的值就是value
            promise失败的reason:函数执行的时候出错的原因或者手动抛出错误或者返回一个失败的promise
    12)promise对象(ES9)(配合async/await专门拿异步处理的结果)
        Promise 是一个解决异步代码按照同步流程执行的方案,配合async函数用来解决异步回调地狱问题(消除回调函数,以同步方式表达异步代码)

                    特点:
          1)怎么创建promise对象?
              new Promise((resolve,reject)=>{})  默认是pending
              Promise.resolve() 
                      默认返回一个成功的promise对象
                      参数如果是一个promise对象,那么返回一个的promise对象与传入的promise对象状态一致
                      Promise.resolve(new Promise((resolve,reject)=>{}))
              Promise.reject() 
                      默认返回一个失败的promise对象
                    参数如果是一个promise对象,那么也返回一个失败的promise对象,结果值是promise对象
                      Promise.resolve(new Promise((resolve,reject)=>{}))
          2) 状态:
              1. pending 初始化状态(实例对象状态)
              2. resolved / fulfilled 成功状态
              3. rejected 失败状态

!!                      注意:
                        同一时间,只能是一个状态
                        只能由初始化状态变成成功/失败状态
                        不能由成功变成失败,也不能由失败变成成功
                        (状态初始化为pending,只能改变一次,要么成功,要么失败)
          3) 结果值:内部的结果值(value/reason)
              resolve(value)
              reject(reason)
          4)怎么判断promise对象的状态?
                then() / catch()          
!!        4)怎么得到promise对象内部的结果值?(如果链式调用then/catch,那么其参数就是上个then/catch的返回值或者返回的promise对象内部的结果值或者是throw抛出的错误)
                  1.then((value) => {},(reason) => {}) / await
                      then()方法,第一个回调函数promise对象的状态成功时执行,第二个回调函数promise对象的状态失败时执行
          
                2.then((value) => {}) / await
                  catch((reason) => {})
                    
!!                注意:
                    then()/catch()方法默认返回成功状态promise对象,
                    返回值如果是非promise对象,那么相当于返回了一个成功的promise对象,返回的promise对象的值为返回值
                          什么时候会返回失败状态promise对象呢?
                            1. 方法中函数的返回值是一个失败状态的promise对象
                                return Promise.reject();
                            2. 方法报错
                                throw 'error';
                              除了以上两个方式,默认就是成功promise
            
          5)其他方法:
                Promise.all([promise1, promise2...])//全部成功才成功
                                返回值是一个新的promise对象,新promise对象状态看传入的promise
                                  如果传入的promise状态都是成功的状态,新promise也成功,
                                  内部的结果值,就是传入的promise成功状态内部的结果值(多个值用数组储存)
                                  如果传入的promise状态有一个失败,新promise立即失败
                                  内部的结果值,就是传入的promise失败状态内部的结果值(一个值)
                Promise.race([promise1, promise2...])//那个先发生变化
                                返回值是一个新的promise对象,新promise对象状态看传入的promise
                                  只看传入的n个promise,哪一个传入promise状态先发生变化
                                  新promise和先发生变化promise的状态一致
                                 内部的结果值,就是先发生变化的promise对象内部的结果值
                Promise.allSettled([promise1, promise2...]) //等全部执行完                   源自ES11/ES2020
                                返回值是一个新的promise对象,一定是成功状态(会等所以传入的promise状态发生改变在返回)
                      promise对象内部状态值,包含传入的n个promise对象的状态值    (以对象的形式储存)        

29.闭包
    1) 什么是闭包?
        函数嵌套函数,内部函数引用了外部函数的变量就形成了闭包了(定义函数的作用域 和 调用的作用域不是同一个)
    2) 闭包的作用?
          1.延长外部函数变量对象的生命周期
        2.让函数外部可以操作(读写)函数内部的数据(变量/函数)
       3) 闭包的缺点
           延长外部函数变量对象的生命周期(不及时清除容易造成内存溢出、泄漏)
    4) 内存泄漏与溢出
        泄漏:没用的内存没用被释放掉
        溢出:被申请的内存过多

30.总结
    1)JS的构成:ECMAScript/DOM/BOM
    2)js
        1.JS数据类型 
            JS中的原始数据类型:string,number,undefined,null,boolean,object,Symbol,bigInt
            JS中的简单(基本)数据类型:string,number,boolean,undefined,null
            JS中的复杂类型:Object,Array,Function,RegExp,Date
            jS中的基本包装类型:string,number,boolean  (本身可以是基本类型,关键时刻可以当对象使用)
        2.事件循环机制
        3.执行上下文和作用域
        4.原型与原型链
        5.内置对象:函数/Object/Array/String/Math/Date/Boolean/Number/Map/Set/正则/arguments对象/JSON对象/
            event对象/classList对象
        6.ES6/8/9
            1)let关键字
      2)const关键字
      3)解构赋值
      4)模版字符串
      5)简化对象的写法
            6)箭头函数
      7)三点运算符
        8)形参默认值
        9)class
        10)for-of(遍历值)
        11)async(ES8) 
            12)promise对象(ES9)
        7.其它:闭包
    2)DOM
        1.DOM0和DOM2事件/事件流    
        2.事件委托
        3.获取窗口的大小
        4.获取文档的大小
        5.获取元素大小        
        6.获取元素位置
        7.访问元素节点属性
        8.元素节点操作
        9.属性的节点操作
    3)BOM
        1.navigator对象
        2.location对象
        3.history对象
        4.window对象
        5.H5存储技术
        6.计时器/3种弹窗
    4)其它:canvas画布/Web workers
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值