Symbol是ES6引入的新类型,因此在ES5的基础上,JS就有了字符串(string)、数字型(number)、布尔(bool)、null、undefined和Symbol共六种基本类型(bigint ES2016 添加)。函数
In JavaScript, Symbol is a primitive value.
Symbol是一种原始数据类型
什么是原始数据类型
A value having the data type "symbol" can be referred to as a "symbol value." In the JavaScript run-time environment, a symbol value is created by invoking the function Symbol, which dynamically produces an anonymous, unique value. A symbol may be used as an object property.
具备Symbol数据类型的值被称为"Symbol"值。在JavaScript运行时环境中,经过调用函数Symbol建立Symbol值,该函数动态生成 匿名的 惟一值。
Symbol can have an optional description, but for debugging purposes only.
MDN Symbol
该数据类型一般被用做一个对象属性的键值——当你想让它是私有的时候。例如,symbol 类型的键存在于各类内置的 JavaScript 对象中。一样,自定义类也能够这样建立私有成员。symbol 数据类型具备很是明确的目的,而且由于其功能性单一的优势而突出;一个 symbol 实例能够被赋值到一个左值变量,还能够经过标识符检查类型,这就是它的所有特性。不能对该类型实例使用其余操做符(将“Symbol”类型的实例与 “Number” 类型的实例对比,例如整数 42,该实例就具备将值与其余类型的值进行比较或组合的运算符)。
Symbol值的惟一建立方法,是经过调用Symbol()函数来返回,不支持new操做。
Symbol接受一个可选参数,能够添加一段文本描述,但这段描述不可用于属性访问。ui
let firstName = Symbol("first name"); let persion = {}; person[firstName] = "Tom"; console.log("first name" in person); // false console.log(persion[firstName]); // "Tom" console.log(firstName); // "Symbol(first name)"
Symbol的描述被存储在内部的[[Description]]属性中,只有当调用Symbol的toString方法才能够读取这个属性,但不能直接在代码里访问[[Description]]。
全部使用计算属性名的地方,均可以使用Symbol。debug
let firstName = Symbol("first name"); let person = { [firstName] : "Tom" } Object.defineProperty(person, firstName, { writable: false}); let lastName = Symbol("last name"); Object.defineProperties(person, { [lastName]: { value: 'Lee', writable: false } }); console.log(person[firstName]); // Tome console.log(person[lastName]); // Lee const propertyNames = Object.getOwnPropertyNames(person); console.log(propertyNames); // [] const propertySymbols = Object.getOwnPropertySymbols(person); console.log(propertySymbols); // [Symbol(first name), Symbol(last name)]
Symbol提供了一个全局注册表,用于在大文件或多文件代码中追踪Symbol值。
若是想建立一个可共享的Symbol,须要使用Symbol.for方法。它只接受一个参数,也就是即将建立的Symbol的字符串标识,这个参数也被用做Symbol的描述。code
let uid = Symbol.for("uid"); let obj = {}; obj[uid] = "12345"; console.log(obj[uid]); // "12345" console.log(uid); // "Symbol(uid)" console.log(Symbol.forKey(uid)); // "uid"
Symbol.for方法首先在全局注册表中搜索键值为"uid"的Symbo值,若是存在,直接返回已有的Symbol,不然,建立一个新的Symbol,并使用这个键在Symbol全局注册表中注册,随即返回新建立的Symbol。对象