es6学习笔记

iterator迭代器

对于可迭代的数据解构,ES6在内部部署了一个[Symbol.iterator]属性,它是一个函数,执行后会返回iterator对象(也叫迭代器对象),而生成iterator对象[Symbol.iterator]属性叫iterator接口,有这个接口的数据结构即被视为可迭代的

数组中的Symbol.iterator方法(iterator接口)默认部署在数组原型上:

iterator迭代器是一个对象,它具有一个next方法,next方法返回又会返回一个对象,有value和done两个属性,value即每次迭代之后返回的值,而done表示是否还需要再次循环,可以看到当value为undefined时,done为true表示循环终止。

  • 可迭代的数据结构会有一个[Symbol.iterator]方法
  • [Symbol.iterator]执行后返回一个iterator对象
  • iterator对象有一个next方法
  • 执行一次next方法(消耗一次迭代器)会返回一个有value,done属性的对象

Promise

回调函数

JS是单线程的,因为多个线程改变DOM的话会导致页面紊乱,所以设计为一个单线程的语言,但是浏览器是多线程的,这使得JS同时具有异步的操作,即定时器,请求,事件监听等,而这个时候就需要一套事件的处理机制去决定这些事件的顺序,即Event Loop(事件循环),使用回调函数处理异步请求相当于把你的回调函数置于了一个黑盒,虽然你声明了等到收到响应后执行你提供的回调函数,可是你并不知道这个第三方库会在什么具体会怎么执行回调函数。

回调函数的缺点

  • 多重嵌套,导致回调地狱

  • 代码跳跃,并非人类习惯的思维模式

  • 信任问题,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行)

  • 第三方库可能没有提供错误处理

  • 不清楚回调是否都是异步调用的(可以同步调用ajax,在收到响应前会阻塞整个线程,会陷入假死状态,非常不推荐)

Promise

Promise是一个构造函数,通过new关键字创建一个Promise的实例。

1.多重嵌套,导致回调地狱

Promise在设计的时候引入了链式调用的概念,每个then方法同样也是一个Promise,因此可以无限链式调用下去,配合箭头函数,明显的比之前回调函数的多层嵌套优雅很多

2.信任问题,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行)

Promise本身是一个状态机,具有以下3个状态

  • pending(等待)
  • fulfilled(成功)
  • rejected(拒绝)

当请求发送没有得到响应的时候为pending状态,得到响应后会resolve(决议)当前这个Promise实例,将它变为fulfilled/rejected(大部分情况会变为fulfilled)

当请求发生错误后会执行reject(拒绝)将这个Promise实例变为rejected状态

一个Promise实例的状态只能从pending => fulfilled 或者从 pending => rejected,即当一个Promise实例从pending状态改变后,就不会再改变了(不存在fulfilled => rejected 或 rejected => fulfilled)

Module

ES6 Module使用import关键字导入模块,export关键字导出模块,它还有以下特点

1.ES6 Module是静态的,也就是说它是在编译阶段运行,和var以及function一样具有提升效果(这个特点使得它支持tree shaking)

2.自动采用严格模式(顶层的this返回undefined)

3.ES6 Module支持使用export {<变量>}导出具名的接口,或者export default导出匿名的接口

export default这种导出的语法其实只是指定了一个命名导出,而它的名字叫default,换句话说,将模块的导出的名字重命名为default,也可以使用import <变量> from <路径> 这种语法导入

Object.assign

Object.assign遍历需要合并给target的对象(即sourece对象的集合)的属性,用等号进行赋值,这里遍历{a:1}将属性a和值数字1赋值给target对象,然后再遍历{b:2}将属性b和值数字2赋值给target对象

  • Object.assign是浅拷贝,对于值是引用类型的属性,拷贝仍旧的是它的引用

  • 可以拷贝Symbol属性

  • 不能拷贝不可枚举的属性

  • Object.assign保证target始终是一个对象,如果传入一个基本类型,会转为基本包装类型,null/undefined没有基本包装类型,所以传入会报错

  • source参数如果是不可枚举的数据类型会忽略合并(字符串类型被认为是可枚举的,因为内部有iterator接口)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值