Symbol
Symbol 用于防止属性名冲突而产生的 ,Symbol 的值是唯一的,不会重复的。可以理解为一个不会重复的随机生成字符串。
示例:循环生成10000组Symbol
for(let i = 0;i < 10000;i ++)
{
let hd = Symbol();
let edu = Symbol();
console.log(hd == edu);
}
输出10000个false ,Symbol 产生一个唯一的值
描述参数
可以传入字符串用于描述Symbol ,方便在控制台分辨Symbol
let symbol1 = Symbol("is name");
let symbol2 = Symbol("可以给Symbol 添加一个标签");
console.log(symbol1);
console.log(symbol2.toString());
输出:
注意: 传入相同的参数的两个Symbol 也是独立唯一的。因为参数只是描述而已,但使用 Symbol.for则不会
示例:
let symbol1 = Symbol("is name");
let symbol2 = Symbol("is name");
console.log(`symbol1 == symbol2? ${symbol1 == symbol2}`);
输出:
Symbol.for()
根据描述获取Symbol,如果不存在则新建一个Symbol
- 使用Symbol.for会在系统中将Symbol登记
- 使用Symbol则不会登记
示例:
let symbol1 = Symbol.for("is name");
let symbol2 = Symbol.for("is name");
console.log(`symbol1 == symbol2? ${symbol1 == symbol2}`);
输出:
Symbol.keyFor()
Symbol.keyFor 根据使用Symbol.for登记的Symbol返回描述,如果找不到返回undefined 。只能找到Symbol.for定义的标签,否则返回undefined
示例:
let symbol = Symbol("this is a label");
console.log(Symbol.keyFor(symbol));
let symbol1 = Symbol.for("this is a label");
console.log(Symbol.keyFor(symbol1));
输出:
Symbol 对象属性
Symbol 是独一无二的所以可以保证对象属性的唯一。
- Symbol 声明和访问使用 [](变量)形式操作
- 也不能使用 . 语法因为 .语法是操作字符串属性的。
示例:
let symbol = Symbol("is name");
let obj =
{
[symbol] : "this is a label of symbol"
}
console.log(`symbol's label is : ${obj[symbol]}`);
示例:
- Symbol 值作为对象属性名时,不能用点运算符来调用,否则会把symbol作为了一个字符串类型的属性名,丧失了独一性:
示例:
var mySymbol = Symbol();
var a = {};
a.mySymbol = 'Hello!';//导致mysymbol转变成了字符串属性名
console.log(a[mySymbol]);
console.log(a['mySymbol']);
输出: