我们经常会用到循环,截止到ES6,我们总共有4种语法用于循环,但是它们各自的功能和使用场景却有很大区别。接下来我们讲对这4种语法一一讲解。首先我们来看一下有哪4种:

1: for(let i = 0; i < number; i ++){...}2: for(let key in object){...}3: for(let ){...}4: forEach(){...}

接下来我们一个一个地看:
1: for()

2: for...in
语法:

for(let key in object){...}

for...in以任意顺序来遍历一个对象除了Symbole类型外的可枚举属性。
这简单的一句话传达了太多信息,有如下几点:

1: 它的遍历是无序的2: 它遍历的是对象的属性名,而不是属性对应的值3: 它只遍历可枚举属性4: 在可枚举属性里面,不遍历Symbol类型

还有一点需要注意的是,

5: for...in不仅会遍历自己的属性,也会遍历继承的属性。

关于以上几个小点我们先来做一下知识的延伸,以便能更好地理解:

什么是无序遍历?

无序遍历是不能保证输出的数据顺序和放入的数据顺序是一样的,所以有可能一样,也有可能不一样。

什么样的属性是可枚举的?

首先可枚举属性是指那些内部 “可枚举(enumerable)” 标志设置为 true 的属性。

数据的枚举性遵循一下2条规律:

1: 直接通过赋值和属性初始化的属性,默认enumerable == true,是可枚举的2: 通过Object.defineProperty定义的属性,默认enumerable == false,则不可枚举;如果想要可枚举,需要手动改enumerable:true

for...in代码例子:

let obj = {name: 'nana', age: 20};for(let key in obj){    console.log(`${key}`); // name, age}

在for...in中对对象属性进行修改会怎样?

在MDN的页面上明确指出,我们在for...in的循环中,最好不要对属性进行添加,删除(通过delete),修改(通过Object.defineProperty)操作,因为在循环中进行这些操作都没有一个确定的结果。

3: for...of
4: forEach()