Symbol是构造方法,但它不是完整的构造方法,使用Symbol来创建Symbol对象时,不使用new运算符

发布时间 2023-11-14 19:55:10作者: 龙陌

执行以下程序,下列选项中,说法正确的是()

var s1 = Symbol('a');
var s2 = Symbol('a');
var s3 = Symbol.for('b');
var s4 = Symbol.for('b');
console.log(typeof s1); ...①
console.log(s1==s2); ...②
console.log(s3==s4); ...③

A
①式输出结果为Object

B
②式输出结果为false

C
③式输出结果为false

D
创建Symbol空对象,可以使用new Symbol()或者Symbol()

正确答案:B

Symbol是ES6新增的一种基本数据类型,因此,typeof s1的结果为symbol,A选项错误;
Symbol是构造方法,但它不是完整的构造方法,使用Symbol来创建Symbol对象时,不使用new运算符,D选项错误;
Symbol(key)与Symbol.for(key)的区别在于Symbol.for(key)会在全局环境下搜索是否存在对应key的Symbol对象,如果不存在时创建该对象并添加到全局环境下
而Symbol()不会进行该搜索,即使key值相同,创建的symbol对象也是不同的,因此②式返回结果为false,③式返回结果为true,故B选项正确,C选项错误。

Symbol为ES6新增的基本数据类型,表示独一无二的值。
Symbol()函数会返回symbol类型的值,每个从Symbol()返回的symbol值都是唯一的。
Symbol.for() 返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol

因此s1和s2是两个值都为a的不同symbol,s3创建了key为b的symbol,s4根据b找到s3的symbol,所以s1≠s2,s3==s4

var s1 = Symbol('a');
var s2 = Symbol('a');
var s3 = Symbol.for('b');//找不到key=b的symbol,新创建一个key为b的symbol
var s4 = Symbol.for('b'); //找到s3刚创建的symbol
console.log(typeof s1);...①
//typeof s1 = 'symbol' symbol为es6新增类型
console.log(s1s2); ...②
//symbol类型每个都是独一无二的
console.log(s3
s4); ...③
//s3,s4的key都是b,都找到同一个symbol,true

加上BigInt的话,JS目前共有八种数据类型
基本数据类型七种:(string,number,boolean,null,undefined, es6后新增symbol bigint)
引用数据类型: 一种 (object) 包含array,function,Date,RegExp..等引用类型

Symbol类型属于ES6中新增的基本数据类型之一,内部没有construtor构造器,不能使用new关键字创建
所以new Symbol()的时候会报错: Symbol is not a constructor