# for in
主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性
var obj = { name: "peinkid", age: 18 };
// 增加不可枚举的属性 action
Object.defineProperty(obj, "action", { value: "test", enumerable: false });
// 通过原型链增加属性,为一个函数
Object.prototype.myproto1 = function() {
console.log("my name is peinkid");
};
// 通过原型链增加属性,为一个number
Object.prototype.myproto2 = 2;
for (let i in obj) {
console.log(i);
}
/* 输出
name
age
myproto1
myproto2
*/
# 总结
for in 主要用于遍历对象的可枚举属性,包括自有属性、继承自原型的属性,示例中的属性 action 为不可枚举,所以没有输出。
# Object.keys
此方法返回一个数组,元素均为对象自有可枚举的属性
var obj = { name: "peinkid", age: 18 };
// 增加不可枚举的属性 action
Object.defineProperty(obj, "action", { value: "test", enumerable: false });
// 通过原型链增加属性,为一个函数
Object.prototype.myproto1 = function() {
console.log("my name is peinkid");
};
// 通过原型链增加属性,为一个number
Object.prototype.myproto2 = 2;
console.log(Object.keys(obj));
/* 输出
['name','age']
*/
# 总结
Object.keys 主要用于遍历对象自有的可枚举属性,不包括继承自原型的属性和不可枚举的属性。
# Object.getOwnPropertyNames
此方法用于返回对象的自有属性,包括可枚举和不可枚举的属性
var obj = { name: "peinkid", age: 18 };
// 增加不可枚举的属性 action
Object.defineProperty(obj, "action", { value: "test", enumerable: false });
// 通过原型链增加属性,为一个函数
Object.prototype.myproto1 = function() {
console.log("my name is peinkid");
};
// 通过原型链增加属性,为一个number
Object.prototype.myproto2 = 2;
console.log(Object.getOwnPropertyNames(obj));
/* 输出
['name','age','action']
*/
# 总结
Object.getOwnPropertyNames 主要用于返回对象自有属性,包括可枚举和不可枚举的属性,不包括继承自原型的属性。
最后,Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in、for...of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回,可以使用Object.getOwnPropertySymbols()获取,或者使用Reflect.ownKeys()方法可以返回所有类型的键名,包括常规键名和 Symbol 键名,Emm...Symbol之后有空再做一下总结吧~