ES6学习——新的语法:Symbols——Symbol.iterator

73 篇文章 23 订阅

ES6中内置了一些Symbol,其中最重要的一个恐怕就是Symbol.iterator了,相当于迭代器的接口,只有对象里有这个symbol的属性,才可以认为此对象是可迭代的。

我们先看一下规范中对这个symbol的描述:

A method that returns the default Iterator for an object. Called by the semantics of the for-of statement.


JS中哪些对象里实现了这个接口呢?常见的有Array,String,arguments,还有后面高级的数据结构,如Set,Map等。

var str = "",arr = [],num = 2;

console.log(str[Symbol.iterator]);//[Symbol.iterator]()
console.log(arr[Symbol.iterator]);//[Symbol.iterator]()
console.log(num[Symbol.iterator]);//undefined

具体应该如何实现这个itrator接口呢,规范在25.1章节中给出了定义,这里不具体探讨了,留在讲Iterator的章节介绍。我们知道Object对象不是一个iterator,那么如何把它变成一个iterator呢?看代码:


	'use strict';
	
	Object.prototype[Symbol.iterator] = function(){
		let index = 0;
		let propKeys = Reflect.ownKeys(obj);
		return {
			next() {
				if (index < propKeys.length) {
					let key = propKeys[index];
					index++;
					return { value: [key, obj[key]] };
				} else {
					return { done: true };
				}
			}
		}
	}
	
	var obj = {key1:1,key2:2,[Symbol()]:"s1"};
	
	console.log([...obj]);//用Spread操作符展开iterable对象


结果:


当然了我们这样直接在Object的prototype上添加方法不是一个好的做法,其实可以把这个过程提炼成一个函数,留给有兴趣的人自己去实现吧。


*以上全部代码在Firefox 43下通过测试

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值