Symbol
简介
Symbol表示独一无二的值,它是JavaScript语言的第七种数据类型。
Symbol值通过Symbol函数生成。对象的属性名现在可以有两种类型,一种是字符串,一种就是新增的Symbol类型(类似于字符串的数据类型,符号类型值),这样可以保证不会与其他属性名产生冲突。
Symbol函数可以接收一个字符串作为参数,表示对Symbol实例的描述,这样在控制台打印的时候,比较容易区分。
如果Symbol的参数是一个对象,就会调用对象的toString()方法,将其转为字符串,然后才生成一个Symbol值。
注意;
1. Symbol函数的参数只是表示对当前Symbol值的描述,所以参数相同时,它们的返回值是不相等的。
2. Symbol值不能与其他类型的值进行运算,会报错,但是它可以显示转为字符串,可以进行字符串拼接。
3. Symbol值可以转为布尔值,但不能转为数值
Symbol.prototype.description
创建Symbol的时候,可以添加一个描述
以上代码中,sym的描述就是字符串foo,但是读取这个描述的时候需要将Symbol显式转为字符串,ES2019提供了description,它可以直接返回Symbol的描述
作为属性名的Symbol
由于每一个Symbol值都是不相等的,这意味着Symbol值可以作为标识符,用于对象的属性名,这样可以保证不会出现同名的属性,能防止某一个键被改写或者覆盖。
注意:Symbol值作为对象属性名时,不能用点运算符,只能通过obj【 symbol 】的形式,设置对象属性的时候同理。
属性名的遍历
Symbol作为属性名,遍历对象的时候,该属性不会出现在for in, for of循环中,也不会被Object.keys()、Object.getOwnPrototypeNames()、JSON.stringfy()返回。
它可以通过Object.getOwnPropertySymbols()方法获取指定对对象的所有Symbols属性名,该方法返回一个数组,成员是当前对象的所有作为属性名的Symbol值。
或者通过使用Reflect.ownKeys()方法返回所有类型的键名,包括常规键名和Symbol键名
由于Symbol值作为键名,不会被常规方法遍历得到,可以利用这个特性,为对象定义一些非私有的,但又希望只用于内部的方法。