对象遍历办法总结:
for...in
:遍历对象本身,蕴含继承,可枚举,不含 Symbol 的属性。Object.keys(obj)
:遍历对象本身, 不含继承,可枚举,不含 Symbol 的属性。【values,entries】Object.getOwnPropertyNames(obj)
:遍历对象本身, 不含继承, 不含 Symbol 的属性, 不论是否可枚举Object.getOwnPropertySymbols(obj)
: 遍历对象本身, 不含继承, 所有 Symbol 的属性, 不论是否可枚举Reflect.ownKeys(obj)
: 遍历对象本身,不含继承,所有键名,不论是否 Symbol 和可枚举。对象其余办法:
JSON.stringify()
:只串行化对象本身,不含继承,可枚举,不含 Symbol 属性。Object.assign()
:只拷贝对象本身,不含继承,可枚举属性, 不论是否是 Symbol
办法 | 本身属性 | 继承属性 | 可枚举属性 | Symbol 属性 |
---|---|---|---|---|
for...in.. |
是 | 是 | 必须 | 否 |
Object.keys() |
是 | 否 | 必须 | 否 |
Object.getOwnPropertyNames(obj) |
是 | 否 | 非必须 | 否 |
Object.getOwnPropertySymbols(obj) |
是 | 否 | 非必须 | 是 |
Reflect.ownKeys(obj) |
是 | 否 | 非必须 | 非必须 |
JSON.stringify() |
是 | 否 | 必须 | 否 |
Object.assign() |
是 | 否 | 必须 | 非必须 |
代码验证
- 创立父对象 protoObject 和子对象 myObject:
const protoObject = {
show_proto: '我是可枚举 - 父',
[Symbol('symbol_show_proto')]: '我是 Symbol,可枚举 - 父',
};
let myObject = {
show_my: '我是可枚举',
[Symbol('symbol_show_my')]: '我是 Symbol,可枚举',
};
Object.defineProperty(myObject, 'hidden_my', {
value: '我是不可枚举',
enumerable: false,
});
Object.defineProperty(myObject, Symbol('symbol_hidden_my'), {
value: '我是 Symbol,不可枚举',
enumerable: false,
});
Reflect.setPrototypeOf(myObject, protoObject);
2. 查看 protoObject 和 myObject:
3. 遍历: