一秋忙、概述
在ES5中彩掐,對(duì)象屬性名都是字符串容易造成屬性名沖突。為了避免這種情況的發(fā)生灰追,ES6引入了一種新的原始數(shù)據(jù)類型Symbol堵幽,表示獨(dú)一無(wú)二的值。
symbol 是JavaScript 在ES6 中一種基本數(shù)據(jù)類型弹澎。Symbol() 函數(shù)返回的是 Symbol 類型的值朴下,該類型具有靜態(tài)方法和靜態(tài)屬性。
1苦蒿、定義
Symbol([description])
參數(shù) description 是一個(gè)可選參數(shù)殴胧,是一個(gè)字符串,可以用于調(diào)試佩迟,但不能訪問(wèn)Symbol 自身团滥。
var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');
2、每一個(gè) Symbol() 返回的值都是唯一的报强。一個(gè)Symbol 值能作為對(duì)象屬性的標(biāo)識(shí)符灸姊,這是改數(shù)據(jù)類型僅有的目的。
Symbol("yuan") === Symbol("yuan"); // false
3秉溉、不可以使用 new 操作符
var sym = new Symbol(); // TypeError報(bào)錯(cuò)
4力惯、結(jié)合 Object() 函數(shù),創(chuàng)建一個(gè) Symbol 包裝器對(duì)象
var sym = Symbol();
typeof sym; // "symbol“”
var symobj = Object(sym);
typeof symobj; // "object"
5召嘶、全局共享 Symbol
上面使用 Symbol() 函數(shù)的語(yǔ)法父晶,不會(huì)在你的整個(gè)代碼庫(kù)中創(chuàng)建一個(gè)可用的全局 symbol類型。要?jiǎng)?chuàng)建跨文件可用的symbol弄跌,甚至跨域(每個(gè)都有它自己的全局作用域) , 使用Symbol.for() 方法會(huì)根據(jù)給定的鍵 key甲喝,來(lái)從運(yùn)行時(shí)的 symbol 注冊(cè)表中找到對(duì)應(yīng)的 symbol,如果找到了碟绑,則返回它俺猿,否則茎匠,新建一個(gè)與該鍵關(guān)聯(lián)的 symbol,并放入全局 symbol 注冊(cè)表中從全局的symbol注冊(cè)?表設(shè)置和取得symbol押袍。
6诵冒、在對(duì)象中查找 Symbol 屬性
var obj = {};
var a = Symbol("a");
var b = Symbol.for("b");
obj[a] = "localSymbol";
obj[b] = "globalSymbol";
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols) // [Symbol(a), Symbol(b)]
二、靜態(tài)屬性
1谊惭、length 屬性
Symbol.length // 0
Symbol 的長(zhǎng)度屬性值為0.
2汽馋、迭代 Symbols
Symbol.iterator
該方法為每一個(gè)對(duì)象定義了默認(rèn)的迭代器。該迭代器可以被 for.. of 循環(huán)使用圈盔。
自定義迭代器
var myIterator = {};
myIterator[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...myIterator] // [1, 2, 3]
Symbols 與 for... in 迭代
var obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (var i in obj) {
console.log(i);
}
// "c"
// "d"
3豹芯、Symbol的正則表達(dá)式:用于標(biāo)識(shí)對(duì)象是否具有正則表達(dá)式的行為
Symbol.match:對(duì)象是否具有指定的匹配的正則表達(dá)式
"/bar/".startsWith(/bar/);
// Throws TypeError, 因?yàn)?/bar/ 是一個(gè)正則表達(dá)式
// 且 Symbol.match 沒(méi)有修改。
如果你將 Symbol.match 置為 false驱敲,使用 match 屬性的表達(dá)式檢查會(huì)認(rèn)為該象不是正則表達(dá)式對(duì)象铁蹈。startsWith 和 endsWith 方法將不會(huì)拋出 TypeError。
var re = /foo/;
re[Symbol.match] = false;
"/foo/".startsWith(re); // true
"/baz/".endsWith(re); // false
Symbol.replace
這個(gè)屬性指定了當(dāng)一個(gè)字符串替換所匹配字符串時(shí)所調(diào)用的方法众眨。String.prototype.replace() 方法會(huì)調(diào)用此方法握牧。
Symbol.search
指定了一個(gè)搜索方法,這個(gè)方法接受用戶輸入的正則表達(dá)式娩梨,返回該正則表達(dá)式在字符串中匹配到的下標(biāo)沿腰,這個(gè)方法由以下的方法來(lái)調(diào)用 String.prototype.search()。
Symbol.split
指向 一個(gè)正則表達(dá)式的索引處分割字符串的方法狈定。 這個(gè)方法通過(guò) String.prototype.split() 調(diào)用颂龙。
4、其他屬性
Symbol.hasInstance
一個(gè)確定一個(gè)構(gòu)造器對(duì)象識(shí)別的對(duì)象是否為它的實(shí)例的方法纽什。使用 instanceof.
Symbol.isConcatSpreadable
一個(gè)布爾值措嵌,表明一個(gè)對(duì)象是否應(yīng)該flattened為它的數(shù)組元素。使用Array.prototype.concat().
Symbol.unscopables
擁有和繼承屬性名的一個(gè)對(duì)象的值被排除在與環(huán)境綁定的相關(guān)對(duì)象外稿湿。
Symbol.species
一個(gè)用于創(chuàng)建派生對(duì)象的構(gòu)造器函數(shù)铅匹。
Symbol.toPrimitive
一個(gè)將對(duì)象轉(zhuǎn)化為基本數(shù)據(jù)類型的方法押赊。
Symbol.toStringTag
用于對(duì)象的默認(rèn)描述的字符串值饺藤。使用Object.prototype.toString().
三、靜態(tài)方法
1流礁、Symbol.for(key)
改方法根據(jù)給定的鍵 key涕俗, 從運(yùn)行時(shí)的 symbol 注冊(cè)表中找到對(duì)應(yīng)的 symbol,如果找到了神帅,則返回它再姑,否則,新建一個(gè)與該鍵關(guān)聯(lián)的 symbol找御,并放入全局 symbol 注冊(cè)表元镀。
這里的參數(shù)key绍填,是一個(gè)字符串,作為 symbol 注冊(cè)表中與某 symbol 關(guān)聯(lián)的鍵栖疑。
和 Symbol() 不同的是讨永,用Symbol.for() 方法創(chuàng)建的 symbol 會(huì)被放入一個(gè)全局 symbol 注冊(cè)表中。Symbol.fo() 并不是每次都會(huì)創(chuàng)建一個(gè)新的 symbol遇革,它會(huì)首先檢查給定的 key 是否已經(jīng)在注冊(cè)表中了卿闹,如果是,則會(huì)直接返回上次存儲(chǔ)的那個(gè)萝快。否則锻霎,會(huì)再新建一個(gè)。
Symbol.for("foo"); // 創(chuàng)建一個(gè) symbol 并放入 symbol 注冊(cè)表中揪漩,鍵為 "foo"
Symbol.for("foo"); // 從 symbol 注冊(cè)表中讀取鍵為"foo"的 symbol
Symbol.for("bar") === Symbol.for("bar"); // true旋恼,證明了上面說(shuō)的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函數(shù)每次都會(huì)返回新的一個(gè) symbol
var sym = Symbol.for("mario");
sym.toString();
// "Symbol(mario)"奄容,mario 既是該 symbol 在 symbol 注冊(cè)表中的鍵名蚌铜,又是該 symbol 自身的描述字符串
2、Symbol.keyFor(sym)
該方法用來(lái)獲取 symbol 注冊(cè)表中與某個(gè) symbol 關(guān)聯(lián)的鍵嫩海。
參數(shù) sym 是指存儲(chǔ)在 symbol 注冊(cè)表中的某個(gè) symbol冬殃。
// 創(chuàng)建一個(gè) symbol 并放入 Symbol 注冊(cè)表,key 為 "foo"
var globalSym = Symbol.for("foo");
Symbol.keyFor(globalSym); // "foo"
// 創(chuàng)建一個(gè) symbol叁怪,但不放入 symbol 注冊(cè)表中
var localSym = Symbol();
Symbol.keyFor(localSym); // undefined审葬,所以是找不到 key 的
本章介紹了JavaScript 的一個(gè)新的基礎(chǔ)數(shù)據(jù)類型:Symbol,需要掌握此類型數(shù)據(jù)在JavaScript 所充當(dāng)?shù)木唧w角色奕谭,以及其屬性的具體含義涣觉,和Symbol兩個(gè)方法的應(yīng)該用。
章節(jié)目錄
1血柳、ES6中啥是塊級(jí)作用域官册?運(yùn)用在哪些地方?
2难捌、ES6中使用解構(gòu)賦值能帶給我們什么膝宁?
3、ES6字符串?dāng)U展增加了哪些根吁?
4员淫、ES6對(duì)正則做了哪些擴(kuò)展?
5击敌、ES6數(shù)值多了哪些擴(kuò)展介返?
6、ES6函數(shù)擴(kuò)展(箭頭函數(shù))
7、ES6 數(shù)組給我們帶來(lái)哪些操作便利圣蝎?
8刃宵、ES6 對(duì)象擴(kuò)展
9、Symbol 數(shù)據(jù)類型在 ES6 中起什么作用徘公?
10组去、Map 和 Set 兩數(shù)據(jù)結(jié)構(gòu)在ES6的作用
11、ES6 中的Proxy 和 Reflect 到底是什么鬼步淹?
12从隆、從 Promise 開(kāi)始踏入異步操作之旅
13、ES6 迭代器(Iterator)和 for...of循環(huán)使用方法
14缭裆、ES6 異步進(jìn)階第二步:Generator 函數(shù)
15键闺、JavaScript 異步操作進(jìn)階第三步:async 函數(shù)
16、ES6 構(gòu)造函數(shù)語(yǔ)法糖:class 類