一.学过的循环(遍历)
单纯的循环:for,while,do…while…,forEach,for…in…
1.for循环写法太麻烦,while更麻烦,本来for循环就是while循环的紧凑的写法。
2.forEach没有返回值,不支持break关键字跳出循环。
主要适用于遍历数组
3.for…in…数组的键名是数字,但是for…in循环是以字符串作为键名,遍历对象,对象的属性名都是字符串。
for…in循环主要是为遍历对象而设计的,不适用于遍历数组
for…in遍历数组和字符串时,会将数组和字符串的索引转换为字符串再进行遍历
4.for…of循环相比上面几种做法,有一些显著的优点
有着同for…in一样的简洁语法,但是没有for…in那些缺点
for…of遍历数组很方便,直接遍历数组的每一项的值,但是不能遍历对象
不同于forEach方法,它可以与break、continue和return配合使用
提供了遍历所有数据结构的统一操作接口.
二.for…of…循环
1.for…of的基本控制结构
// const arr = [1, 2, 3, 4, 5];
// for (let value of arr) { //value数组项的值 arr遍历的数组对象
// console.log(value);
// }
带索引遍历数组项的方法for(let [index,item] of arr.entries()) {
console.log(index,item);
}
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5
2.那些类型可以使用for…of遍历
具有遍历器Iterator接口的数据类型可以使用 for…of
遍历器Iterator它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)
意思:只要当前的数据类型具有iterator接口,可以使用for..of进行遍历。
怎样测试数据类型具有iterator接口
一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for…of循环遍历它的成员。
// let str = ‘abcde’;
// let arr = [‘zhangsan’, ‘lisi’, ‘wangwu’];
// let obj = {
// a: 1,
// b: 2,
// c: 3
// };
// console.log(str[Symbol.iterator]); //存在ok
// console.log(arr[Symbol.iterator]); //存在ok
// console.log(obj[Symbol.iterator]); //undefined 不可以,对象不具有Iterator接口
// for (let v of str) {
// console.log(v);
// }
// for (let v of obj) {
// console.log(v); //报错, obj is not iterable
// }