首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

前端-Iterator:访问数据集合的统一接口

1 正题 某个数据集合部署了 Iterator接口,是指其 Symbol.iterator属性指向一个能返回 Iterator接口的函数。...任何默认使用遍历器访问数据集合的方法,都会调用此属性以得到遍历器对象,再按照设定的顺序依次访问该数据结构的成员(关于 Symbol.iterator请看最后一节的延伸阅读)。...其中 done是一个布尔值,表示遍历是否结束,结束为 true,否则 false。 遍历器接口的标准十分简洁,不提供诸如:操作内部指针、判断是否有值等等方法。...而 throw方法主要是配合 Generator函数使用,一般的遍历器对象用不到这个方法,所以不予介绍。...}); 对象没有默认的遍历器接口 为什么对象没有默认的遍历器接口?这要从两方面说明。一为遍历器是种线性处理结构,对于任何非线性的数据结构,部署了遍历器接口,就等于部署一种线性转换。

70330

可以迭代大部分数据类型的 for…of 为什么不能遍历普通对象?

可以看到,这些可被for of迭代的对象,都实现了一个Symbol(Symbol.iterator)方法,而普通对象没有这个方法。...简单来说,for of 语句创建一个循环来迭代可迭代的对象,可迭代的对象内部实现了Symbol.iterator方法,而普通对象没有实现这一方法,所以普通对象是不可迭代的。...而 iterator 的遍历过程,则是类似 Generator 的方式,迭代时不断调用next方法,返回一个包含value(值)和done属性(标识是否遍历结束)的对象。...迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。 不难发现,Symbol.iterator实现的就是一种迭代器模式。...集合对象内部实现了Symbol.iterator接口,供外部调用,而我们无需过多的关注集合对象内部的结构,需要处理集合对象内部的数据时,我们通过for of调用Symbol.iterator接口即可。

