• ES6学习笔记(三):与迭代相关的新东东


    Symbol

    概念

    Symbol:一种新的原始数据类型,表示独一无二的值。

    注意:Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。

    // 没有参数的情况
    var s1 = Symbol();
    var s2 = Symbol();
    
    s1 === s2 // false
    
    // 有参数的情况
    var s1 = Symbol("foo");
    var s2 = Symbol("foo");
    
    s1 === s2 // false
    

    作为属性的Symbol

    三种写法:

    var mySymbol = Symbol();
    
    // 第一种写法
    var a = {};
    a[mySymbol] = 'Hello!';
    
    // 第二种写法
    var a = {
      [mySymbol]: 'Hello!'
    };
    
    // 第三种写法
    var a = {};
    Object.defineProperty(a, mySymbol, { value: 'Hello!' });
    
    // 以上写法都得到同样结果
    a[mySymbol] // "Hello!"
    

    注意,Symbol值作为对象属性名时,不能用点运算符。

    Symbol属性名的遍历

    Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名。
    Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名。

    Symbol.for(),Symbol.keyFor()

    Symbol.for(key): 返回一个命名为key的Symbol值,如果没有则创建。可使不同变量使用同一个Symbol
    Symbol.keyFor(value): for的逆操作

    Set和Map数据类型

    Set

    概念:类似数组,但是没有重复的值
    初始化: new Set([1,2,3,4,4])

    注意:在Set内部,两个NaN是相等。而两个空对象不相等,所以它们被视为两个值。

    set的属性和方法

    Set.prototype.constructor
    Set.prototype.size // 获取成员总数

    实例方法:
    1.操作方法
    add():添加某个值,返回Set结构本身。
    delete():删除某个值,返回一个布尔值,表示删除是否成功。
    has():返回一个布尔值,表示该值是否为Set的成员。
    clear():清除所有成员,没有返回值。

    2.遍历方法
    keys():返回键名的遍历器
    values():返回键值的遍历器
    entries():返回键值对的遍历器
    forEach():使用回调函数遍历每个成员

    WeakSet

    概念:也是set数据类型,但是成员只能是对象
    特点:无法引用WeakSet的成员,因此WeakSet是不可遍历的

    Map

    概念:类似对象,但是键不限于字符串
    初始化:new Map(Object or Array) Object或Array必须是形似键值对集合的

    var map = new Map([['name', '张三'], ['title', 'Author']]);
    
    map.size // 2
    map.has('name') // true
    map.get('name') // "张三"
    map.has('title') // true
    map.get('title') // "Author"
    

    Map属性和方法:

    size属性:返回Map结构的成员总数。

    1.操作方法:

    set(key, value):设置键值对
    get(key):获取对应键的值
    has(key):是否有对应键
    delete(key):删除对应键
    clear():清除所有成员

    2.遍历方法
    keys():返回键名的遍历器
    values():返回键值的遍历器
    entries():返回键值对的遍历器
    forEach():使用回调函数遍历每个成员

    需要特别注意的是,Map的遍历顺序就是插入顺序。

    问题:map要使用数组的方法怎么用更方便?

    let map1 = new Map(
      [...map0].filter(([k, v]) => k < 3)
    );
    

    WeakMap

    概念:也是Map数据类型,但是成员只能是对象
    特点:键名所指向的对象,不计入垃圾回收机制

    WeakMap与Map在API上的区别:
    一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;
    二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。
    因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。

    Iterator

    概念:

    1.适用对象:Array、Map、Set、某些类似数组的Object
    2.作用
    Iterator的作用有三个:
    一是为各种数据结构,提供一个统一的、简便的访问接口;
    二是使得数据结构的成员能够按某种次序排列;
    三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。

    凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。

    一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。

    调用场合

    1.解构赋值
    2.扩展运算符
    3.yield
    4.所以任何接受数组作为参数的场合,其实都调用了遍历器接口。

    字符串的Iterator

    for...of

    遍历拥有Iterator接口的集合
    适用范围:数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。

    for...in循环有几个缺点:
    1.数组的键名是数字,但是for...in遍历会转化成字符串
    2.不止遍历自身,还会遍历原型链上的属性
    3.某些情况下,会以任意顺序遍历

  • 相关阅读:
    C# WPF定时器
    C#处理JSON数据
    SQL-乐观锁,悲观锁之于并发
    C# 集合-并发处理-锁OR线程
    C# 生成二维码,彩色二维码,带有Logo的二维码及普通条形码
    C# (事件触发)回调函数,完美处理各类疑难杂症!
    C# Lambda表达式
    C# 匿名方法
    浅谈C# 匿名变量
    鸡兔同笼
  • 原文地址:https://www.cnblogs.com/shuiyi/p/5891174.html
Copyright © 2020-2023  润新知