包含原型链上的属性
var o = {name:"www",age:1};
o.__proto__.parent = "parent";
for(var item in o){
console.log(o[item]);
}
// www、1、parent
不包含原型链上的属性
var o = {name:"www",age:1};
o.__proto__.parent = "parent";
for(var item in o){
if (o.hasOwnProperty(item)) {
console.log(o[item]);
}
}
// www、1
- for...of
利用 for...of 循环, 可以写出遍历任意对象的方法。 原生的JavaScript对象没有遍历接口, 无法使用 for...of 循环.
- 通过Generator函数objectEntries为它加上这个接口, 就可以用了
function* objectEntries(obj) {
let propKeys = Reflect.ownKeys(obj);
for (let propKey of propKeys) {
yield [propKey, obj[propKey]];
}
}
let jane = { first: 'Jane', last: 'Doe' };
for (let [key, value] of objectEntries(jane)) {
console.log(`${key}: ${value}`);
}
// first: Jane// last: Doe
- 将Generator函数加到对象的 Symbol.iterator 属性上面。
function* objectEntries() {
let propKeys = Object.keys(this);
for (let propKey of propKeys) {
yield [propKey, this[propKey]];
}
}
let jane = { first: 'Jane', last: 'Doe' };
jane[Symbol.iterator] = objectEntries;
for (let [key, value] of jane) {
console.log(`${key}: ${value}`);
}
// first: Jane// last: Doe
- Object.keys
Object.keys() 方法会返回一个由给定对象的所有可枚举自身属性的属性名组成的数组,数组中属性名的排列顺序和使用for-in
循环遍历该对象时返回的顺序一致 (顺序一致不包括数字属性)(两者的主要区别是 for-in 还会遍历出一个对象从其原型链上继承到的可枚举属性)。
var o = {name:'wuerchang',age:1};
o.__proto__.parent = "parent";
Object.keys(o).forEach(k => console.log(o[k]));
// wuerchang、1