ES6-11【Symbol、iterator、forOf、typeArray】

一.补充知识

(1).result运算符对象拓展

在es7上面增加了对对象的拓展和展开

普通方式
var obj = {
    a: 1,
    b: 2,
    c: 3
}
var obj1 = {
    a: 4,
    d: 5,
    e: 6
}
var obj2 = {
}
Object.assign(obj2, obj, obj1);
log(obj2)
{
    a:4
    b:2
    c:3
    d:5
    e:6
}

es7
展开
var obj2 = {
    ...obj
    ...obj1
}
结果与上方一致

(2).检测代码调用动作

当系统用的instanceof的时候 系统实际调用的是symbol下的这些函数,其他symbol中内置的函数都是一样的,知道有这么一回事就行,其实就是检测用户的调用动作

foo instanceof Foo
Foo[Symbol.hasInstance](foo)

二.迭代器

(1).基础

数组上面存在了迭代器的方法

表现和使用形势

let arr = [1, 2, 3, 4]
log(arr); //[1,2,3,4]

let iter = arr[Symbol.iterator]
log(iter)//f values{[native code]}

let iter = arr[Symbol.iterator]()
log(iter)//Array Iterator{
    _proto__: Array Iterator
    next: f next()
}

next()

第一次next

log(iter.next()); {value: 1, done: false}

多次执行next

log(iter.next()); {value: 1, done: false}
log(iter.next()); {value: 2, done: false}
log(iter.next()); {value: 3, done: false}
log(iter.next()); {value: 4, done: false}
log(iter.next()); {value: undefined, done: true}

没有值done = ture代表迭代结束

总结:对数据解构读取的一种方式,有序的,连续的,基于拉取的一种消耗数据的组织方式

(2).数据解构

  1. [],{}
  2. arguments nodeList Map Set weakMap weekSet 类数组
  3. TypeArray二进制数据的缓存区,有点像数组

迭代器能够以上所有数据类型以一种统一的方式抽取迭代

迭代器原理

function makIterator(array){
    var nextIndex = 0;
    return {
        next: function(){
            return nextIndex < array.length ?
            {value: array[nextIndex++], done:false}:
            {value: undefined,done:true}    
        }
    }
}
var iter = makeIterator([1,2,3,4]);
log(iter.next());{value: 1, done: false}
log(iter.next());{value: 2, done: false}
log(iter.next());{value: 3, done: false}
log(iter.next());{value: 4, done: false}
log(iter.next());{value: undefined, done: true}

typeAarray

声明?进制数据

上面的那些除了typearray都是类数组,而这个是类型数组

log(TypeArray);//报错找不到
const tArray = new Int8
log(tArray)
[
    0:0
    ...
    7;0
]
赋值
tArray[0] = 100;
log(tArray);
[
    0:100
    ...
    7:0
]

forof

只要部署了iterator这个接口的全部都可以通过forof来进行迭代

这个取得是值 for in是下标

除了对象以外其余所有数据类型都有iterator接口

let arr = [1, 2, 3, 4]
fo(let i of arr){
    log(i)
}
//1234

对象使用forof

如果要迭代对象就要部署iterator接口

如果没有部署是会报错的

let obj = {
    start:[1, 3, 2, 4],
    end:[5,7,6],
    [Symbol.iterator](){
        let index= 0,
            arr = [...this.start,...this.end],
            len = arr.length
            return{
                next(){
                    if(index<len){
                        return{
                            value: arr[index++],
                            done: false
                        }
                    }else{
                        retrun{
                            value: undefined,
                            done: true
                        }
                    }
                }
            }
    }
}
for(var a of obj){
    log(a)
}
1324576

调用执行
var iter = obj[Symbol.iterator]();
log(iter.next())
log(iter.next())

很少会出现两者同时调用,如果同时调用两者互不影响,并不是拉取完了就不能for了

如果没有迭代器接口是无法展开的
log([...obj])//报错
如果有迭代器接口
log([...obj])//1324576

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值