# Symbol

ES6 新增的一种原始类型,用于唯一的不可修改的,并且也可以用来用作 Object 的 key 值。

let symbol = Symbol();
console.log(typeof symbol); // symbol
let symbol2 = Symbol("xxx");
console.log(typeof symbol2); // symbol
let symbol3 = Symbol(666);
console.log(typeof symbol3); // symbol

该类型的值不可枚举。

# Symbol 的方法

  1. for(key)

    从 Symbol 类型中查找指定的 key,如果存在则返回,不存在就创建并返回。

    let symbol = Symbol.for("foo"); // 创建
    console.log(symbol); // Symbol(foo)
    let result = Symbol.for("foo"); // 查找
    console.log(symbol); // Symbol(foo)
  2. keyFor(sym)

    方法用来获取 symbol 注册表中与某个 symbol 关联的键

# 迭代器

迭代器的三种作用:

  • 为各种数据结构,提供一个统一的、筒便的访问接口

  • 使得数据结构的成员能够按某种次序排列。

  • ES6 新增了 for...of 循环语句,用于遍历迭代器。

# Iterator 接口

JavaScript 中迭代器是一个对象,该对象提供 next 方法用于返回序列中的下一项。该啊方法包含 done 和 value 两个属性的对象。

创建一个迭代器:

function fn(array) {
  var index = 0;
  return {
    next: function () {
      return index < array.length
        ? {
            // 是否迭代完毕
            done: false,
            value: array[index++],
          }
        : {
            done: true,
          };
    },
  };
}
let arr = ["tom", "king", "luck"];
let iterator = fn(arr);
console.log(iterator.next()); // { done: false, value: 'tom' }
console.log(iterator.next()); // { done: false, value: 'king' }
console.log(iterator.next()); // { done: false, value: 'luck' }
console.log(iterator.next()); // { done: true }

在 JavaScript 中原生具有 iterator 接口的数据结构:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象
  • ....

# for...of 语句

// 遍历数组
let arr = [1, 2, 3, 4, 5];
for (let attr of arr) {
  //attr 得到的是数组的元素内容
  console.log(attr);
}
// 遍历 Set 集合
let set = new Set(ar);
for (let attr of set) {
  //attr 得到的是 Set 的元素内容
  console.log(attr);
}
// 遍历 map 集合
let num = 100,
  str = "张无忌",
  fun = function () {},
  obj = {};
map.set("num", num);
map.set("str", str);
map.set("fun", fun);
map.set("obj", obj);
for (let attr of map) {
  //attr 得到的是 Map 的 [key,value] 键值对数组
  console.log(attr);
}
// 遍历字符串
let string = "XiaoKang";
for (let attr of string) {
  //attr 得到的是字符串的每一个
  console.log(attr);
}
  • for...of 可以使用 breakcontinuereturn 语句
  • 默认情况下无法遍历对象
  • for...of 遍历对象无法遍历出对象原型上的方法,而 for...in 全部都可以遍历到

# 生成器

/**
 * 定义生成器函数
 * function* functionName (){
 *     yield 关键字
 * }
 * 生成器调用时,返回一个 Generator 对象
 */
function* fn() {}
let result = fn();
console.log(result);

# yield 表达式

yield 用于暂停或回复一个生成器函数。

// 定义一个生成器函数
function* fn() {
  let arr = ["tom", "king", "lucky"];
  for (let i = 0; i < arr.length; i++) {
    yield arr[i];
  }
}
// 生成器函数调用返回生成器对象
let generator = fn();
// 生成器对象就是 ES6 提供的迭代器
console.log(generator.next()); // { value: 'tom', done: false }
console.log(generator.next()); // { value: 'king', done: false }
console.log(generator.next()); // { value: 'lucky', done: false }
console.log(generator.next()); // { value: 'undefined', done: true }

# yield * 表达式

用于委托给另一个 Generator 或可迭代对象

function* g1() {
  yield 2;
  yield 3;
}
function* g2() {
  yield 1;
  yield* g1();
  yield 4;
}
// 生成器函数调用返回生成器对象
let generator = g2();
// 生成器对象就是 ES6 提供的迭代器
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: 4, done: false }
console.log(generator.next()); // { value: undefined, done: true }

# Generator 对象的方法

方法名称描述
next()返回一个包含属性 done 和 value 的对象。该方法也可以通过接受一个参数用以向生成器传值
return返回给定的值并结束生成器
throw用于向生成器抛出异常,并恢复生成器的执行,返回带有 done 即 value 两个属性的对象
更新于

请我喝[茶]~( ̄▽ ̄)~*

Dreamy.TZK 微信支付

微信支付

Dreamy.TZK 支付宝

支付宝