ES6(十七)—— Symbol

目錄

  • 簡介
  • 爲何要有這個數據類型
  • 做用函數

    • 若是想用toString方法,又怕和原生的衝突,能夠用Symbol
    • 更適合作私有屬性,由於普通的遍歷是訪問不到的
    • 目前最主要的做用就是爲對象添加獨一無二的屬性名
  • 使用symbol
  • 取值
  • ES6-ES10學習版圖

簡介

一種全新的原始數據類型,js的基本數據類型。**不那麼深刻,就先簡單記個筆記學習

爲何要有這個數據類型

以前當不同的文件中,對同一個變量進行操做的時候,會有污染的狀況,因此爲了解決這種問題,約定俗稱會在屬性名中添加文件名。this

做用

若是想用toString方法,又怕和原生的衝突,能夠用Symbol

const obj = {
  [Symbol.toStringTag]: 'XObject'
}

console.log(obj.toString()) // [object XObject]

更適合作私有屬性,由於普通的遍歷是訪問不到的

const obj1 = {
  [Symbol()]: 'symbol value',
  foo: 'normal value'
}

for(let key in obj1) {
  console.log(key)  // foo
}
console.log(Object.keys(obj1)) // [ 'foo' ]

console.log(JSON.stringify(obj1)) // {"foo":"normal value"}

// 使用下面的方法,能夠獲取到symbol的屬性名
console.log(Object.getOwnPropertySymbols(obj1)) // [ Symbol() ]

目前最主要的做用就是爲對象添加獨一無二的屬性名

// shared.js
const cache = {}
// a.js
cache['foo'] = 123
// b.js
cache['foo'] = 234

console.log(cache) // {foo: 234}
// ==============================================
// a.js
cache['a_foo'] = 123
// b.js
cache['b_foo'] = 234

console.log(cache) // {a_foo: 123, b_foo: 234}

使用symbol

// 經過symbol函數建立一個symbol類型的數據
const s = Symbol()
console.log(s) // Symbol()
console.log(typeof s) // symbol
console.log(Symbol() === Symbol()) // false 獨一無二的數據

// 咱們能夠添加描述文本
console.log(Symbol('foo')) // Symbol(foo)
console.log(Symbol('bar')) // Symbol(bar)

// 對象的屬性名能夠是symbol類型也能夠是string類型
// a.js
const name = Symbol()

const person = {
  [name] : 'xm',
  say () {
    console.log(this[name])
  }
}

// b.js
person.say() // xm

取值

有for方法能夠獲取到那個值spa

const s1 = Symbol.for('foo')
const s2 = Symbol.for('foo')

console.log(s1 === s2) // true

// 須要注意的是,那個for對應的是字符串,因此true和'true'的效果是同樣的
console.log(Symbol.for(true) === Symbol.for('true')) // true
  • JS八種數據類型:Number、String、Boolean、Null、undefined、object、symbol、bigInt
  • JS七種基本數據類型:Number、String、Boolean、Null、undefined、symbol、bigInt

ES6-ES10學習版圖

相關文章
相關標籤/搜索