minor
This commit is contained in:
parent
3ba28aa104
commit
34e9cdca36
10 changed files with 55 additions and 62 deletions
|
@ -192,9 +192,7 @@ alert( obj[0] ); // test (same property)
|
|||
|
||||
## Global symbols
|
||||
|
||||
As we've seen, usually all symbols are different, even if they have the same name. But sometimes we want same-named symbols to be same entities.
|
||||
|
||||
For instance, different parts of our application want to access symbol `"id"` meaning exactly the same property.
|
||||
As we've seen, usually all symbols are different, even if they have the same name. But sometimes we want same-named symbols to be same entities. For instance, different parts of our application want to access symbol `"id"` meaning exactly the same property.
|
||||
|
||||
To achieve that, there exists a *global symbol registry*. We can create symbols in it and access them later, and it guarantees that repeated accesses by the same name return exactly the same symbol.
|
||||
|
||||
|
@ -230,22 +228,29 @@ For global symbols, not only `Symbol.for(key)` returns a symbol by name, but the
|
|||
For instance:
|
||||
|
||||
```js run
|
||||
// get symbol by name
|
||||
let sym = Symbol.for("name");
|
||||
let sym2 = Symbol.for("id");
|
||||
|
||||
// get name from symbol
|
||||
// get name by symbol
|
||||
alert( Symbol.keyFor(sym) ); // name
|
||||
alert( Symbol.keyFor(sym2) ); // id
|
||||
```
|
||||
|
||||
The `Symbol.keyFor` internally uses the global symbol registry to look up the key for the symbol. So it doesn't work for non-global symbols. If the symbol is not global, it won't be able to find it and return `undefined`.
|
||||
|
||||
That said, any symbols have `description` property.
|
||||
|
||||
For instance:
|
||||
|
||||
```js run
|
||||
alert( Symbol.keyFor(Symbol.for("name")) ); // name, global symbol
|
||||
let globalSymbol = Symbol.for("name");
|
||||
let localSymbol = Symbol("name");
|
||||
|
||||
alert( Symbol.keyFor(Symbol("name2")) ); // undefined, the argument isn't a global symbol
|
||||
alert( Symbol.keyFor(globalSymbol) ); // name, global symbol
|
||||
alert( Symbol.keyFor(localSymbol) ); // undefined, not global
|
||||
|
||||
alert( localSymbol.description ); // name
|
||||
```
|
||||
|
||||
## System symbols
|
||||
|
@ -281,4 +286,4 @@ Symbols have two main use cases:
|
|||
|
||||
2. There are many system symbols used by JavaScript which are accessible as `Symbol.*`. We can use them to alter some built-in behaviors. For instance, later in the tutorial we'll use `Symbol.iterator` for [iterables](info:iterable), `Symbol.toPrimitive` to setup [object-to-primitive conversion](info:object-toprimitive) and so on.
|
||||
|
||||
Technically, symbols are not 100% hidden. There is a built-in method [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) that allows us to get all symbols. Also there is a method named [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) that returns *all* keys of an object including symbolic ones. So they are not really hidden. But most libraries, built-in methods and syntax constructs adhere to a common agreement that they are. And the one who explicitly calls the aforementioned methods probably understands well what he's doing.
|
||||
Technically, symbols are not 100% hidden. There is a built-in method [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) that allows us to get all symbols. Also there is a method named [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) that returns *all* keys of an object including symbolic ones. So they are not really hidden. But most libraries, built-in functions and syntax constructs don't use these methods.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue