🍉一文讲明白Symbol数据类型

1,229 阅读2分钟

一、Syboml数据类型的作用是什么?

我们学过JavaScript都知道在JavaScript中基本数据类型有6种:Number,String,Boolean,Null,Undefined。ES6新增了Syboml类型,ES10新增了BigInt类型。
那么为什么要提出Symbl数据类型呢?
它存在的主要目的是解决全局变量冲突的问题。例如我们定义了一个全局对象,用来缓存数据,我们现在有两个js文件需要往这个对象中添加键名,由于js文件在不同模块,我们可能会添加相同的键名,于是就出现了冲突的问题。故Symbol数据类型的主要作用就是为对象添加独一无二的属性名。

const obj = {};
obj[Symbol()] = '橙子';
obj[Symbol()] = '柚子'
console.log(obj)

image.png

二、Symbol数据类型拓展

我们通过Symbol创建的值一定是一个唯一的值。

  • 如果我们想复用一个相同的Symbol值,那么我们可以使用Symbol.for()方法,该方法会接受一个字符串为参数,相同的字符串一定会返回相同Symbol类型的值。如果传入的参数不是字符串,那么该方法会把参数自动转换为字符串。
  • 在Symbol类型当中还提供了很多内置的Symbol常量用来作为内置方法的标识。
let obj1 = {}
console.log(obj1.toString())

image.png 如果我们想修改字符串的toString标签,我们可以自定义这个字符串标签,使用Symbol.toStringTag这个属性

let obj1 ={[Symbol.toStringTag]:'Xobject'}
console.log(obj.toString())

image.png 我们发现这个字符串标签已经被我们修改成功了。

  • 我们使用Symbol值作为对象的属性名,这个属性通过传统的for...in...是无法拿到的,通过Object.keys也是获取不到的Symbol类型的属性名,使用JSON.stringify序列化对象,Symbol类型的属性名也会被忽略掉。因此Symbol类型的属性特别适合作为对象的私有属性!
    那么真的不能拿到Symbol类型的属性名吗?其实,并不然,我们可以通过Object.getOwnPropertySymbols()方法,这个方法只能获取到Symbol类型的属性名。