首页 > 其他分享 >Symbol是构造方法,但它不是完整的构造方法,使用Symbol来创建Symbol对象时,不使用new运算符

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

时间:2023-11-14 19:57:25浏览次数:33  
标签:构造方法 s3 Symbol 运算符 key var symbol s1

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

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

标签:构造方法,s3,Symbol,运算符,key,var,symbol,s1
From: https://www.cnblogs.com/longmo666/p/17832393.html

相关文章

  • Python的运算符
    1.算数运算  +-*///%"//"除"%"余a=20b=3c=a//bd=a%b#20/3=6.....2print(c)print(d)#运行结果62 让用户输入一个数字.判断是否是35的倍数n=int(input("来个数:"))ifn%35==0:print("是35的倍数")else:pri......
  • day03 Java基础——各种运算符
    一、自增自减运算符、Math类publicclassDemo04{publicstaticvoidmain(String[]args){//++--自增,自减一元运算符inta=3;intb=a++;intc=++a;System.out.println(a);System.out.println(a);......
  • 秦疆的Java课程笔记:30 基础 三元运算符及小结
    扩展赋值运算符:+=,-=,*=,/=publicclassDome1{publicstaticvoidmain(String[]args){inta=10;intb=20;a+=b;//相当于a=a+bSystem.out.println("a="+(a));intc=30;intd=15;......
  • js:可选链运算符(?.)和空值合并运算符(??)
    文档:可选链运算符(?.)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining空值合并运算符(??)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing目录1、可选链运算符(?.)2、空值合并运算......
  • 秦疆的Java课程笔记:27 基础 基本运算符
    Java语言支持的运算符:算数运算符:基础四则运算:+加法,-减法,*乘法,/除法%取余,或称“模运算”++自增,--自减赋值运算符:=关系运算符:>大于,<小于,>=大于等于,<=小于等于==等于,!=不等于instanceof对象运算符,用来判断一个对象是否属于某个指定的类或其子类的实例,如果是,返回true,否则......
  • 当类中一个属性只有get()方法而无set()方法时,该属性是无法进行赋值的,连构造方法中的初
    执行以下程序,输出结果为()classPhone{constructor(price){this.price=price;}getprice(){return999;}}varp=newPhone(888);console.log(p.price);A999BundefinedC抛出异常D888正确答案:C当类中一个属性只有get()方法而无set()方法时,该......
  • 无涯教程-Dart - Symbol(符号)
    Symbol是一种用于存储人类可读字符串和经过优化以供计算机使用的字符串之间的关系的方法。Symbolobj=newSymbol('name');name必须是有效的公共Dart成员名称,公共构造函数名称或库名称。考虑以下示例,该代码在库foo_lib中声明了一个Foo类,该类定义方法m1,m2,和m3。libra......
  • Java零基础入门-运算符
    前言Java作为一种广泛应用的编程语言,其有丰富的运算符用于程序的编写。掌握Java的运算符是学习Java编程的基础之一,在本文中,我们将讨论Java中各种运算符的使用方法,以帮助初学者更好地理解Java运算符的使用。摘要本文旨在为初学者提供关于Java运算符的详细介绍。本文涵盖的运算符......
  • 无涯教程-Dart - 运算符
    在本章中,我们将讨论Dart中可用的运算符。算术运算符关系运算符类型运算符按位运算符赋值运算符逻辑运算符算术运算符下表显示了Dart支持的算术运算符。Sr.NoOperators&Meaning1+相加2-相减3-expr一元减号,也称为负数4*相乘5/相除6~/相除,返回整......
  • PHP 中的相等性比较运算符(== 双等号)和恒等性比较运算符(=== 三等号)有什么区别?
    内容来自DOC[https://q.houxu6.top/?s=PHP中的相等性比较运算符(==双等号)和恒等性比较运算符(===三等号)有什么区别?](https://q.houxu6.top/?s=PHP中的相等性比较运算符(%3D%3D双等号)和恒等性比较运算符(%3D%3D%3D三等号)有什么区别?)==和===之间有什么区别?宽松的==......