es6

作者: A_dfa4 | 来源:发表于2020-11-22 22:50 被阅读0次

    let / var/const

    let
    - 不能重复声明
    - 是块级作用域
    
    var 
    - 可以重复声明
    - 作用域: 全局作用域 
    - 变量提升
    
    const
    - 常量 声明后不可以重新赋值 '地址值'
    const obj = {
      name: 'ys',
      age: 25
    }
    Object.freeze(); // 冻结常量 对象内值也不可被修改  不能冻结多层对象  可以自己封装深层冻结
    // 深冻结实现
    function deepFreeze(obj) {
       freeze(obj)
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {  // 判断是否是自身的属性  因为for in 也会去循环 原型链上的属性
          // 判断是对象 
          if (typeof obj[key] === 'object') {
            deepFreeze(obj[key])
          }
       }
      }
    }
    

    解构赋值

    // object
    let obj = {a: 1, b: 2, d: 4}
    let a = obj.a;
    let b = obj.b;
    let {a, b, c} = obj; // 1 2 undefined   名字必须一一对应
    // array
    let arr = ['a', 'b', 'c'];
    let [f, f] = arr;   // 'a'  'b'  顺序是对应的
    // 面试题快速交换数值
    let a = 0;
    let b = 1; 
    [a, b] = [b, a ]
    // string
    let str = 'abc';
    let [e, f] = str  // 'a' 'b' 同数据 顺序对应
    
    let obj = {
       name: '小三',
       people: {
         name: '小四'
       }
    }
    let {name, prople: {name: myname}}  = obj
    console.log(name, myname)  // name: myname 起别名 取重复key的时候会报错
    

    展开运算符

    let arr = [1,2,3,4];
    let arr2 = ['a','b', 'c', 'd']
    let arr3 =  ['a','b',...arr, 'c', 'd'];
    // 剩余参数
    let [a,b, ...c] = arr;  // 1 2 [3, 4]
    // 对象展开
    let obj = {a: 1, b: 2};
    let obj2 = {..obj, c: 3, d: 4}  // {a: 1, b:2,c:3,d:4} 
    let {a, b, ...c} = obj2 // 1 2 {c: 3, d: 4}
    let obj3 = obj
    obj3.a = 10  // obj.a 也是 10
    let obj4 = {..obj} 
    obj.c = 20 // obj.c 还是 3
    

    Set 对象 / Map对象

    // Set构造函数 用来构建某一类型的对象 - 对象实例化
    let arr = [1,2,3,4,5, 1]
    let s = new Set(arr);  // [1,2,3,4,5]  会去重 保留第一次出现的值
    arr = [..s] // 去重后的数组
    s.size // 数值的个数  相当于lengeh
    s.clear() // 清空所有值 返回值 undefined
    s.delete(4) // 删除值  成功返回true
    s.add('a')  // 添加 也会被去重 返回set 本身 可以链式操作
    s.get() 
    s.has('a')  // true 是否包含  
    
    let arr = [ ['a': 1], ['b': 2], [c: 3] ]
    let m = new Map(arr); 
    m.clear()  // clear() 清空
    m.delete('a')  // key 删除某项  返回值 boolean
    m.get('b')  // key 获取某项
    m.has('c')  // key  是否包含 boolean
    m.set(d, 4) // 设置一个值  返回本身
    

    箭头函数

    () => {} // 形参=>返回值
    let fn = num => num*2; // fn(10)   20
    let fn1 = (n1, n2) => n1* n2
    let fn2 =  () => '返回值'  // 返回值
    let fn3 = (a) => {
      console.log(a); 
      return a
    }
    let fn4 = () => ({name: ''ys, age: 25}) //不加 {} 会自动return 对象的{}和函数的{}语法冲突 用 ()包起来
    // 差异
    -  箭头函数没有 arguments  用 rest参数 (..arg)或者 (a, b, ...arg)
    -  没有this 指向其声明时所在作用域的this(取外部的 this')
    -  函数默认值 (a = 1)
    
    

    数组的扩展

    • Array.form 把一个类数组转换成真正的数组
      | 构造函数下的方法
    lis = Array.form(lis) // 返回值 转换后的新数组
    Array.form(lis, (item, index) => {
      return index
    })  // 拿到index数组
    let arr = [];
    Array.forem(lis, function(item, index) => {
      return index
    }, arr)  // this 指向 arr
    
    
    • Array.of()
    Array.of(1,2,3,4,5) // 返回新的数组
    
    • Array.isArray()
    Array.isArray('a') // 是否是数组 返回值 boolean
    

    同步 / 异步

    同步阻塞 异步非阻塞
    异步

    • setTimeout
    • 图片加载
    • ajax
    // es5 常用方法通过传入回调函数 
      function test (cb) {
        setTimeout(() => {
          console.log(111)
          cb && cb()
        })
      }
      test(function () {console.log(2222)})
    
      let p = new Promise((resolve, reject) => {
        resolve("111") 
      })
      console.log(p)  // 返回的promise对象 有状态和值
      // 三种状态 pending resolved(火狐是fullfilled) reject
      // primise对象有一个then方法 有俩个参数
      p.then((res) => {
        // 可以拿到resolve的值
      }, err =>{
    
      })
    
      p.then((res) => {
        // 可以拿到resolve的值
      }).catch((err) => {
        
      })
    
    

    总结:

    • 返回promise对象 so .then().then() 支持链式操作
    • 链式操作有俩个参数 .then 和.catch
    • 有三种状态 (pendding, resolved, reject) 会提供一个then函数,then 函数会有俩个参数(res, err), then函数有三种返回值(返回promise对象)
      • 没有返回值会拿到和之前状态一样promise对象
      • 有返回值 返回promise对象
      • 返回promise对象
    • 看起来优雅一些 解决了回调地域嵌套(不是终极)
    扩展Promise

    Promise.all()

     let p1 = new Promise((res, reg) => {
        res(1)
      })
      let p2 = new Promise((res, reg) => {
        // res(2)
        reg(22)
      })
      let p3 = new Promise((res, reg) => {
        res(3)
      })
    // 所有的promise都执行成功才会有结果
      Promise.all([p1, p2, p3]).then(res => {
        console.log(res, '111111111')
      }).catch(err => {
        console.log(err)
      })
    

    Prpmise.race()

    Prpmise.race([p1,p2,p3]).then((res) => {
      // 拿到最快的一个结果 不管成功失败
     console.log()
    })
    
    // 拿到成功状态(resolve)的promise
    Promise.resolve('1111')
    Promise.reject('1111')
    

    async/await

    await后面需要一个promise对象

    // 多个await等待执行 需要放在一个async里面
    // 异常捕获用try{}catch(e){}
    /// async await 将异步变成同步写法
    async function asyncFn() {
      try {
        let p1 =] await new Promise((res, reg) => {  // 拿到 resolve()传递的值
          setTimeout(() => {
           console.log(1)
           res(1) 
          })
        })
    
        let p2 = await new Promise((res, reg) => {
          setTimeout(() => {
           console.log(2)
           res(2) 
         })
        })
      } catch (e) {
        console.log(e)
      }
    }
    

    怎么把函数变成一个promise对象?

    function fn () {
      return new Promise((res) =>{
        res(111)
      });
    }
    
    
    ### babel 工具
    
    
    ### 主流打包工具
    webpack gulp grunt rollup
    
    ### tip
    JSON.parse(JSON.stringify()) // 对有undefined 和function的深拷贝有问题 会丢失项
    
    // 问题 这个为什么能实现深拷贝  等翻翻资料再说
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    相关文章

      网友评论

          本文标题:es6

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