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