网站开发人员工资水平,公众号开发免费,老域名新网站推广,快手刷粉网站推广本人详细介绍了JS遍历对象N种方法#xff0c;欢迎关注收藏。遍历对象属性有五种方法#xff0c;下图为一个场景对比图。可以注意到两点#xff1a;只有for ... in 才可以遍历原型链属性#xff0c;且只能遍历可枚举属性。Object.getOwnPropertyNames Object.getOwnPropert…本人详细介绍了JS遍历对象N种方法欢迎关注收藏。遍历对象属性有五种方法下图为一个场景对比图。可以注意到两点只有for ... in 才可以遍历原型链属性且只能遍历可枚举属性。Object.getOwnPropertyNames Object.getOwnPropertySymbols Reflect.ownKeys.以上五种方法用如下代码来做例子let obj {enum_prop: enum_val,[Symbol(symbol)]: symbol
};Object.defineProperty(obj,
no_enum_prop,
{value: no_enum_val, enumerable: false});Object.getPrototypeOf(obj).proto_enum_prop proto_enum_prop;
Object.keys返回一个数组包含对象自身所有enumerable属性不含Symbol属性的键名。console.log(Object.keys(obj));
// 输出[enum_prop]
类似的其他两个函数为Object.values() 和Object.entries()。console.log(Object.values(obj));
// 输出[enum_val]
console.log(Object.entries(obj));
// 输出[[enum_prop: enum_val]]
for ... in循环遍历对象自身和prototype的可枚举属性不含Symbol属性for(let prop in obj){console.log(prop);
}
// 输出: enum_prop proto_enum_prop
Object.getOwnPropertyNames(obj)返回一个数组包含对象自身所有可枚举和不可枚举属性的不含Symbol属性的键名console.log(Object.getOwnPropertyNames(obj));
// 输出[enum_prop, no_enum_prop]
Object.getOwnPropertySymbols(obj)返回一个数组包含对象自身的所有Symbol属性的键名。console.log(Object.getOwnPropertySymbols(obj));
// 输出[Symbol(symbol)]
Reflect.ownKeys(obj)返回数组包含对象自身可枚举属性、不可枚举属性和Symbol属性。console.log(Reflect.ownKeys(obj));
// 输出[enum_prop, no_enum_prop, Symbol(symbol)]
对象属性的顺序对于对象属性的顺序经常看到的说法是ES5 没有制定ES6按照如下方式值为整形的按照升序排序。普通字符串的按照插入顺序。Symbol按照插入顺序。但是以下是我从MDN上找到for ... in: 返回的属性顺序是不确定的。以下来自MDN文档Object.keys(obj)返回顺序与for ... in 相同。以下来自MDN文档Object.getOwnPropertyNames(obj)返回顺序中可枚举属性和 for ...in相同不可枚举属性的顺序没有定义参见Object.getOwnPropertySymbols和Reflect.ownKeysMDN文档没有说明顺序。总结来说避免依赖对象属性的顺序。