首页 > 其他分享 >【ES6】JS第7种数据类型:Symbol

【ES6】JS第7种数据类型:Symbol

时间:2023-01-16 17:31:49浏览次数:35  
标签:ES6 s2 Symbol 数据类型 sym var s1


【ES6】JS第7种数据类型:Symbol

  • ​​一、Symbol的由来​​
  • ​​二、Symbol的涵义​​
  • ​​三、Symbol的判等​​
  • ​​四、Symbol的运算与转化​​
  • ​​查看更多ES6教学文章:​​
  • ​​参考文献​​

引言:我们知道JS的六大数据类型分别是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。现ES6新增第7种数据类型,Symbol类型。


一、Symbol的由来

        ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法( mixin模式),新方法的名字就有可能与现有方法产生冲突。
        如果有种机制,能够保证每个属性的名字都是独一无二的就好了,这样就能从根本上防止属性名冲突。这就是ES6引人Symbol的原因。
        ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第7种数据类型,前6种分别是: Undefined 、Null、布尔值( Boolean)、字符串( String )、数值( Number )和对象( Object)。
        Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型:一种是原来就有的字符串,另一种就是新增的 Symbol类型。只要属性名属于Symbol类型,就是独一无的,可以保证不会与其他属性名产生冲突。
        参考代码块1-1。

/***@@    代码块1-1        @@***/
let s = Symbol();
typeof S
// "symbol"

二、Symbol的涵义

        在代码块1-1中,变量s就是一个独一无二的值。typeof运算符的结果表明变量s是Symbol数据类型,而不是字符串之类的其他类型。
        注意,Symbol函数前不能使用new命令,否则会报错。​​​这是因为生成的Symbol是一个原始类型的值,不是对象。也就是说,由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。​​         Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示或转为字符串时比较容易区分。见代码块2-1。

/***@@    代码块2-1        @@***/
var s1 = Symbol('foo');
var s2 = Symbol('bar ');
s1 // Symbol(foo)
s2 // Symbol(bar)
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"

三、Symbol的判等

        上面的代码块2-1中,s1和s2是两个Symbol值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出时就能够分清到底是哪一个值。
        注意,Symbol 函数的参数只表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。
        见代码块3-1。

/***@@    代码块3-1        @@***/
//没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
//有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false

        上面的代码中,s1和s2都是Symbo类型的返回值,而且参数相同,但是它们是不相等的。

四、Symbol的运算与转化

        Symbol值不能与其他类型的值进行运算,否则会报错。

var sym = Symbol( 'My symbol');

"your symbol is”+ sym
// TypeError: can't convert symbol to string
`your symbol is ${sym}`
// TypeError: can't convert symbol to string

但是,Symbol值可以显式转为字符串。

var syn= Symbol('My symbol'); 

String(sym) // 'Symbol(My symbol)'
sym.toString() // 'Symbol(My symbol)'

另外,Symbol 值也可以转为布尔值,但是不能转为数值。

var sym = Symbol();
Boolean(sym) // true
!sym // false
if (sym) {
// ...
}

Number(sym) // TypeError
sym + 2 //TypeError

查看更多ES6教学文章:

​​1. 【ES6】let与const 详解​​2. 【ES6】变量的解构赋值
3. 【ES6】字符串的拓展
4. 【ES6】正则表达式的拓展
5. 【ES6】数值的拓展
6. 【ES6】数组的拓展
7. 【ES6】函数的拓展
8. 【ES6】对象的拓展
9. 【ES6】JS第7种数据类型:Symbol
10. 【ES6】Proxy对象
11. 【ES6】JS的Set和Map数据结构
12. 【ES6】Generator函数详解
13. 【ES6】Promise对象详解
14. 【ES6】异步操作和async函数
15. 【ES6】JS类的用法class
16. 【ES6】Module模块详解
17. 【ES6】ES6编程规范 编程风格

参考文献

阮一峰 《ES6标准入门(第2版)》


标签:ES6,s2,Symbol,数据类型,sym,var,s1
From: https://blog.51cto.com/u_15942590/6010590

相关文章

  • 【ES6】对象的拓展
    【ES6】对象的拓展​​一、对象的两种表示法【掌握】​​​​1)简洁表示法​​​​2)属性名表达式法​​​​二、Object.is()【了解】​​​​三、Object.assign()【了解】​......
  • java.3 Java数据类型1
    数据类型讲解Java属于强类型语言即要求变量的使用要严格符合规定,所有变量都必须严格定义以后才能使用优点:安全性高缺点:速度慢(相对而言)Java数据类型分为引用类......
  • Redis——数据类型
    一、总览Redis是键值型数据库,键是String,值可以是多种数据类型,具体包括:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和SortedSet(有序集合)键值采用哈希算法,称为全局哈希表......
  • go 基础结构和基本数据类型
    Go的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go 。如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.g......
  • ES6+ 字符串的扩展
    1.前言由于历史原因,在JavaScript创建之初,市面上的编码方式还是很混乱的,JavaScript在创建之初,使用的是1990年公布的UCS-2的编码方法,使用2个字节表示1个字符,那时......
  • ES6+ includes()
    1.前言字符串查找一直都是程序中的常用操作,在ES5中查找一个字符串是否包含另一个字符串,一般有两种思维。一是使用正则的方式来匹配,二是使用ES5的方式,如indexOf、lastI......
  • ES6-遍历器与for-of循环
    一认识Iterator对象(可遍历对象)console.log([1,2]);console.log([1,2][Symbol.iterator]);//ƒvalues(){[nativecode]}//方括号的方式调用,Sym......
  • 4. redis数据类型之String-bit
    Redis字符串string-bit前面我们介绍了Redis中的字符串类型的基本命令操作。但是没有涉及到bit相关的命令。本文我们来看几个bit相关的命令。bit相关的命令指的是bitcoun......
  • python教程6--自定义函数,数据类型转换,解方程
    本文主要讲解点如下:简单函数数据类型转换空函数自定义绝对值函数自定义函数检查参数类型函数返回多个值求解ax2+bx+c=0的根具体代码如下:'函数相关'__author__='mo......
  • [VueJsDev] 基础知识 - ES6循环使用手册
    ES6循环使用手册:::details目录目录​ES6循环使用手册​​​Array.1:filter()方法​​​​Array.2:forEach​​​​Array.3:for循环​​​​Array.4:map()循环​......