1. 概念:
symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:“new Symbol()”。
2. 使用
2.1 你可以在调用Symbol()函数时传入一个可选的字符串参数,相当于给你创建的Symbol实例一个描述信息:(仅仅是对于这个Symbol的描述,可以理解为是注释,即使字符串参数相同,但是Symbol类型的变量并不会相等)
//创建Symbol
let s = Symbol(); //函数
console.log(s, typeof s); //23-Symbol的基本使用.html:15 Symbol() 'symbol'
let str = 'another symbol';
let s1 = Symbol(str); //相当于let s1 = Symbol('another symbol')
let s2 = Symbol('YY');
let s3 = Symbol('YY');
console.log(s1, s2,s3); //Symbol(another symbol) Symbol(YY) Symbol(YY)
console.log(s2 == s3); //false
2.2 Symbol.for() 不管在哪里调用,都会被注册登记到全局环境
Symbol为我们提供了一个方法:Symbol.for(),它接收一个字符串作为参数(可选),然后会在全局中搜索有没有以该参数作为描述的Symbol值,如果有则直接返回该Symbol,否则将以该参数作为描述创建一个新的Symbol值,并将其注册的全局环境供搜索(另外: Symbol.for() 在创建Symbol值时是登记在全局环境中的, 不管有没有在全局环境运行)
let s4 = Symbol.for('SXL'); //函数对象
let s5 = Symbol.for('SXL');
let s6 = Symbol.for();
console.log(s4, s5, s6); //Symbol(SXL) Symbol(SXL) Symbol(undefined)
console.log(s4 == s5); //true
console.log(s4 === s5); //true
console.log(s4 == s6); //false
图片引自MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for
Symbol.keyFor(sym) 方法用来获取全局symbol 注册表中与某个 symbol 关联的键。 如果全局注册表中查找到该symbol,则返回该symbol的key值,返回值为字符串类型。否则返回undefined
// 创建一个全局 Symbol
var globalSymbol = Symbol.for("global");
console.log(typeof Symbol.keyFor(globalSymbol), Symbol.keyFor(globalSymbol)); //string global
let sy = Symbol('yy')
console.log(Symbol.keyFor(sy)); //undefined
2.3 不能与其他数据进行运算或者是隐式转换
let s7 = Symbol();
let re1 = s7 + 100; // Cannot convert a Symbol value to a number
let re2 = s7 > 100; // Cannot convert a Symbol value to a number
let re3 = s7 + ''; // Cannot convert a Symbol value to a string
let re4 = s7 + s7; // Cannot convert a Symbol value to a number
2.4 toString()、String()、Boolean()可以进行强制转换
let s8 = Symbol('symbol');
console.log(typeof s8.toString(), s8.toString()); //string Symbol(symbol)
console.log(typeof String(s8), String(s8));