JS每日一題:Es6中新增的資料型別有哪些?使用場景?

febobo發表於2019-02-16

20190125問:

Es6中新增的資料型別有哪些?使用場景?

es6中新增一種原始資料型別Symbol,最大的特點是唯一性,Symbol值通過Symbol函式生成, 在es5中物件的屬性都是字串,我們使用他人定義的物件,然後去新增自己的屬性,這樣容易起衝突覆蓋原有的屬性, Symbol也可以看成為一個字串,不過這個字元能保證是獨一無二的

基本示例:

// Object

const obj = {
    name: `JS`
}

obj.name = `JS每日一題` 

// Symbol

const name = Symbol(`name`) // 這裡的引數沒有特殊意義,可以看成為Symbol加了一個標記

obj[name] = `JS每日一題`

Symbol用法

Symbol 目前有多種寫法

// 一
const title = Symbol()

const obj = {}
obj[title] = `JS每日一題`

// 二
const obj = {
    [title]: `JS每日一題`
}

// 三
Object.defineProperty(obj, title, { value: `JS每日一題`})


obj[title] // 輸出的結果都為JS每日一題

這裡注意一下,Symbol 做為屬性名時,不能用點去讀取

obj.title // undefined

Symbol作為屬性名,只有通過Object.getOwnPropertySymbols 方法返回

const attrs = Object.getOwnPropertySymbols(obj)

// [Symbol[title]]

Symbol.for()

如果我們想要重複Symbol可以使用Symbol.for, Smybol.for()及Smybol()的區別在於Symbol.for()會先去查詢全域性下有沒有宣告過,如果有就返回該值,沒有就新建一個,Symbol()每一次呼叫都會新建一個

程式碼理解:

const title = Symbol.for(`JS每日一題`) 

....Symbol.for(`JS每日一題`) //呼叫多次都是使用的第一次宣告的值

Symbol.for(`JS每日一題`)  === Symbol.for(`JS每日一題`)  // true

const title = Symbol(`JS每日一題`)

Symbol(`JS每日一題`) === Symbol(`JS每日一題`) // false

總結

Symbol的特點

  • 獨一無二
  • 不能隱式轉換
  • 不能與其它資料型別做運算
  • 不能使用點運算子進行操作

ps: 今天答題的小夥伴多次都提到了map,set,,補充一下,新增的資料型別只有Symbol一種,map,set是新增的資料結構 ~_~

關於JS每日一題

JS每日一題可以看成是一個語音答題社群
每天利用碎片時間採用60秒內的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案

  • 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路

點選加入答題

相關文章