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點推送當天的參考答案
- 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路