Object.getOwnPropertyNames()
其返回结果与Object.keys()对应,但是他得特性与其相反,会返回对象得所有属性,包括了不可枚举属性
var arr = []; console.log(Object.getOwnPropertyNames(arr)); // ['length'] Object.getOwnPropertyDescriptor(arr,"length").enumerable // false 复制代码
上面我声明了一个空数组,而使用Object.getOwnPropertyNames()方法,返回了length,而length属性的enumerable正是false
Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols()会返回对象内的所有Symbol属性,返回形式依旧是数组,值得注意的是,在对象初始化的时候,内部是不会包含任何Symbol属性
let obj = { name:"obj" } Object.getOwnPropertySymbols(obj) // [] 复制代码
所以我初始化一个对象,通过这个方法返回的是一个空数组
let sym = Symbol() console.log(sym) obj[sym] = "hogskin" Object.getOwnPropertySymbols(obj) // Symbol() 复制代码
我在后面新建symbol,再为上面声明好的对象添加进去,通过遍历得到Symbol()
Reflect.ownKeys()
Reflect.ownKeys()返回的是一个大杂烩数组,即包含了对象的所有属性,无论是否可枚举还是属性是symbol,还是继承,将所有的属性返回
let arr = [0,31,2] Reflect.ownKeys(arr) // ['0', '1', '2', 'length'] 复制代码
上面的例子声明了一个数组,返回的是数组下标和length属性。
区分
为了跟好的记忆理解并掌握这七种方法,我根据遍历目标,返回形式,遍历值三个维度将七种方法区分起来。
根据遍历目标区分
| 遍历目标 | 方法 |
遍历对象本身的可枚举属性不包含继承来的属性(不包括Symbol()) |
Object.keys(),Object.values(),Object.entries() |
遍历对象本身的可枚举属性包括继承来的属性(不包括Symbol()) |
for...in |
遍历对象本身的所有属性(不包括Symbol()) |
Object.getOwnPropertyNames() |
遍历对象的Symbol()属性 |
Object.getOwnPropertySymbols() |
| 遍历对象的所有属性 | Reflect.ownKeys() |
根据返回值区分
| 返回值 | 方法 |
| 返回数组 | `Object.keys(),Object.values(),Object.entries(),Object.getOwnPropertyNames(),Object.getOwnPropertySymbols(),Reflect.ownKeys() |
| 不返回值 | for...in |
根据遍历值区分
| 遍历值 | 方法 |
| 遍历属性 | Reflect.ownKeys(),Object.getOwnPropertyNames(),Object.keys() |
| 遍历属性值 | Object.getOwnPropertySymbols(),Object.values() |
| 遍历全部 | for...in,Object.entries() |