1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

docs(Symbol): edit 属性名的遍历

This commit is contained in:
ruanyf 2019-11-08 10:53:57 +08:00
parent 6deab4b66c
commit 7145158b2a

View File

@ -280,9 +280,9 @@ const shapeType = {
## 属性名的遍历
Symbol 作为属性名,该属性不会出现在`for...in``for...of`循环中,也不会被`Object.keys()``Object.getOwnPropertyNames()``JSON.stringify()`返回。但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols`方法,可以获取指定对象的所有 Symbol 属性名。
Symbol 作为属性名,遍历对象的时候,该属性不会出现在`for...in``for...of`循环中,也不会被`Object.keys()``Object.getOwnPropertyNames()``JSON.stringify()`返回。
`Object.getOwnPropertySymbols`方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols()`方法,可以获取指定对象的所有 Symbol 属性名。该方法返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。
```javascript
const obj = {};
@ -298,31 +298,27 @@ objectSymbols
// [Symbol(a), Symbol(b)]
```
下面是另一个例子,`Object.getOwnPropertySymbols`方法与`for...in`循环、`Object.getOwnPropertyNames`方法进行对比的例子。
上面代码是`Object.getOwnPropertySymbols()`方法的示例,可以获取所有 Symbol 属性名。
下面是另一个例子,`Object.getOwnPropertySymbols()`方法与`for...in`循环、`Object.getOwnPropertyNames`方法进行对比的例子。
```javascript
const obj = {};
const foo = Symbol('foo');
let foo = Symbol("foo");
Object.defineProperty(obj, foo, {
value: "foobar",
});
obj[foo] = 'bar';
for (let i in obj) {
console.log(i); // 无输出
}
Object.getOwnPropertyNames(obj)
// []
Object.getOwnPropertySymbols(obj)
// [Symbol(foo)]
Object.getOwnPropertyNames(obj) // []
Object.getOwnPropertySymbols(obj) // [Symbol(foo)]
```
上面代码中,使用`Object.getOwnPropertyNames`方法得不到`Symbol`属性名,需要使用`Object.getOwnPropertySymbols`方法。
上面代码中,使用`for...in`循环和`Object.getOwnPropertyNames()`方法都得不到 Symbol 键名,需要使用`Object.getOwnPropertySymbols()`方法。
另一个新的 API`Reflect.ownKeys`方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
另一个新的 API`Reflect.ownKeys()`方法可以返回所有类型的键名,包括常规键名和 Symbol 键名。
```javascript
let obj = {
@ -335,7 +331,7 @@ Reflect.ownKeys(obj)
// ["enum", "nonEnum", Symbol(my_key)]
```
由于以 Symbol 值作为名称的属性,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
由于以 Symbol 值作为名,不会被常规方法遍历得到。我们可以利用这个特性,为对象定义一些非私有的、但又希望只用于内部的方法。
```javascript
let size = Symbol('size');