Symbol一種新的原始資料類型,表示獨一無二的。是javascript中第七種資料型態。另外六種分別是: undefined、null、String、Number、Object
Symbol值透過Symbol函數產生。物件的屬性名稱可以有兩種類型,一種是原來就有的字串,另一種就是新增的Symbol 類型。屬性名屬於Symbol 類型的,都是獨一無二的,可以保證不會與其他屬性名產生衝突。
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 值,否則就新建一個以該字串為名稱的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 類型值的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中文網其它相關文章!