js中Symbol数据类型

110 阅读2分钟

symbol是一种基本数据类型。Symbol()函数会返回symbol类型的值,该类型有静态属性和静态方法。他的静态属性会暴露几个内建的成员对对象;他的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说他并不完整,因为他不支持语法new Symbol()。 每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性识别的标识符;这是该数据类型仅有的目的。

const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

console.log(typeof symbol1);
// expected output: "symbol"

console.log(symbol2 === 42);
// expected output: false

console.log(symbol3.toString());
// expected output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

语法

Symbol( [description] )

描述

直接使用Symbol()创建symbol类型,并用一个可选的字符串作为其描述

var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');

上面的代码创建了三个新的symbol类型。 注意,Symbol("foo") 不会强制将字符串 “foo” 转换成symbol类型。它每次都会创建一个新的 symbol类型:

Symbol("foo") === Symbol("foo"); // false

下面带有new运算符的语法将抛出 TypeError

var sym = new Symbol(); // TypeError

总结

Symbol 数据类型的特点是唯一性,即使是用同一个变量生成的值也不相等。

 let id1 = Symbol('id');
 let id2 = Symbol('id');
 console.log(id1 == id2);  //false

Symbol 数据类型的另一特点是隐藏性,for···in,object.keys() 不能访问

 let id = Symbol("id");
 let obj = {
  [id]:'symbol'
 };
 for(let option in obj){
     console.log(obj[option]); //空
 }

但是也有能够访问的方法:Object.getOwnPropertySymbols
Object.getOwnPropertySymbols 方法会返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

 let id = Symbol("id");
 let obj = {
  [id]:'symbol'
 };
let array = Object.getOwnPropertySymbols(obj);
 console.log(array); //[Symbol(id)]
 console.log(obj[array[0]]);  //'symbol'

注意事项

  1. Symbol值不能与其他类型的值进行运算
  2. Symbol 值不可以和其他类型值进行混合运算,否则会报错
  3. Symbol 值如果想要作为属性名,那就不能再用点运算符,因为点运算符后面跟的总是字符串
  4. 在对象内部使用Symbol 值作为属性名的时候,必须要将值放在方括号中