ES6的 for of 循环详解

ES6的 for of 循环详解

其实使用ES6中的 for of 循环还是有一定的要求,就是循环的对象必须有Symbol.iterator这个属性,而且属性值一定要是一个函数。

  • 循环的对象一定要有Symbol.iterator这个属性。
  • Symbol.iterator这个属性的值是一个函数
  • 函数的返回值,一定要符合迭代器。

示例1

let arr = [100, 200, 300, 40, 2]
console.log(arr[Symbol.iterator]) // ƒ values() { [native code] }
// 就是说 arr数组,是有这个Symbol.iterator这个属性的。而且属性值也是一个函数
for (const item of arr) {
	console.log(item) // 100 200 300 40 2
}

如果我们修改Symbol.iterator属性,而且为没有的对象添加这个属性

let arr = [10,20,30,4,5];
arr[Symbol.iterator] = function () {
	// 1.这里一定要返回一个对象,不然会报错的
	// 2.对象中一定要有next方法
	// 3.next方法调用,返回的是一个对象 { value: '', done: true/false }
	let i = 0
	console.log('Symbol.iterator被执行了');
	return {
		next() {
			if ( i > 50) {
				return { value:50, done: true }
			} else {
				i += 5
				return { value: i, done: false }
			}
		}
	}
}
for (const item of arr) {
	console.log(item); // 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55
}
// 这里的循环不再是数组的元素
  • 这里的循环不再是数组的元素
  • 而是我们 i += 5 每一次递增的 i。
  • 而且这里的 console.log(‘Symbol.iterator被执行了’)被执行了。

3. 我们也可以给不能使用 for of的对象添加 Symbol.iterator使其能使用 for of

let obj = {}
for (const item of obj) {
	console.log(item); // 这里会报错
}

上面的代码会报错

let obj = {}
obj[Symbol.iterator] = function (){
	let i = 10
	return {
		next(){
			i += 10
			if (i > 100) {
				return { value:i, done: true}
			} else {
				return { value: i, done: false}
			}
		}
	}
}
for (const item of obj) {
	console.log(item); // 20, 30, 40, 50, 60, 70, 80, 90 .....
}

4.总结

  • for of 循环的对象一定要有 Symbol.iterator属性
  • 而且属性值一定要是一个函数,而且返回值是一个迭代器。
  • 我们是可以修改Symbol.iterator属性值的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值