Symbol

Symbol是什么
  • ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值

  • Symbol 值通过Symbol函数生成

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

由于Symbol类型是原始类型,是不能通过new Symbol()来创建对象的。

Symbol的注意事项
  • 尝试将一个 symbol值转换为一个 number值时,会抛出一个工ypeErroc,错误。

  • Object(symbol) == symbol表达式的结果返回true。

  • 阻止从一个symbol值隐式地创建一个新的string类型的属性名。

Symbol的方法
  • Symbol.for()方法

    • 作用 - 从symbol类型中查找指定的key

      • 如果存在这个key的话,返回
      • 如果不存在这个key的话,创建
  • Symbol.keyfor()方法

用于获取symbol注册表中与某个symbol关联的键。

Symbol与for…in

Symbols在 for …in迭代中不可枚举。另外,Object.getOwnPropertyNames()不会返回symbol对象的属性,但是可以使用Obiect.getOwnPropertySymbols()得到它们。

var obj = {};
//使用Symbol作为对象的属性名出现,是不可枚举的
obj[Symbol( "a")]= "a" ;
obj[Symbol.for("b")]="b";
obj["c"] = "c";
obj.d = "d";
for (var i in obj) {console.log(i); // logs "c" and "d"
}

迭代器

迭代器是什么

为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署lterator接口,就可以完成遍历操作。

作用:

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

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

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

lterator接口

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

  • 作用 - 用于返回序列中的下一项
  • 返回值 - 是一个对象
    • done属性 - 表示是否迭代完毕

      • false - 表示当前没有迭代完毕
      • true - 表示当前迭代完毕
    • 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 }

迭代器对象一旦被创建,就可以反复调用next()方法用于依次访问对象中的键值。

数据结构:

  • Array

  • Map

  • Set

  • String

  • TypedAccay.

  • 函数的arguments 对象

  • NodeList 对象

迭代协议
  • 可迭代协议

  • 迭代器协议

for…of语句

for…of语句的用法

遍历迭代器

// 遍历数组
let arr = [1, 2, 3, 4, 5];
for (let attr of arr) {// attr得到的是数组的元素内容console.log(attr);
}// 遍历Set集合
let set = new Set(arr);
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 = "dg";
for (let attr of string) {// attr得到的是字符串的每一个console.log(attr);
}
返回选代器对象的方法

返回一个迭代器对象

与forEach()方法的区别
  • forEach()方法无法跳出循环。换句话讲,break 语句和 continue语句无效。
  • for…of语句不仅可以使用break语句和 continue语句,还可以配合使用return语句。
与for…in语句的区别

用于遍历对象

  • for…in不仅遍历自身,还会遍历手动添加的,甚至包括原型链的。

  • 如果用于遍历数组的话,遍历得到的键名为字符串类型的数字值。

object.prototype.objcustom = function() {};
Array. prototype.arrcustom = function() {};
let iterable = [3,5,7];iterable.foo = 'hello' ;
let result = object.getOwnPropertyNames(iterable);
console.log(result);for (let i in iterable) {console.log(i);// logs o,1,2,"foo","arrcustom","objcustom"
}

生成器

Generator函数是什么

虽然可以自定义一个迭代器,但自定义的迭代器需要显式地维护其内部状态。而生成器提供了另一个强大的选择,其提供了允许定义一个包含自有迭代算法的函数,同时可以自动维护其内部状态。Generator函数可以作为生成一个迭代器的特殊函数,该函数被调用时返回一个 Generator对象,该对象是符合可迭代协议和迭代器协议的。

Generator函数与普通函数的区别在于:

  • function*这种声明方式会定义一个生成器函数,它返回一个 Generator对象。
  • yield关键字用来暂停和恢复一个生成器函数。
function*表达式

function*这种声明方式( function关键字后跟一个星号)会定义一个生成器函数(Generatorfunction ),它返回一个 Generator 对象。

生成器函数在执行时能暂停,后面又能从暂停处继续执行。

function* fn() {}
let result = fn();console.log(result);// Object [Generator] {}
yield表达式

用来暂停和恢复一个生成器函数。

[rv]=yield[expression]

// 定义一个生成器函数
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 或可迭代对象。

yield*[[expression]]

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两个属性的对象

next()、throw()、return()这三个方法本质上是同一件事,可以放在一起理解。它们的作用都是让Generator函数恢复执行,并且使用不同的语句替换yield表达式。

[ES6] 细化ES6之 -- 迭代器与生成器相关推荐

  1. [ES6] 细化ES6之 -- Promise对象

    Promise对象是什么 Promise对象是什么 ES6新增了Prormnise对象,该对象允许对延迟和异步操作流程进行控制.一个Promise对象就是一个代表了异步操作最终完成或者失败的对象. 开 ...

  2. [ES6] 细化ES6之 -- Class关键字

    类的声明 类是什么 类作为对象的模板,只是一个语法糖 class 关键字是让对象原型的写法更加清晰.更像面向对象编程的语法而已. // ES5创建构造函数 function Hero() {this. ...

  3. [ES6] 细化ES6之 -- 对象的扩展

    对象的属性 属性表示法 ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法 ES5 let name = "张无忌"; function sayMe() {cons ...

  4. [ES6] 细化ES6之 -- 函数的扩展

    函数参数的默认值 函数参数指定状认值 ES6 之前,不能直接为函数的参数指定默认值,如果定义了形参,不传递实参时导致形参为undefined,只能采用变通的方法. //ES5 function fn( ...

  5. [ES6] 细化ES6之 -- 数组的扩展

    扩展运算符 扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列.允许一个表达式在原地展开 // 定义一个数组 var arr ...

  6. [ES6] 细化ES6之 -- 字符串的扩展

    判断是否包含 都区分大小写 includes()方法 返回布尔值,表示是否找到了参数字符串 let str = 'hebei baodingshi lianchiqu' console.log(str ...

  7. [ES6] 细化ES6之 -- 变量的解构赋值

    变量的解构赋值 解构赋值是什么 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值 var/let [变量名称1,变量名称2,...] = 数组或对象 本质上,这种写法属于"模式 ...

  8. [ES6] 细化ES6之 -- ECMA6是什么

    ECMA6是什么 JavaScript 语言的下一代标准 ES6 的目标,是使得 JavaScript 语言可以用来编写大型的复杂的应用程序,成为企业级开发语言. ECMAScript 和 JavaS ...

  9. [ES6] 细化ES6之 -- async函数

    async函数是什么 用于简化Promise异步调用的操作 是 Generator 函数的语法糖 async/await类似于组合生成器和Promises function resloveAfter2 ...

最新文章

  1. linux的android工作室,Android工作室在启动时抛出错误,linux机器
  2. php中连接两个值,php - 如何从两个表的连接中选择一个值? - SO中文参考 - www.soinside.com...
  3. python调用cmd命令会弹出黑框_python 调用cmd,不显示cmd黑框
  4. Real-Time DNA Sequencing from Single Polymerase Molecules
  5. 熟悉常用的HDFS操作
  6. linux 总数 进程_linux性能监控之 top 家族(1)
  7. 属性动画基础之ValueAnimator
  8. objective-C CollectionView 加深(添加注册头部View)
  9. 【文末有奖】华为云“网红”语言Python课程来啦!
  10. pcm5102a解码芯片音质评测_一台可换芯片的解码机评测--对比PCM1794和CS4398芯片(下)...
  11. 计算机技术在工程施工中的应用,浅析计算机技术及网络在工程施工中的应用
  12. IDEA 中创建多级目录
  13. 无法启动此程序 因为计算机中丢失 msvcp71.dll,msvcp71.dll丢失怎样修复?计算机中丢失msvcp71.dll文件的解决方法...
  14. 实力封装:Unity打包AssetBundle(三)
  15. Java中的random
  16. 记事本java代码_Java记事本源代码(完整).doc
  17. 典型相关分析相关资料
  18. java是什么类型语言_java属于什么类型语言
  19. 嵌入式和单片机的区别在哪?
  20. 软件扫描出rsh漏洞,但是并无安装rsh服务,原因是为何?

热门文章

  1. python 进阶案例_【python3】while和for的进阶案例
  2. Linux 进程号 端口号 互找
  3. 最适合开发VR游戏大作的游戏引擎——Unity
  4. Linux系统格式化发fat32U盘密令,用diskpart命令格式化u盘为fat32的方法
  5. 7.16-7.22第二周
  6. 吴恩达深度学习笔记 2.6~2.9 logistic中的梯度下降
  7. 轻松逃脱某防火墙对ss的探测
  8. bzoj2101【Usaco2010 Dec】Treasure Chest 藏宝箱
  9. WPF调用图片路径,或资源图片
  10. 小白浅论JAVA数组中“for加强版”