2.3JavaScript原始类型之符号(Symbol)

一个符号实例用于表示一个唯一的标识符。

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

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2020年9月2日 20:15
下一篇 2020年9月4日 02:13

相关推荐

  • 1.7JavaScript语言的函数(Function)

    1.Function()函数方式 Function() 函数方式创建的函数定义存在安全性和性能问题,所以不推荐使用。不过此种创建函数定义的方式很好地诠释了函数声明、函数表达式、箭头函数表达式是 Function 类型的实例这个概念。 2.函数声明 注意:在同一个作用域,可以重新声明同名函数,后定义的函数声明会覆盖先定义…

  • 2.6JavaScript引用类型之映射(Map)

    映射的键可以是任何 JavaScript 数据类型。 映射的键不可以重复,后定义的键值对会覆盖先定义的键值对。 映射的值可以是任何 JavaScript 数据类型,且不必都是同一个类型。 映射的值可以重复。 映射的键值对是无序的,但迭代时是有序的。 映射的键值对的个数(长度)可以动态改变,可以添加、更改、删除键值对。 …

  • 2.4JavaScript引用类型之类(Class)

    类是一种“特殊的函数”。 就像函数声明定义方式和函数表达式定义方式一样,类的定义方式也有两种:类声明定义方式和类表达式定义方式。 1.类声明 2.类表达式 注意:命名类表达式的右侧依然是类表达式,不是类声明。 3.类声明提升(Hoisting) 类声明、类表达式都不支持提升。 4.类名 类名是第一次跟类定义绑定的类名或…

发表回复

登录后才能评论