我們經(jīng)常要用到使用唯一性變量的場景羊初,以前都自己封裝UUID了之類的函數(shù)來得到,ES6專門提供了一種數(shù)據(jù)類型Symbol來提供唯一性的值舶衬;
1 使用Symbol()函數(shù)獲取Symbol變量
let a = Symbol();
console.log(typeof a);//symbol
let b = Symbol();
console.log(a==b,a===b);//false false
注意:Symbol() S雖然大寫埠通,但這只是個函數(shù),獲取Symbol變量時并未使用new關(guān)鍵字
2 使用Symbol.for(arg)在Symbol變量中混入自定義值
let a = Symbol.for('my');
let b = Symbol.for('my');
console.log(a==b,a===b);//true true
注意:不要因為a和b相等判斷為true就認(rèn)為這個值不是唯一性值了逛犹,而是因為Symbol.for(arg)函數(shù)會檢測有沒有與arg相關(guān)的Symbol類型端辱,如果有就返回,如果沒有才新建虽画。所以上述代碼中a和b本來就是指向了一個Symbol變量舞蔽,當(dāng)然相等了。
3 遍歷Symbol屬性码撰,有對象如下
let a = Symbol.for('my');
let obj = {
[a]:'qiang',
age:18
}
- 使用let of遍歷該對象是拿不到Symbol屬性的渗柿。
for(let [key,value] of Object.entries(obj)){
console.log(key,value);
}
//age 18
- 使用Object.getOwnPropertySymbol(obj)可得到一個包含該對象所有Symbol類型屬性的數(shù)組
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(item,obj[item]);
})
//Symbol('my') qiang
- 使用Reflect.ownKeys(obj)可得到一個包含該對象所有屬性的數(shù)組
Reflect.ownKeys(obj).forEach(function(item){
console.log(item,obj[item]);
})
//age 18
//Symbol('my') qiang