一个符号实例用于表示一个唯一的标识符。
1.创建符号实例
注意:符号实例不支持字面量创建方式。
注意:符号实例不支持 new Symbol()
创建方式。
//函数创建方式(不传递字符串实参)
let sym = Symbol();
//函数创建方式(传递字符串实参)
let sym = Symbol('foo');
Symbol()
函数可选地接受一个字符串实参,字符串实参仅仅作为对符号实例的描述,将来可以通过这个字符串实参来调试代码,不影响任何事情。
Symbol()
函数的返回值就是一个符号实例。
无论不传递一个字符串实参、传递不同的字符串实参、传递相同的字符串实参给 Symbol()
函数,Symbol()
函数返回的符号实例是唯一的,永远不会相同。
let genericSymbol = Symbol();
let otherGenericSymbol = Symbol();
let fooSymbol = Symbol('foo');
let otherFooSymbol = Symbol('foo');
console.log(genericSymbol == otherGenericSymbol);
console.log(fooSymbol == otherFooSymbol);
//都输出
false
false
2.符号实例作为成员名
支持类的成员:静态字段、静态访问器属性、静态方法、实例字段、实例访问器属性、实例方法。
支持对象字面量的成员:数据属性、访问器属性、方法。
符号实例只可以作为 可计算名
或 访问成员
方括号 []
内的表达式存在。
//类
let name = Symbol("b");
class C {
[Symbol("a")] = 1;
[name] = 2;
}
let o = new C();
//Symbol("a")会创建一个新的符号实例,所以会返回undefined。
o[Symbol("a")]; // undefined
//Symbol("b")会创建一个新的符号实例,所以会返回undefined。
o[Symbol("b")]; // undefined
o[name]; // 2
//对象字面量
let name = Symbol("b");
let o = {
[Symbol("a")]: 1,
[name]: 2
};
//Symbol("a")会创建一个新的符号实例,所以会返回undefined。
o[Symbol("a")]; // undefined
//Symbol("b")会创建一个新的符号实例,所以会返回undefined。
o[Symbol("b")]; // undefined
o[name]; // 2
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/20867.html