?前言
Symbol 基本數據類型 獨一無二得值 ?Symbol函數創建 接收字符串 對symbol值得描述
let s1 = Symbol('描述')
/*** symbol 基本數據類型 表示獨一無二的值 Symbol函數創建獨一無二得值 參數可以是唯一值得描述*/
let sy1 = Symbol();//創建好一個獨一無二得值
let sy2 = Symbol();
console.log(sy1,sy2)
console.log(sy1 === sy2);
console.log(typeof sy1,sy1 instanceof Object);let sy1 = Symbol('symbol數據類型');//對獨一無二值得描述
let sy2 = Symbol({name:'zhangsan'})
let sy3 = Symbol([1,2,3]);
let sy4 = Symbol(null);
console.log(sy1,sy2,sy3,sy4);
應用:
? 1.解決命名沖突
? 無法直接訪問 Object.getOwnProperSymbols(); 得到存放symbol屬性名數組
? let res = Object.getOwnProperSymbols();//[Symbol('name'),Symbol('age')]
? obj[res[0]]
/*** Symbol應用* 1.解決命名沖突 */
let sy1 = Symbol('name');
let sy2 = Symbol('age');
let obj = {name:'zhangsan',age:12,[sy1]:'terry',[sy2]:18,[Symbol('email')]:'xxx@briup.com'
};
//為了訪問Symbol創建屬性
console.log(Object.getOwnPropertySymbols(obj));
var ss = Object.getOwnPropertySymbols(obj);//[ Symbol(name), Symbol(age), Symbol(email) ]
console.log(obj[ss[0]],obj[ss[1]]);console.log(obj[Symbol('email')]);//無效 undefined
console.log(obj[sy1]);//可以訪問屬性
console.log(obj[sy2]);
// 遍歷對象 使用symbol值創建屬性無法遍歷
for(let key in obj){console.log(key)
}
? ?2.消除魔術字符串?
? ? ? 代碼對于字符串依賴關系強,形成強耦合 形成魔術字符串
/** * 2.消除魔術字符串 代碼對字符串依賴性非常強 形成強耦合關系 形成了魔術字符串*/
function Area(shape,options){let area = 0;switch(shape){case 'triangle':area = options.width * options.height * 0.5;break;case 'square':area = options*width * options.height;break;case 'circle':area = Math.PI * options.r * options.r;break;default:area = -1;}return area;
}
let res = Area('triangle',{width:100,height:100,r:50});
console.log(res);function Area(shape,options){let area = 0;switch(shape){case Shape.SJX:area = options.width * options.height * 0.5;break;case Shape.ZFX:area = options.width * options.height;break;case Shape.CIRCLE:area = Math.PI * options.r * options.r;break;default:area = -1;}return area;
};
// 枚舉 類型可以羅列出來 性別:男 女
let Shape = {SJX:Symbol('三角形'),ZFX:Symbol('正方形'),CIRCLE:Symbol('圓')
}let res = Area(Shape.ZFX,{width:100,height:100,r:50});
console.log(res);
? 3.全局注冊表?
? ? 可以使用Symbol.for全局注冊一個Symbol值 ?
? ? Symbol.for('hello');
? ? Symbol.for('hello');
? ??
? ? Symbol.keyFor 檢測Symbol有沒有全局注冊過 注冊過返回Symbol值得描述或者undefined
?
/*** 全局注冊表 Symbol.for*/
// 可以創建一個symbol值的時候進行全局注冊
let sy1 = Symbol.for('name');
let sy2 = Symbol.for('name');
console.log(sy1 === sy2);let sy3 = Symbol('age');
let sy4 = Symbol('age');
console.log(sy3 === sy4);// Symbol.keyFor 檢測symbol值有沒有在全局注冊過 注冊過返回symbol值得描述 沒有返回undefined
console.log(Symbol.keyFor(sy1));
console.log(Symbol.keyFor(sy2));
console.log(Symbol.keyFor(sy3));
console.log(Symbol.keyFor(sy4));