https://es6.ruanyifeng.com/#docs/symbol
1夫晌、概述
Symbol 是 ES6 中引入的一種新的數(shù)據(jù)類型,用來表示獨(dú)一無二的值胶哲。類似于字符串畔塔。
Symbol 主要是為了解決命名沖突的問題。
ES6 之前的對(duì)象屬性名都是字符串鸯屿,這容易造成屬性名的沖突澈吨。比如,你使用了一個(gè)他人提供的對(duì)象寄摆,但又想為這個(gè)對(duì)象添加新的方法谅辣,新方法的名字就有可能與現(xiàn)有方法產(chǎn)生沖突。如果有一種機(jī)制婶恼,保證每個(gè)屬性的名字都是獨(dú)一無二的就好了桑阶,這樣就從根本上防止屬性名的沖突。這就是 ES6 引入 Symbol 的原因勾邦。
對(duì)象的屬性名現(xiàn)在可以有兩種類型蚣录,一種是原來就有的字符串,另一種就是新增的 Symbol 類型检痰。凡是屬性名屬于 Symbol 類型包归,就都是獨(dú)一無二的,可以保證不會(huì)與其他屬性名產(chǎn)生沖突。
2公壤、使用
2.1换可、創(chuàng)建 Symbol 類型的變量
- Symbol 值通過
Symbol
函數(shù)生成。
注意厦幅,Symbol
函數(shù)前不能使用new
命令沾鳄,否則會(huì)報(bào)錯(cuò)。這是因?yàn)樯傻?Symbol 是一個(gè)原始類型的值确憨,不是對(duì)象译荞。也就是說,由于 Symbol 值不是對(duì)象休弃,所以不能添加屬性吞歼。基本上塔猾,它是一種類似于字符串的數(shù)據(jù)類型篙骡。
let s = Symbol(); // s 是獨(dú)一無二的
console.log(typeof s); // symbol
-
Symbol
函數(shù)可以接受一個(gè)字符串作為參數(shù),表示對(duì) Symbol 實(shí)例的描述丈甸,主要是為了在控制臺(tái)顯示糯俗,或者轉(zhuǎn)為字符串時(shí),比較容易區(qū)分睦擂。
let s1 = Symbol('a');
let s2 = Symbol('b');
console.log(s1);
console.log(s2);
上面代碼中得湘,s1
和s2
是兩個(gè) Symbol 值,如果不加參數(shù)顿仇,它們?cè)诳刂婆_(tái)的輸出都是Symbol()
淘正,不利于區(qū)分。有了參數(shù)以后夺欲,就等于為它們加上了描述跪帝,輸出的時(shí)候就能夠分清,到底是哪一個(gè)值些阅。
但是需要注意伞剑,Symbol
函數(shù)的字符串參數(shù)只是表示對(duì)當(dāng)前 Symbol 值的描述,因此相同參數(shù)的Symbol
函數(shù)的返回值是不相等的市埋。
let s1 = Symbol();
let s2 = Symbol();
console.log(s1 === s2); // false
let s3 = Symbol('a');
let s4 = Symbol('a');
console.log(s3 === s4); // false
2.2黎泣、Symbol 類型用作對(duì)象屬性名
由于每一個(gè) Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識(shí)符缤谎,用于對(duì)象的屬性名抒倚,就能保證不會(huì)出現(xiàn)同名的屬性。這對(duì)于一個(gè)對(duì)象由多個(gè)模塊構(gòu)成的情況非常有用坷澡,能防止某一個(gè)鍵被不小心改寫或覆蓋托呕。
注意,Symbol 值作為對(duì)象屬性名時(shí),不能用點(diǎn)運(yùn)算符项郊,需使用中括號(hào)馅扣。
let obj = {};
let attr = Symbol();
obj[attr] = 'Hello World';
console.log(obj.attr); // 錯(cuò)誤,輸出 undefined
console.log(obj[attr]); // 正確着降,輸出 Hello World
let attr = Symbol();
let obj = {};
obj.attr = 'Hello'; // 使用 . 屬性名是字符串類型的
obj[attr] = 'Hello'; // 使用 [] 屬性名是 Symbol 類型的
console.log(obj); // 輸出見下圖
- 在對(duì)象的內(nèi)部差油,使用 Symbol 值定義屬性時(shí),Symbol 值必須放在方括號(hào)之中任洞。
let attr = Symbol();
let obj = {
[attr]: 'Hello World'
};
console.log(obj[attr]);
let obj = {
[Symbol()]: 'Hello World'
};
console.log(obj); // 輸出見下圖
- Symbol 對(duì)象中的方法
const method = Symbol();
let obj = {
[method]: function() {
console.log('Hello World');
}
};
obj[method](); // 調(diào)用的時(shí)候蓄喇,也需要使用中括號(hào)
const method = Symbol();
let obj = {
[method]() {
console.log('Hello World');
}
};
obj[method]();