Iterator遍历器
ES6语法中,有序集合的数据类型已经有很多
- Array、May、Set、String、TypedArray、arguments、NodeList
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function each(data) {
let iterator = data[Symbol.iterator]()
// iterator.next() // 有数据返回 {value: 1, done: false}
// iterator.next()
// iterator.next()
// iterator.next() // 没有数据时返回 {value: undefind, done: true}
let item = {done: false}
while (!item.doone) {
item = iterator.next()
if (!item.done) {
console.log(item.value)
}
}
}
Symbol.iterator
并非都知道,因此使用for...of
语句,它已经包含了Symbol.iterator
1
2
3
4
5
function each(data) {
for (let item of data) {
console.log(item)
}
}
Map 与 Object 区别
在ES6(ECMAScript 2015)中,引入了Map
数据结构,它与普通对象(Plain Object)之间有一些区别。以下是它们的主要区别:
- 键类型:
- Map: 可以使用任意数据类型作为键,包括基本数据类型(如字符串、数字)以及对象、函数等。
- 普通对象: 键只能是字符串或符号。
- 键值对顺序:
- Map: 保留插入顺序,迭代时按照插入顺序进行。
- 普通对象: 不保证属性的顺序,可能会在不同 JavaScript 引擎中有所不同。
- 大小属性:
- Map: 有一个
size
属性,可以获取键值对的数量。 - 普通对象: 没有直接的方法获取属性的数量,需要手动计算。
- Map: 有一个
- 键值对数量:
- Map: 可以很容易地获取键值对的数量。
- 普通对象: 需要通过手动迭代对象的属性来计算键值对的数量。
- 继承:
- Map: 是一个可迭代的对象,它的原型链上只有
Object
。 - 普通对象: 除了具有
Object
的原型链外,还继承了一些额外的属性和方法。
- Map: 是一个可迭代的对象,它的原型链上只有
- 默认迭代器:
- Map: 默认迭代器是按插入顺序迭代键值对。
- 普通对象: 迭代时可能不按照插入顺序,具体取决于 JavaScript 引擎的实现。
- 性能:
- Map: 在某些场景下,特别是需要频繁添加或删除键值对的情况下,
Map
的性能可能优于普通对象。 - 普通对象: 在大多数情况下性能良好,但可能在特定操作上劣于
Map
。
- Map: 在某些场景下,特别是需要频繁添加或删除键值对的情况下,
总的来说,如果需要使用非字符串类型的键、需要按照插入顺序迭代键值对、或者需要更丰富的 API(如size
属性),则使用Map
更合适。如果只需要简单的键值对集合,并且键都是字符串,普通对象可能足够了。
Map Set 和 Object Array 有什么区别
Map
有序结构, key 为任意类型。Object
无序结构,key
为两种类型(字符串类型,Symbol
类型)Set
可以去重Map
和Set
比Object
、Array
整体执行效率要高