Symbol 基础

2020-01-16  本文已影响0人  示十

Symbol 是基本数据类型。表示独一无二的值。

我们已经知道的原始数据类型还有哪些?

基本数据类型:
Boolean
Number
String
Undefined
Null

复杂数据类型:
Object

Symbol 值通过 Symbol 函数直接生成,不能使用 new

let s = Symbol();

console.log(typeof s); // symbol

不能使用 new 命令,否则会报错,这是因为 Symbol 是一个原始类型的值,不是对象,所以也不能添加对象

给 symbol 值添加描述

下面我们声明两个 symbol 值

let s1 = Symbol();
let s2 = Symbol();
console.log(s1); // Symbol()
console.log(s2); // Symbol()

可以看到打印出来都是 Symbol(),那么为了区分二者,可以为其添加描述,这样就比较清晰了:

let s1 = Symbol('foo');
let s2 = Symbol('bar');
console.log(s1); // Symbol(foo)
console.log(s2); // Symbol(bar)

symbol 值天生不相等

上面可以明显看到 s1 和 s2 表示的值是不同的

由于 symbol 参数只是对当前 Symbol 值的描述,所以,即使相同参数的 Symbol 值也是不相等的:

let s1 = Symbol('foo');
let s2 = Symbol('foo');
console.log(s1 === s2); // false

如何保证 symbol 值相等

如果我们就像让两个 symbol 值相等呢?

使用 Symbol.for() 语法可以保证两个 symbol 值相等:

const s1 = Symbol.for('foo');
const s2 = Symbol.for('foo');
console.log(s1 === s2); // true

原理: Symbol.for('foo') 会在全局环境下注册一个 key 为 foo 的 symbol 值,当再次使用 Symbol.for('foo') 语法创建 symbol 值的时候,会在全局环境中检索查找有没有登记过 key 为 foo 的 symbol 值,如果有,则返回该值,如果没有则创建一个新的值

由于 Symbol() 没有登记机制,所以每次调用都会返回不同的值

使用 Symbol.keyfor() 返回一个已登记的 Symbol 类型值的 key

const s1 = Symbol.for('foo');
const key = Symbol.keyFor(s1);
console.log(key); // foo

symbol 值的运算

symbol 值只能参与字符串(需要强行转换为 string)、布尔值的运算

let s1 = Symbol('foo');
console.log(`this is a symbol: ${s1.toString()}, and convert to Boolean: ${!!s1}`); // this is a symbol: Symbol(foo), and convert to Boolean: true
<!--或者强转-->
console.log(`this is a symbol: ${String(s1)}, and convert to Boolean: ${Boolean(s1)}`); // this is a symbol: Symbol(foo), and convert to Boolean: true

遍历 symbol

const s1 = Symbol('foo');
const s2 = Symbol('foo');

let obj = {}
obj.s1 = 'hello';
obj[s1] = 'nihao';
obj[s2] = 'neihou';

console.log(obj);
// s1: "hello"
// Symbol(foo): "nihao"
// Symbol(foo): "neihou"

通过下列两个方法可以遍历出 Symbol 值

const objKey = Object.getOwnPropertySymbols(obj);
const objKey = Reflect.ownKeys(obj); // ["s1", Symbol(foo), Symbol(foo)]
console.log(objKey); //[Symbol(foo), Symbol(foo)]

作用

上一篇下一篇

猜你喜欢

热点阅读