
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中文網其它相關文章!