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))
一個前端小白,若文章有錯誤內容,歡迎大佬指點討論!
【相關視訊教學推薦:】
以上就是javascript資料型別學習之淺析Symbol型別的詳細內容,更多請關注TW511.COM其它相關文章!