基本内容
- 基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。在ES6中引入一种新的数据类型--Symbol。
- Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。它由全局 Symbol() 函数创建,每次调用 Symbol()函数,都会返回一个唯一的 Symbol。
- Symbol函数可以接受任何可以被转型成字符串的值,如:字符串、数字、对象、数组等,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分,但不能访问Symbol 自身。
let symbol1 = Symbol();
let symbol2 = Symbol();
// 因为每个 Symbol 值都是唯一的,因此该值不与其它任何值相等。
console.log( symbol1 === symbol2 ); // false
console.log( typeof symbol1 ); // "symbol"
var s1 = Symbol("foo");
var s2 = Symbol("foo");
console.log( s1 === s2 ) // false
- Symbol值不能与其他类型的值进行运算
- 不可以采用如下方式进行强制转换
let uid = Symbol.for('uid')
let desc = uid + ""//报错 Uncaught TypeError: Cannot convert a Symbol value to a string
let uid = Symbol.for('uid')
let desc = uid / 1//报错 Uncaught TypeError: Cannot convert a Symbol value to a number
- 采用如下方式强制转换
let uid = Symbol.for('uid')
let desc = String(uid)
console.log(desc)//Symbol(uid)
- Symbol.for()
创建一个共享的Symbol:首先会在全局搜索被登记的 Symbol 中是否有该字符串参数作为名称的 Symbol 值,如果有即返回该 Symbol 值,若没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索。
let yellow = Symbol("Yellow");
let yellow1 = Symbol.for("Yellow");
yellow === yellow1; // false
let yellow2 = Symbol.for("Yellow");
yellow1 === yellow2; // true
- Symbol.keyFor()
在Symbol全局注册表中检索与Symbol有关的键
let yellow1 = Symbol.for("Yellow");
Symbol.keyFor(yellow1); // "Yellow"
应用场景
-
Symbol 充当属性名
Symbol 充当唯一的对象键.png
这里需要注意:Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中。所以,利用该特性,我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。因此当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外。
let obj = {
[Symbol('name')]: 'name',
age: 18,
title: 'Engineer'
}
Object.keys(obj) // ['age', 'title']
for (let p in obj) {
console.log(p) // 分别会输出:'age' 和 'title'
}
Object.getOwnPropertyNames(obj) // ['age', 'title']
JSON.stringify(obj) // {"age":18,"title":"Engineer"}
我们可以利用这一特点来更好的设计我们的数据对象,让“对内操作”和“对外选择性输出”变得更加优雅。
获取Symbol方式定义的对象属性:
// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]
// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']
网友评论