js遍历对象篇(二)-可枚举性和Symbol

系列链接:

js遍历对象篇(一)-for…in和Object.keys

js遍历对象篇(三)-Iterator

可枚举性(enumerable)

通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for...inObject.keys 等方法)。
Object.defineProperty()方法中 enumerable 键值默认为 false,
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。

const obj = {
  name: 'lsc',
  age: 21
}

// defineProperty添加属性默认不可枚举
// Object.defineProperty(obj, 'height', {
//   value: 187
// })
// console.log(Object.entries(obj)); // [ [ 'name', 'lsc' ], [ 'age', 21 ] ]

Object.defineProperty(obj, 'height', {
  enumerable: true, // 可枚举
  value: 187
})
console.log(Object.entries(obj)); // [ [ 'name', 'lsc' ], [ 'age', 21 ], [ 'height', 187 ] ]
复制代码

propertyIsEnumerable判断是否可枚举

每个对象都有一个propertyIsEnumerable 方法。此方法可以确定对象中指定的属性是否可以被 for...in 循环枚举,但是通过原型链继承的属性除外。

let arr = [1,2,3]
console.log(arr.propertyIsEnumerable(0)); // true
console.log(arr.propertyIsEnumerable('length')); // false
// js的内置方法和属性几乎都不可枚举
复制代码

Symbol

Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...infor...of循环中,也不会被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回。

// 写法1
let obj = {};
obj[s1] = "aaa";
console.log(obj);   // { [Symbol(s)]: 'sss' }
 
// 写法2
let obj2 = {
  [s2]: "bbb"
};
console.log(obj2);  
 
// 写法3
let obj3 = {};
Object.defineProperty(obj3, s3, {
  value: "ccc",
  enumerable: true
});
console.log(obj3); // { [Symbol(s333)]: 'ccc' }
复制代码

遍历方法介绍

1. Object.getOwnPropertyNames()

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。.

特点:可获取所有自身属性,包括不可枚举属性

// 这里只验证可获得不可枚举属性
const obj = {
  name: 'lsc',
  age: 21
}

// defineProperty添加属性默认不可枚举
Object.defineProperty(obj, 'height', {
  value: 187
})

console.log(Object.getOwnPropertyNames(obj)); // [ 'name', 'age', 'height' ]
复制代码

2. Object.getOwnPropertySymbols()

在给定对象自身上找到的所有 Symbol 属性的数组

特点:可获取自身所有Symbol属性,包括不可枚举的Symbol属性

let s1 = Symbol('sss111')
let s2 = Symbol('sss222')
const obj = {
  name: 'lsc',
  [s1]: '我是s1'
}
Object.defineProperty(obj, s2, {
  value: '我是s2' // s2为不可枚举的symbol属性
})
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(sss111), Symbol(sss222) ]
console.log(obj[s2]); // 我是s2
复制代码

3.Reflect.ownKeys()

Reflect.ownKeys() 方法返回一个由目标对象自身的属性键组成的数组。它的返回值相等于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))

特点:可获取所有自身属性,包括不可枚举属性和Symbol属性

const obj = {
  name: 'lsc',
  age: 21
}

// defineProperty添加属性默认不可枚举的普通属性
Object.defineProperty(obj, 'height', {
  value: 187
})

// defineProperty添加属性默认不可枚举的Symbol属性
let weight = Symbol('weight')
Object.defineProperty(obj, weight, {
  value: 170
})


console.log(Reflect.ownKeys(obj)); // [ 'name', 'age', 'height', Symbol(weight) ]
复制代码

但是三个方法都无法获取原型链属性

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享