Symbol(ES6中新增加的數(shù)據(jù)類型)
1.Symbol的概念
* 這種數(shù)據(jù)類型提供獨(dú)一無二的值放钦;
比如:在js中聲明一個(gè)數(shù)據(jù)類型number=5;還可以通過變量b生成一個(gè)數(shù)據(jù)類型number=5的一個(gè)值各薇;這兩個(gè)值是相等的,可以理解是一樣的君躺;
用Symbol聲明的這個(gè)值不重復(fù)不相等峭判; 用Symbol這種數(shù)據(jù)類型聲明一個(gè)變量a,同樣在用Symbol聲明一個(gè)變量b棕叫,a和b永遠(yuǎn)都相等林螃;
* 用這種方式聲明的數(shù)據(jù)類型變量的話,得到的值永遠(yuǎn)不會(huì)相等俺泣,保證它們是唯一的治宣,獨(dú)一無二的;
2.symbol的作用
- symbol怎么聲明一個(gè)值砌滞;
{
//symbol聲明的變量永遠(yuǎn)是獨(dú)一無二的侮邀;
let a1 = Symbol();
let a2 = Symbol();
console.log(a1===a2); //false
//變量是獨(dú)一無二,使用的時(shí)候怎么取到這個(gè)值贝润,沒法恢復(fù)和還原绊茧?
//Symbol.for(參數(shù));這個(gè)參數(shù)是一個(gè)key值,當(dāng)有這個(gè)key值的時(shí)候打掘,for去聲明這個(gè)獨(dú)一無二的
變量的時(shí)候华畏,會(huì)先檢查這個(gè)key值鹏秋,是不是在全局注冊(cè)過,如果注冊(cè)過就返回那個(gè)值亡笑,如果沒注冊(cè)過侣夷,
就調(diào)symbol生成一個(gè)獨(dú)一無二的值;
//用a3這個(gè)key值仑乌,生成了一個(gè)獨(dú)一無二的變量a3百拓;
let a3 = Symbol.for('a3');
//在去生成a3為key值的變量的時(shí)候,之前已經(jīng)定義過a3,a4應(yīng)該拿到的是a3這個(gè)值晰甚;所以a3和a4應(yīng)該
是相等的衙传;
let a4 = Symbol.for('a3');
console.log(a3===a4);// true
}
- 怎么用?什么場(chǎng)景用厕九?
1.如果之前不實(shí)用Symbol.for定義一個(gè)a1獨(dú)一無二的值蓖捶,可以理解key值是abc,下面obj里面也有一個(gè)abc扁远,這個(gè)時(shí)候會(huì)報(bào)錯(cuò)的俊鱼;
2.obj這里定義過abc了,當(dāng)別人繼承或重寫這個(gè)屬性的時(shí)候畅买,它也有個(gè)abc這個(gè)屬性亭引,它的寫法會(huì)把之前的給覆蓋掉,這個(gè)是我們不想要的一個(gè)結(jié)果皮获;
——對(duì)象中有用到symbol做key值焙蚓,通過for in或者let of都是拿不到它的屬性的;
-
Object.getOwnPropertySymbols(obj)
——能拿到symbol作為key值的一個(gè)對(duì)象的屬性洒宝; -
Reflect.ownKeys(obj)
——返回的結(jié)果包含了symbol的變量作為key值的一個(gè)屬性购公,也包含非symbol變量的一個(gè)屬性;
{
let a1 = Symbol.for('abc');
let obj = {
[a1]:'123',
'abc':345,
'c':456
};
console.log('obj',obj);
//Object{
abc:345,
c:456,
Symbol(abc):"123"
}
for(let [key,value] of Object.entries(obj)){
console.log('let of',key,value);
//let of只拿到了abc和c這兩個(gè)屬性雁歌;Symbol(abc)這個(gè)屬性沒有拿到宏浩;
//let of abc 345
//let of c 456
}
Object.getOwnPropertySymbols(obj).forEach(function(item){
console.log(obj[item]);
//取到了a1變量這個(gè)值是123;
});
//取所有的key靠瞎、value值比庄,返回值是一個(gè)數(shù)組;用forEach遍歷乏盐;
Reflect.ownKeys(obj).forEach(function(item){
console.log('ownKeys',item,obj[item]);
//ownKeys abc 345
//ownKeys c 456
//ownKeys Symbol(abc) 123
});
}