JS中的 Symbol 数据类型(简单理解)

JS中的Symbol是在ES6中出现的一种新的数据类型,它属于原始数据类型,平时对它的使用场景也是一知半解,现在有时间写篇文章,了解学习一下。

Symbol

Symbol 是ES6中的一种新的基本数据类型,它表示独一无二的值。

我们知道在 JS 的 Object数据类型中的key它只允许是字符串或者是symbol,在某些情况下,我们需要确保属性名是唯一的,这时候就可以使用Symbol类型来创建一个全局唯一的字符,避免属性名或者方法名发生冲突。
我们可以通过 Symbol() 来创建一个Symbol类型的值

//可以通过 Symbol() 来创建一个Symbol类型的值
const mykey = Symbol()

Symbol 值可以作为对象的属性名类的静态变量对象的方法名等等,如下所示 ⬇

//可以作为对象的属性名
const obj = {}
const mykey = Symbol()
obj[mykey] = 'mySymbol'
console.log(obj.mykey) // 输出mySymbol

// 类的静态变量
class myClass{
	static [mykey] = 'mySymbol'
}
console.log(MyClass[mykey]) // 输出mySymbol

//作为对象的方法名
const myKey1 = Symbol()
const Obj = {
	[mykey1]: function() {
		console.log('mySymbol')
	}
}
Obj[mySymbol]() // 输出mySymbol

需要注意的是,由于 Symbol 类型的值是唯一的,即使我们创建两个相同的 Symbol 值,它们也是不相等的 ⬇

const symbol1 = Symbol("foo")
const symbol2 = Symbol("foo")
console.log(symbol1 === symbol2) // 输出false

// 你可以使用 Symbol.for('xx')查找全局注册到的symbol类型属性并复用,此方法有查找和创建Symbol类型的操作
const a = Symbol.for('hello')
const b = Symbol.for('hello')
console.log(a === b) // 输出true

Symbol 类型的值是无法被遍历的,因此不会出现在 for…in 循环中,也不会被 Object.keys()、Object.getOwnPropertyNames() 以及 JSON.stringify() 等方法获取到。
这里也是联想到一个小知识 ⬇

JSON.stringify()我们可以用来做深拷贝,但是由于Symbol属性是无法被遍历的,所以使用JSON.stringify()完成深拷贝是无法拷贝的Symbol类型的值的,除此之外也无法拷贝到值为Function和undefined、日期、正则等的属性。这也是用这种方法做深拷贝的缺陷。

// 简单测试一下
const mySymbol = Symbol()
  let obj = {
    [mySymbol]: '66',
    arr: [1,2,3,5,[10,12]],
    tryUndefine: undefined,
    myFunction: function(){
      console.log(666)
    },
    myName: 'cxx',
    myDate: new Date(),
    regex: /hello/
  }
  console.log(obj)
  let objStr = JSON.stringify(obj)
  console.log(objStr)
  let res = JSON.parse(objStr)
  console.log(res)

请添加图片描述
言归正传,上面说到Symbol类型属性不能被for…in…遍历出来,如果需要遍历一个对象的所有属性,可以使用 Reflect.ownKeys() 方法获取所有属性名(包括 Symbol 类型的属性名)。

const mySymbol = Symbol()
  const mySymbol2 = Symbol()
  let obj = {
    a: 'hello',
    b: [1,2,3],
    [mySymbol]: '666',
    [mySymbol2]: '888'
  }
  for(let key in obj){
    console.log(obj[key])
  }
  console.log('-----------分界线------------')

  for(let item of Reflect.ownKeys(obj)){
    console.log(obj[item])
  }

请添加图片描述
文章有问题之处还望评论斧正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值