for..in可以将JavaScript中的对象的属性依次循环出来,当for..in作用于数组时得到的是该元素的下标,且该下标是一个String对象而不是一个Number对象。(注意:for..in实际上是历史遗留问题,其遍历的实际上是对象的属性,之所以能够遍历数组,是因为数组实际上是一个对象,而其属性就是下标,所以使用for..in遍历数组得到的下标是String类型)
2、for..of
for..of就是为了遍历集合而专门设计的,它只遍历数组的元素,并且当for..of直接遍历对象时会报错,for..of用于遍历对象需要使用Object.keys()才能正确遍历其属性(而Object.keys()方法实际上是将对象的属性键值以数组的形式返回了回来,实际上也是遍历数组。)
for-of循环每一次都会调用可迭代对象的next()方法,并将迭代器返回的结果对象的value属性存储在一个变量中,循环将持续执行这一过程直到返回对象的done属性为true。
![图片标题 图片说明](https://i-blog.csdnimg.cn/blog_migrate/8626177296b9fd44bdf29d7e05630e83.png)
![图片标题 图片说明](https://i-blog.csdnimg.cn/blog_migrate/3e4a78b62d805fbc8b565f92307592a0.png)
3.forEach是Iterable的内置方法,是一个高阶函数,其接受一个函数作为参数,每次迭代就回调该函数。是遍历Iterable(Array,Map,Set)最好的方式(但是相对于for..of有一个坏处就是 不能通过break退出循环)
1.
array: 数组对象,是使用单独的变量名来存储一系列的值
2.
Set: ES6 提供了新的数据结构。它类似于数组,但是 成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
// set值没有索引,无法通过索引找到某一项的值 size属性: 返回Set实例的成员总数。 add(value):添加某个值,返回 Set 结构本身 delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 has(value):返回一个布尔值,表示该值是否为Set的成员。 clear():清除所有成员,没有返回值。
Set转Array,使用展开运算符。
3.
Map: ES6 提供了新的数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 结构提供了“值—值”的对应。 size 属性: 返回 Map 结构的成员总数。 set(key, value): set方法设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。返回的是当前的Map对象 get(key): get方法读取key对应的键值,如果找不到key,返回undefined。 has(key): 返回一个布尔值,表示某个键是否在当前 Map 对象之中。 delete(key): 删除某个键,返回true。如果删除失败,返回false。 clear(): clear方法清除所有成员,没有返回值。
WeakMap,WeakSet没有entries、keys和values等方法,只能用对象最为键,其余和Map,Set相同
创建和使用这两个类是为了性能,WeakSet和WeakMap是弱化的(用对象作为键),没有强应用的键,使得js的垃圾回收器可以从中清除整个入口。