首頁  >  文章  >  web前端  >  javascript資料類型學習之淺析Symbol類型

javascript資料類型學習之淺析Symbol類型

青灯夜游
青灯夜游轉載
2022-03-18 11:01:521819瀏覽

這篇文章帶大家了解一下ES6新增的資料類型:Symbol,聊聊Symbol類型的聲明方式和使用方法,希望對大家有幫助!

javascript資料類型學習之淺析Symbol類型

Symbol一種新的原始資料類型,表示獨一無二的。是javascript中第七種資料型態。另外六種分別是:undefined、null、String、Number、Object

#宣告方式

##Symbol值透過Symbol函數產生。

物件的屬性名稱可以有兩種類型,一種是原來就有的字串,另一種就是新增的 Symbol 類型。屬性名稱屬於 Symbol 類型的,都是獨一無二的,可以保證不會與其他屬性名稱衝突。 【相關推薦:javascript學習教學

let s1=Symbol()
let s2=Symbol()
console.log(s1)
//Symbol()
console.log(s2)
//Symbol()
console.log(s1===s2)
//false

//Symbol函数能接受字符串作为参数,表示对Symbol实例的描述
let s1=Symbol('xxx')
let s2=Symbol('hhh')
console.log(s1)
//Symbol(xxx)
console.log(s2)
//Symbol(hhh)
console.log(s1===s2)
//false复制代码
Symbol函數前不能使用new指令,會報錯。這是因為產生的 Symbol 是原始型別的值,不是物件。也就是說,由於 Symbol 值不是對象,所以不能加入屬性。相當於是一種特殊的字串。

Symbol.for()全域定義Symbol

#Symbol.for() 接受一個字串作為參數,然後搜尋有沒有以該參數作為名稱的Symbol 值。如果有,就回傳這個 Symbol 值,否則就新建一個以該字串為名稱的 Symbol 值,並將其註冊到全域。

let s1 = Symbol.for('xxx')
let s2 = Symbol.for('xxx')
console.log(s1 === s2) // true


function foo(){
    return Symbol.for('hello')
}
const x=foo()
const y=Symbol.for('hello')
console.log(x === y)//true

Symbol.for()與Symbol()這兩種寫法,都會產生新的 Symbol。差別是,前者會被登記在全域環境中供搜索,後者就不會。 Symbol.for()不會每次呼叫就回傳一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,不存在才會新建一個值。

Symbol.keyFor()

Symbol.keyFor()方法傳回一個已經登記的 Symbol 類型值的key。

const s1 = Symbol('foo')
console.log(Symbol.keyFor(s1)) // undefined

const s2 = Symbol.for('foo')
console.log(Symbol.keyFor(s2)) // foo

應用場景

作為屬性名稱

由於Symbol 值都是不相等的,這表示 

Symbol 值可以作為標識符,用在物件的屬性名,就能保證不會出現同名的屬性。這對於一個物件由多個模組構成的情況非常有用,防止某一個鍵被不小心改寫或覆蓋。

const grade={
    张三:{address:'qqq',tel:'111'},
    李四:{address:'aaa',tel:'222'},
    李四:{address:'sss',tel:'333'},
}
console.log(grade)
//张三: {address: "qqq", tel: "111"} 李四: {address: "sss", tel: "333"}
//对象的key值不能重复 如果有重复 后面的value值就会覆盖前面的


//使用Symbol解决,相当于一个独一无二的字符串
const stu1=Symbol('李四')
const stu2=Symbol('李四')
console.log(stu1===stu2)
//false
const grade={
    [stu1]:{address:'aaa',tel:'222'},
    [stu2]:{address:'sss',tel:'333'},
}
console.log(grade)
//李四:{address:'sss',tel:'222'} 李四:{address:'sss',tel:'333'}
console.log(grade[stu1])
//李四:{address:'sss',tel:'222'}
console.log(grade[stu2])
//李四:{address:'sss',tel:'333'}

屬性遍歷
const sym=Symbol('imooc')
class User{
    constructor(name){
        this.name=name
        this[sym]='imooc.com'
    }
    getName(){
        return this.name+this[sym]
    }
}
const user=new User('www')

//for in的方法不能遍历到Symbol属性 像被隐藏了
for(let key in user){
    console.log(key)//name 
}

//Object.keys(obj)方法也不能遍历到Symbol属性
for(let key of Object.keys(user)){
    console.log(key)//name 
}

//Object.getOwnPropertySymbols(obj)只能获取到Symbol属性
for(let key of Object.getOwnPropertySymbols(user)){
    console.log(key)//Symbol(imooc) 
}

//Reflect.ownKeys(obj)对象的属性都能获取到
for(let key of Reflect.ownKeys(user)){
    console.log(key)
    //name 
    //Symbol(imooc) 
}

消除魔術字串

魔術字串指的是,在程式碼中多次出現、與程式碼形成

強耦合的某一個具體的字串或數值。風格良好的程式碼,應該盡量消除魔術字串,改成一些意義清晰的變數來代替。

function getArea(shape) {
    let area = 0
    switch (shape) {
        case 'Triangle':
            area = 1
            break
        case 'Circle':
            area = 2
            break
    }
    return area
}
console.log(getArea('Triangle'))
//Triangle和Circle就是魔术字符串。多次出现,与代码形成了“强耦合”,不利于后面的修改和维护。

const shapeType = {
    triangle: Symbol(),
    circle: Symbol()
}

function getArea(shape) {
    let area = 0
    switch (shape) {
        case shapeType.triangle:
            area = 1
            break
        case shapeType.circle:
            area = 2
            break
    }
    return area
}
console.log(getArea(shapeType.triangle))

一個前端小白,若文章有錯誤內容,歡迎大佬指點討論!

【相關影片教學推薦:

web前端#

以上是javascript資料類型學習之淺析Symbol類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除