1.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    迭代器与 for of的使用和原理

    ,但有的时候不仅需要使用值还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。...对于数组,键名就是索引值。keys() 返回一个遍历器对象,用来遍历所有的键名。values() 返回一个遍历器对象,用来遍历所有的键值。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。

    1.5K30

    ES6 系列之迭代器与 for of

    ,比如有的时候我们仅需要数组中的值,但有的时候不仅需要使用值还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组...对于数组,键名就是索引值。 keys() 返回一个遍历器对象,用来遍历所有的键名。 values() 返回一个遍历器对象,用来遍历所有的键值。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。

    49910

    【JS】230-迭代器与 for of的使用和原理

    ,比如有的时候我们仅需要数组中的值,但有的时候不仅需要使用值还需要使用索引,ES6 为数组、Map、Set 集合内建了以下三种迭代器: entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组...对于数组,键名就是索引值。keys() 返回一个遍历器对象,用来遍历所有的键名。values() 返回一个遍历器对象,用来遍历所有的键值。...而且每个集合类型都有一个默认的迭代器,在 for-of 循环中,如果没有显式指定则使用默认的迭代器。...数组和 Set 集合的默认迭代器是 values() 方法,Map 集合的默认迭代器是 entries() 方法。...而之所以这么做,就要提到迭代器的 return 方法。 引用阮一峰老师的 ECMAScript 6 入门: 遍历器对象除了具有 next 方法,还可以具有 return 方法和 throw 方法。

    90141

    ES6之Iterator

    Iterator MDN:处理集合中的每个项是很常见的操作。JavaScript 提供了许多迭代集合的方法,从简单的for循环到map()和filter()。...结果对象有两个属性:一个是value表示下一次返回的值,另一个是Boolean类型的值done,当没有更多可返回的数据时返回true。迭代器对象内部本质其实就是存在一个指针,用来指向集合中值的位置。...其中 done 表示遍历是否结束,value 返回当前遍历的值。 可迭代协议 Symbol....: 属性 值 必选 [Symbol.iterator] 返回一个对象的无参函数,被返回对象符合迭代器协议 Y 如果让一个对象是可遍历的,就要遵守可迭代协议,该协议要求对象要部署一个以 Symbol.iterator...为 key 的键值对,而 value 就是一个无参函数,这个函数返回的对象要遵守迭代器协议。

    21820

    Iterator 和 for-of 循环

    这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。...本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。...方法被修改了,所以扩展运算符(...)返回的值变成了bye,而字符串本身还是hi。...其次,Set 结构遍历时,返回的是一个值,而 Map 结构遍历时,返回的是一个数组,该数组的两个成员分别为当前 Map 成员的键名和键值。...对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries方法。 keys() 返回一个遍历器对象,用来遍历所有的键名。

    56320

    别误会,Map不只是地图

    上集说到ES6中set方法,在ES6中除了增加set方法之外,还考虑到一种场景——键值对的存储,而map集合就是专门存储多个键值对(key value pair)的数据。...在map出现之前,我们使用的是对象的方式来存储键值对,键是属性名,值是属性值。键值对数据结合的特点就是:键不可重复。...//但是,它要求每一次迭代的结果必须是一个长度为2的数组,数组第一项表示键,数组第二项表示值 例:创建一个没有任何内容的map集合 const mp = new Map(); console.log...对象是引用值,它们的地址不同,所以不会覆盖,而a的原值1会被abc覆盖掉。...== undefined; //不等于undefined,说明值找到了 } //clear方法 clear() { this.

    62040

    es6 -- Iterator 和 for...of 循环

    这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,来处理所有不同的数据结构。...其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。 下面是一个模拟 next 方法返回值的例子。...方法被修改了,所以扩展运算符(...)返回的值变成了bye,而字符串本身还是hi。...其次,Set 结构遍历时,返回的是一个值,而 Map 结构遍历时,返回的是一个数组,该数组的两个成员分别为当前 Map 成员的键名和键值。...对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries方法。 keys() 返回一个遍历器对象,用来遍历所有的键名。

    76840

    介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

    集合(Set) ES6 新增的一种新的数据结构,类似于数组,但成员是唯一且无序的,没有重复的值。 Set 本身是一种构造函数,用来生成 Set 数据结构。...Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。...WeakSet WeakSet 对象允许你将弱引用对象储存在一个集合中 WeakSet 与 Set 的区别: WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以 WeakSet 对象中储存的对象值都是被弱引用的...字典(Map) 集合 与 字典 的区别: 共同点:集合、字典 可以储存不重复的值 不同点:集合 是以 [value, value]的形式储存元素,字典 是以 [key, value] 的形式储存 const...WeakMap WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。 注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。

    1.8K20

    ES6之Iterator遍历器

    其实iterator在以前是内置在JavaScript中,主要是Array和Object表示的集合数据结构使用。ES6新增了map和set数据结构,这样就有了四种数据集合。...就是返回一个包含value和done两个属性的对象。value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。...属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内。...var str = 'abc'; for(var val of str){ console.log(val); } 有了for of,很多遍历的操作都可以使用,配合entries、keys、values...,比如对象不能直接用for of遍历,我们可以用keys方法把对象的键变成数组去遍历。

    51440

    ES6-标准入门·Iterator 和 for of 循环

    Iterator 和 for of 循环 JavaScript 有四种表示“集合”和数据结构,分别是 Array、Object 和 ES6 新增的 Set、Map,遍历器(Iterator)就是为各种不同的数据结构提供统一访问机制的接口...默认的 Iterator 接口部署在 Symbol.iterator 属性上,调用 Symbol.iterator 方法,会得到当前数据结构默认的遍历器生成函数。...本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口就等于部署一种线性转换。...;其次,Set 结构遍历时返回的是一个值,而 Map 结构遍历时返回的是一个数组,该数组的两个成员分别为当前 Map 成员的键名和键值。...一种解决方法是,使用 Object.keys 方法将对象的键名生成一个数组,然后遍历这个数组: for (var key of Object.keys(someObject)) { console.log

    31210

    一文彻底搞懂迭代器与生成器函数

    在阅读本文之前,主要会从以下几点去探讨迭代器/生成器 迭代器是什么,想想为什么会有迭代器 生成器又是什么,它解决了什么样的问题 以实际例子阐述迭代器与生成器 正文开始......Symbol.iterator方法,再调用返回的next方法,最后得到当前的值 我们可以在控制台看下 数组是有这个Symbol.iterator属性的 从以上迭代器特征中,我们可以得知,数组是通过一个...本质上是通过生成器对象的prototype的Symbol.iterator连接了起来 生成器函数的return 当我们在生成器函数内部return时,那么当调用next迭代完所有的值时,继续调用next...控制多个函数按顺序执行 假设有一个场景,就是fn2依赖fn1的结果而决定是否是否执行,fn3依赖fn2的状态是否继续执行,那怎么设计呢?...点个赞,在看,转发,收藏等于学会,欢迎关注Web技术学苑,好好学习,天天向上!

    54620

    for...of循环的使用

    为什么报错了,报错的错误提示写的很清楚,因为object对象不是可迭代的,也就是说它不是可迭代对象。 这里遇到一个新的名词,什么是可迭代对象呢?...其中done属性表示是否完成,如果是true则表示完成,false或者不写则表示没有完成;value表示值,也就是for…of循环时每次使用的值,如果done为true时候则可以不写。...let object = { a: 1, b: 2, c: 3, [Symbol.iterator]: function() { let keys = Object.keys(this...for…of与for…in的区别 for…in遍历的是对象的可枚举属性,而for…of语句遍历的是可迭代对象所定义要迭代的数据。...由于for…in遍历的是对象的可枚举属性,所以对于数组来说打印的是键,而不是值: let array = ['a', 'b', 'c']; for (const value in array) {

    9410

    Iterator与Generator

    ES6 规定默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性中,如果一个数据结构存在 Symbol.iterator 属性,则该数据结构可遍历。...本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。...next 方法的参数yield 表达式本身没有返回值,或者说总是返回 undefined。next 方法可以带一个参数,该参数就会被当作上一个 yield 表达式的返回值。...通过 next 方法的参数,可以在 Generator 函数运行的不同阶段,从外部向内部注入不同的值,从而调整函数行为。...由于 next 方法的参数表示上一个 yield 表达式的返回值,所以在第一次使用 next 方法时,传递参数是无效的。

    39930
    领券