for in / for of / forEach

for in 获得的属性名是字符串,遍历所以可枚举属性随机遍历,适合用在普通对象上,不要用在数组等有序对象上。
// Object.keys 类似,只不过 for in 能遍历到继承属性。
// Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。
// ES6 规定数字属性名按顺序且最先遍历,其他属性按书写顺序(字面量对象)或添加顺序遍历
// map set 都有序遍历


for of 直接遍历值,且能使用跳转语句,能用在字符串和 map,set,Iterator 上,不支持普通对象
Iterator done 之后 for of 就取不到了

forEach 不能使用 break continue return

向任意对象添加myObject[Symbol.iterator]方法,就可以 for of 遍历这个对象了:
jQuery.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
迭代器对象也可以实现可选的 .return() 和 .throw(exc) 方法。如果 for-of 循环过早退出会调用 .return() 方法,异常、break语句或 return 语句均可触发过早退出,如果迭代器需要执行一些清洁或释放资源的操作,可以在 .return() 方法中实现。