1、遍历自身可枚举的属性 (可枚举,非继承属性)
Object.keys() 方法
该方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中的属性名的排列顺序和使用 for..in 遍历该对象时返回的顺序一致(两者的区别是 for ..in 还会枚举其原型链上的属性 )
/**Array 对象**/
let arr = ['a','b','c'];
console.log(Object.keys(arr)); // ['0','1','2']
/**Object 对象**/
let obj = {foo:'bar',baz:42};
console.log(Object.keys(obj)); // ["foo","baz"]
/**类数组 对象 随机 key 排序**/
let anObj ={100:'a',2:'b',7:'c'};
console.log(Object.keys); //['2','7','100']
/**getFoo 是一个不可枚举的属性**/
let my_obj = Object.create(
{},
{ getFoo : { value : function () { return this.foo } } }
);
my_obj.foo = 1;
console.log(Object.keys(my_obj)); // ['foo']
2、遍历自身的所有属性(可枚举,不可枚举,非继承属性)
Object.getOwnPropertyNames()方法
该方法返回一个由指定对象的所有自身属性组成的数组(包括不可枚举属性但不包括Symbol 值作为名称的属性)
let arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]
// 类数组对象
let obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]
// 使用 Array.forEach 输出属性名和属性值
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { console.log(val + " -> " + obj[val]);
});
// 输出
// 0 -> a
// 1 -> b
// 2 -> c
//不可枚举属性
let my_obj = Object.create({}, {
getFoo: { value: function() { return this.foo; },
enumerable: false
}
});
my_obj.foo = 1;
console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]
3、遍历可枚举的自身属性和继承属性 (可枚举,可继承的属性)
for in遍历对象的属性
let obj={ name:'张三',
age : '24',
getAge:function(){
console.log(this.age);
}
}
let arry ={};
for(var i in obj){
if(obj.hasOwnProperty(i)&& typeOf obj[i] != 'function'){
arry[i] = obj[i];
}
}
console.log(arry);
4、遍历所有的自身属性和继承属性
(function () {
let getAllPropertyNames = function (obj) {
let props = [];
do {
props = props.concat(Object.getOwnPropertyNames(obj));
}
while (obj = Object.getPrototypeOf(obj));
return props;
}
let propertys = getAllPropertyNames(window);
alert(propertys.length);
alert(propertys.join("\n"));
})()