js-Symbol類型


Symbol類型

ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值,它是JavaScript語言的第7種數據類型,是一種類似於字符串的數據類型。

let s = Symbol()
console.log(s, typeof s)	// Symbol() "symbol"

Symbol特點

  1. 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
    
  2. 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
    
  3. 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]]()  // 請發言


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM