一、拓展运算符在对象中使用
    (1)结构赋值,只能放在最后一个参数前(且必须是个变量名,否则会报错Rest element must be last element),产生一个新对象,用于搜集尚未被读取的自身可遍历属性

    1. let o = {x: 1, y: 2, z: 3};
    2. let {x, ...obj} = o;
    3. console.log(obj) // => {y: 2, z: 3}

    注意点:拓展符在解构赋值中,只能搜集自身可遍历属性常规解构赋值,可读取原型链上的属性。

    1. let o = Object.create({x: 1, y: 2, z: 3});
    2. let {x, ...newObj} = o;
    3. console.log(x, newObj) // 1, {}
    1. 2)对象字面量中展开属性,取出对象所有自身可遍历属性,拷贝到当前对象中。<br />等同于使用Object.assign( { }, obj ) == { ...obj }<br />1、前面同名属性会被覆盖。<br />2、如果有取值函数,会先执行然后再赋值。
    1. let a = {a :'a'},
    2. b = {b: 'b', c: 'c'};
    3. let obj = {...a, ...b};
    4. console.log(obj) // => {a: "a", b: "b", c: "c"}
    1. 数组也是对象,也可以在对象中展开
    1. let o = { ...['a', 'b', 'c'] };
    2. console.log(o) // => {'1' : 'a', '2' : 'b', '3' : 'c'}
    1. 如果拓展运算后面是非对象类型,只有字符串会产生效果(字符串包装对象有可遍历自身属性,booleannumber类型对象没有),undefinednull不会报错(作为解构对象的时候会报错,Cannot destructure property 'x' of 'undefined'

    二、Iterator 迭代器
    不同数据结构提供了统一迭代接口(统一访问机制),es6提供了Iterator接口
    1、iterator作用:
    (1)提供一种遍历不同数据结构的接口
    (2)能使数据结构成员按某种顺序排列
    (3)提供一种新遍历方法 for … of(Iterator主要供for … of消费,for … of会主动调用Iterator接口
    2、遍历过程:
    (1)创建一个指针对象,指向数据结构起始位置(迭代器本质上是一个指针对象)
    (2)每次调用迭代器的next方法,会返回当前迭代信息,包括了value(当前元素的值)、done(表示遍历是否结束)

    3、iterable
    有些数据结构原生含有Symbol.iterator方法(遍历器生成函数),部署了iterator接口,可以直接使用for…of(object没有Symbol.iterator属性)。
    原生具备Symbol.iterator属性的数据结构有:
    array
    arguments
    nodeList
    map
    weakMap
    set
    weakSet
    TypedArray
    string

    object本身是一种无序的数据结构,不知道哪个属性先遍历,哪个后遍历,所以没有部署遍历器接口。为对象部署遍历接口是一种线性转换,是将对象当作map结构来操作,而es6中已经提供了map结构。
    如果非要用for…of来遍历对象的话,可以手动添加一个遍历器生成器函数。

    1. let obj = {
    2. '0' : 0,
    3. '1' : 1,
    4. '2' : 2,
    5. '3' : 3,
    6. [Symbol.iterator](){
    7. let len = Object.keys(this).length,
    8. index = 0,
    9. _this = this;
    10. return {
    11. next(){
    12. let res = index < len ?
    13. { value: _this[index++], done : false }:
    14. { value: undefined, done : true};
    15. return res
    16. }
    17. }
    18. }
    19. }
    20. for(let val of obj){
    21. console.log(val)
    22. }
    1. 拓展运算符用到了iterator接口