Symbol類型
ES6引入了一種新的原始數據類型Symbol
,表示獨一無二的值,它是JavaScript語言的第7種數據類型,是一種類似於字符串的數據類型。
let s = Symbol()
console.log(s, typeof s) // Symbol() "symbol"
Symbol特點
-
Symbol的值是唯一的,用來解決命名沖突的問題
let s2 = Symbol('test') let s3 = Symbol('test') console.log(s2 === s3) // false let s4 = Symbol.for('test') console.log(s4, typeof s4) // Symbol(test) "symbol" let s5 = Symbol.for('test') console.log(s4 === s5) // true 123456789
-
Symbol值不能與其他數據進行運算
let result = s + 100 // 報錯:Cannot convert a Symbol value to a number let result = s > 100 // 報錯:Cannot convert a Symbol value to a number let result = s + s // 報錯:Cannot convert a Symbol value to a number 123
-
Symbol定義的對象屬性不能使用
for...in
循環遍歷,但是可以使用Reflect.ownKeys
來獲取對象的所有鍵名
使用
// 第一種向對象中添加up、down
let game = {
name: '一款游戲',
up() {
console.log('我是原來的up')
},
down() {
console.log('我是原來的down')
}
}
// 聲明一個對象
let methods = {
up: Symbol(),
down: Symbol()
}
game[methods.up] = function () {
console.log('upupup')
}
game[methods.down] = function () {
console.log('downdowndown')
}
// 調用
game[methods.down]()
// 第二種用Symbol作為屬性名的方法
let game2 = {
name: '狼人殺',
[Symbol('say')]: function () {
console.log('請發言')
},
[Symbol('zibao')]: function () {
console.log('狼人已自爆')
}
}
for (const key in game2) {
console.log(key)
} // name
console.log(Reflect.ownKeys(game2)) // ["name", Symbol(say), Symbol(zibao)]
game2[Reflect.ownKeys(game2)[1]]() // 請發言