对象遍历
for … of/in
遍历数组、对象、字符串、迭代器、类数组对象(arguments、DOM集合等)等可迭代对象。
遍历顺序不保证。
for in : 遍历全部(包含原型链中)可枚举属性。
for of : 遍历迭代对象定义的要迭代的值(obj.hasOwnProperty(key)为真)。
Object.prototype.objCustom = function() {
};
Array.prototype.arrCustom = function() {
};
const iterable = [3, 5, 7];
iterable.foo = 'hello';
for (const i in iterable) {
console.log(i); // 0, 1, 2, "foo", "arrCustom", "objCustom"
}
for (const i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i); // 0, 1, 2, "foo"
}
}
for (const i of iterable) {
console.log(i); // 3, 5, 7
}
即使循环提前终止(例如,通过break关键字),也不应重复使用生成器。退出循环后,生成器将关闭,尝试再次对其进行迭代不会产生任何其他结果。
const gen = (function *(){
yield 1;
yield 2;
yield 3;
})();
for (const o in gen) {
console.log(o);
break; // 关闭迭代器
}
// 迭代器不应再被使用 , 以下操作没有意义!
for (const o of gen) {
console.log(o); // 不会被调用
}
Object.keys
Object.keys(obj)方法(以for…in循环提供的顺序)返回给定对象obj自身可枚举属性名称的数组,并以与普通循环相同的顺序进行迭代。
const object1 = {
a: 'somestring',
b: 42,
c