Commit 5a927fd9 authored by zhangfangli's avatar zhangfangli

map和object

parent f4a065ec
......@@ -266,21 +266,24 @@ Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除
| **next** | 一个无参数或者一个参数的函数,返回一个应当拥有以下两个属性的对象:<br />**done(boolean)**<br />如果迭代器可以产生序列中的下一个值,则为 false。<br />如果迭代器已将序列迭代完毕,则为 true。<br />这种情况下,value 是可选的,如果它依然存在,即为迭代结束之后的默认返回值。<br />**next()** 方法必须返回一个对象,<br />该对象应当有两个属性: done 和 value,如果返回了一个非对象值(比如 false 或 undefined),<br />则会抛出一个 [TypeError](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypeError) 异常("iterator.next() returned a non-object value")。 |
Iterator 迭代器是一种接口,为不同的数据结构提供统一的访问机制,这个访问机制主要是遍历,我们知道,在数组、在对象、在类数组、在map、在set里面,都可以用for of或者扩展运算符来得到一个数组或者是遍历当前的数据结构,为什么能够遍历的原因就是因为存在这个Iterator 迭代器这个东西,所以我们可以用for of来提供一个统一的遍历,因此这个底层或者是Itrator它最初是为了for of而设计的。
Iterator 迭代器是一种接口,为不同的数据结构提供统一的访问机制,这个访问机制主要是遍历,我们知道,在数组、在对象、在类数组、在map、在set里面,都可以用for of或者扩展运算符来得到一个数组或者是遍历当前的数据结构,为什么能够遍历的原因就是因为存在这个Iterator 迭代器这个东西,所以我们可以用for of来提供一个统一的遍历,因此这个底层或者是Itrator它最初是为了for of而设计的。
为了给所有的[数据结构](https://so.csdn.net/so/search?q=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84&spm=1001.2101.3001.7020)有一个统一的遍历接口,统一的访问机制,因此就产生了迭代器。<br />迭代器的特点:
- 按某种次序排列数据结构
- 为for of提供一个遍历支持
- 为不同的数据结构提供统一的访问机制(目的)
目前所有的内置可迭代对象如下:[String](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String)[Array](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array)[TypedArray](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)[Map](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map)[Set](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set)等,它们的原型对象都实现了 @@iterator 方法。对象(Object)之所以没有默认部署Iterator接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。<br />例如:由上面的学习,我们知道map的values() 返回的就是一个Iterator对象
```javascript
let map = new Map([
['name','zz'],
['age',15]
])
console.log(map.values().next()); // {value: 'zz', done: false}
['name','zz'],
['age',15]
])
console.log(map.values().next()); // {value: 'zz', done: false}
```
展开语法... :<br />其内部实现也使用了同样的迭代协议
```javascript
......@@ -299,29 +302,29 @@ console.log(it.next()); // {value: 's', done: false}
### 问题:obj is not iterable
```javascript
let obj = {
name:'张小张',
age:18
}
name:'张小张',
age:18
}
console.log([...obj]); // Uncaught TypeError: obj is not iterable
```
怎么做好利用展开值且不报错??<br />根据[mdn](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#%E8%BF%AD%E4%BB%A3%E5%99%A8%E7%A4%BA%E4%BE%8B)迭代器的介绍:<br />给obj加上一个属性[Symbol.iterator],且返回next()
```javascript
obj[Symbol.iterator] = function() {
let nextIndex = 0;
return {
next: function () {
let array = Object.values(obj)
return nextIndex < array.length ? {
value: array[nextIndex++],
done: false
} : {
done: true
};
}
};
}
let nextIndex = 0;
return {
next: function () {
let array = Object.values(obj)
return nextIndex < array.length ? {
value: array[nextIndex++],
done: false
} : {
done: true
};
}
};
}
console.log([...obj]) // ['张小张', 18]
console.log([...obj]) // ['张小张', 18]
```
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment