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 值
- Object.getOwnPropertySymbols()
- Reflect.ownKeys()
const objKey = Object.getOwnPropertySymbols(obj);
const objKey = Reflect.ownKeys(obj); // ["s1", Symbol(foo), Symbol(foo)]
console.log(objKey); //[Symbol(foo), Symbol(foo)]
作用
- 作为属性名,不能用点运算符,只能用方括号([])
- 定义常量
网友评论