🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 关于Object的扩展 ES6 一共有 5 种方法可以遍历对象的属性。 * for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。 * Object.keys(obj) Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。 * Object.getOwnPropertyNames(obj) Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。 * Object.getOwnPropertySymbols(obj) Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。 * eflect.ownKeys(obj) Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。 以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。 首先遍历所有数值键,按照数值升序排列。 其次遍历所有字符串键,按照加入时间升序排列。 最后遍历所有 Symbol 键,按照加入时间升序排列。 涉及到的例题: 完成一个 flikerProps 方法,接受一个对象作为参数。可以把该对象的不可遍历属性变成可遍历属性;把可遍历属性变成不可遍历属性。例如: ~~~ const obj = {} const config1 = { enumerable: false, configurable: true } const config2 = { enumerable: true, configurable: true } Object.defineProperties(obj, { green: config1, red: config2, blue: config1, yellow: config2 }) console.log(Object.keys(obj)) // => ["red", "yellow"] flikerProps(obj) // 闪烁 console.log(Object.keys(obj)) // => ["green", "blue"] flikerProps(obj) // 闪烁 console.log(Object.keys(obj)) // => ["red", "yellow"] flikerProps(obj) // 闪烁 console.log(Object.keys(obj)) // => ["green", "blue"] ~~~ 解法: ~~~ const flikerProps = (obj) => { // console.log(obj); const totalProps = Object.getOwnPropertyNames(obj); const enumerableProps = Object.keys(obj); for (let i of totalProps) { Object.defineProperty(obj, i, {enumerable:enumerableProps.indexOf(i) === -1}) } } ~~~ 使用Object.keys 获取可遍历的属性数组,使用getOwnPropertyNames获取所有属性数组,再使用defineProperty设置属性。 ## 参考 [对象遍历](https://xiaogliu.github.io/2017/08/06/get-js-object-properties/)