本文内容
- JS基本数据类型种类
- Symbol的主要用法, 全局Symbol的使用与检测
- Symbol与其他基本类型转换时的规则
ES6引入了一种新的原始数据类型,表示独一无二的值,最大的用处是作为对象属性的唯一标识符。
至此,Javascript拥有6种基本数据类型和一种复杂数据类型。
数据类型
基本类型
- string
- number
- boolean
- undefined
- null
- symbol
复杂类型
- object
用法
基本语法
1 | Symbol([description]) |
- description 可选的描述,一般用在调试的时候作为区分,但是 不能用来访问Symbol。
- 该方法返回一个symbol值
1 | let s = Symbol('test'); |
- 每次调用Symbol()返回的值都是独一无二的,不管描述是否一致。
Symbol
不支持new
调用- 通过description属性可以获取到传入Symbol的描述性字符串
全局单例的Symbol
使用Symbol.for()可以创建全局单例的symbol值,语法如下:
1 | Symbol.for([name]) |
- name 可选的描述,建议传入,否则name会作为undefined传入
- 类似于单例模式,执行环境(一般是浏览器)内部维护了一个全局Symbol注册表,记录name和Symbol(name)关系
- 尝试通过name在该注册表查找对应symbol值,如果找到,则返回这个symbol值
- 如果没找到,则使用Symbol(name)创建一个symbol值,并记录该symbol值与name的关联关系,之后返回该symbol
1 | const name = Symbol('name'); |
全局Symbol映射关系中name是作为字符串来使用的,结构类似下面的代码:
1
2
3const globalSymbols = {
name: Symbol('name')
};使用同样的字符串描述调用Symbol()和Symbol.for()获取到的symbol值不相等
查找是否为全局的单例Symbol
使用Symbol.keyFor()可以检测给定的symbol值是否是全局单例的symbol(简单来说就是检测是否是Symbol.for()创建的),语法如下:
1 | Symbol.keyFor(symbol) |
- symbol 必传, 待检测的symbol值
- 如果给定的symbol值是通过Symbol.for()得到的,该方法返回传入symbol的字符串描述
- 如果给定的symbol值不是通过Symbol.for()得到的,该方法返回undefined
1 | const s = Symbol('s1'); |
Symbol与JSON.stringify
Symbol类型的属性不会参与JSON的序列化
1 | const name = Symbol('name'); |
Symbol与for … in和for … of
Symbol类型的属性不会出现在for … in和for … of循环中
1 | const name = Symbol('name'); |
Symbol与Object.keys()和Object.getOwnPropertyNames()
Symbol类型的属性不会出现在Object.keys()和Object.getOwnPropertyNames()返回结果中
1 | const name = Symbol('name'); |
Symbol与Object.getOwnPropertySymbols()
Symbol类型的属性会出现在Object.Object.getOwnPropertySymbols()
1 | const name = Symbol('name'); |
Symbol数据类型转换
1 | const name = Symbol('1'); |
- symbol值不能转换为数字
- symbol不能直接转换为字符串,需要通过String包装才能转化
- symbol可以直接转换为boolean,转化后为true
结尾
- 使用Symbol最大的注意事项应该是使用方括号语法去访问对应的属性,而不是字符串。
- Symbol数据类型转换规范比较简单,大部分场景下也没用拿Symbol去做数据转换