ES6-Symbol 笔记 | Symbol 值作为对象的属性名 | Object.getOwnPropertySymbols()

Symbol

Symbol 数据类型是ES6新出的一种数据类型,这种数据类型的特点就是没有重复的数据,可以作为Object 的 key(属性值)。

本篇博客为博主本人整理的Symbol数据类型的笔记,参考文档为《阮一峰的ECMAScript 6 入门》

1.Symbol() 构造函数

​ Symbol() 构造函数:

  • 因为 Symbol 是一种原始数据类型,不是对象,因此构造函数前面不用加 new
  • 基本上 Symbol 是一种类似字符串的数据类型。

1.1 Symbol(‘foo’) !== Symbol(‘foo’)

  • Symbol() 的参数只代表对于当前 Symbol 值的描述。且 Symbol() 的创建具有唯一性,因此:

    let s1 = Symbol()
    let s2 = Symbol()
    console.log(s1===s2)//false
    let s3 = Symbol('foo')
    let s4 = Symbol('foo')
    console.log(s3===s4)//false
    

2.Symbol 的数据类型转换

  • Symbol 的数据类型转换
  1. Symbol 值不能于其他类型的值进行运算,会报错,如:

    let s = Symbol('mySymbol')
    console.log('yourSymbol'+s)
    //TypeError: Cannot convert a Symbol value to a string
    

    image-20221104135216343

  2. 但是,Symbol 值可以显示转为字符串。如:

    let s = Symbol('mySymbol')
    console.log(String(s)) //Symbol(mySymbol)
    console.log(s.toString()) //Symbol(mySymbol)
    

    image-20221104135642436

  3. Symbol 也可以转换为布尔值。如:

    let s = Symbol('mySymbol')
    console.log(Boolean(s)) //true
    

    image-20221104135923773

  4. Symbol 不能转换为数值。如:

    let s = Symbol('mySymbol')
    console.log(Number(s)) 
    //TypeError: Cannot convert a Symbol value to a number
    

    image-20221104140132002

3.读取 Symbol 的描述信息

3.1方法一:显示转换为字符串

  • 这个方法在上一小节提到了。对于 Symbol 数据类型的元素s可以采用String(s)s.toString() 来读取Symbol元素的描述。但是这种方法不是很方便。
let s = Symbol('mySymbol')
console.log(String(s)) //Symbol(mySymbol)
console.log(s.toString()) //Symbol(mySymbol)

image-20221104135642436

3.2方法二:Symbol原型对象的description属性

  • Symbol.prototype.descriptionSymbol构造函数的原型对象上有一个description属性,可以直接返回Symbol值的描述。即对于Symbol类型的元素s,可以直接使用s.discription获得 Symbol 值的描述。如:
let s = Symbol('mySymbol')
console.log(s.description)//'mySymbol'

image-20221104141311529

4.Symbol 值作为对象的属性名

Symbol 值作为对象的属性名的好处:每一个 Symbol 都是不相等的,用 Symbol 值作为对象的属性名,就可以保证不会出现同名的属性。

4.1 对象的 Symbol类型的属性名 的属性的【设置】

  1. 使用方括号[ ],不能使用. 添加Symbol类型的属性名。因为.点运算符后面跟的是字符串,如果用点运算符,则添加到对象中的属性的属性名是字符串's',而不是Symbol类型的s。

    let s = Symbol('mySymbol')
    let obj = {
           
           }
    obj[s]='hello'
    //或
    let obj1 = {
           
           
        [s]:'hello'
    }
    console.log(obj)
    console.log(obj1)
    

    image-20221104142646733

4.2 对象的 Symbol类型的属性名 的属性值的【读取】

  • 使用方括号[ ]对对象的Symbol类型的属性名的属性值进行读取,如:
//接4.1小节的代码,读取
console.log(obj[s])
console.log(obj1[s])

image-20221104143158236

5. Object.getOwnPropertySymbols() 方法读取Symbol键名

​ Object.getOwnPropertySymbols() 方法可以获取所有 Symbol类型的属性名,放在一个数组中返回。也可以利用这个方法读取对应的属性值。如:

let s1 = Symbol('a')
let s2 = Symbol('b')
let s3 = Symbol('c')
let obj = {
     
     
    k:'我的属性名是字符串类型',
    [s1]:'aaa',
    [s2]:'bbb',
    [s3]:'ccc'
}
console.log(Object.getOwnPropertyNames(obj)) //['k']
console.log(Object.getOwnPropertySymbols(obj)) 
//['Symbol(a)','Symbol(b)','Symbol(c)']
let objSymbols = Object.getOwnPropertySymbols(obj)
console.log(obj[objSymbols[0]])//aaa
//这样也可以读取s1的属性值

image-20221104144041176

image-20221104144419178

image-20221104144925962

6.小结

暂时博主只整理了一些关于 Symbol 数据类型最常用的知识点,只是Symbol的一小部分内容,更详细的关于 Symbol 更详细的内容参考 《阮一峰的ECMAScript 6 入门》,后续此条笔记也会不定期进行更新。有不足的欢迎在评论区补充。

猜你喜欢

转载自blog.csdn.net/dxy1128/article/details/127689115