本文實(shí)例講述了ES6中的Symbol類型。分享給大家供大家參考,具體如下:
10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有湖州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Symbol是在ES6中新加入的類型。
正如我們所知,JavaScript中有以下幾種類型:
Undefined,Null,Boolean,Number,String, Object。
但是上述類型在處理某些情況的時(shí)候是遠(yuǎn)遠(yuǎn)不夠的。下面我們來(lái)舉一個(gè)例子:
假設(shè)我們要移動(dòng)div,也需要在某些情況下判斷該div是否處于移動(dòng)狀態(tài),所以我們會(huì)想到給div這類的對(duì)象設(shè)置一個(gè)屬性。
if (element.isMoving) { smoothAnimations(element); } element.isMoving = true;
但是這樣會(huì)存在一些問(wèn)題,比如:
我們可能和第三方的庫(kù)沖突;
我們可能和未來(lái)的標(biāo)準(zhǔn)沖突等。
于是可以采用第二種方法,也就是采用加密函數(shù),制定一個(gè)值:
var isMoving = SecureRandom.generateName(); ... if (element[isMoving]) { smoothAnimations(element); } element[isMoving] = true;
這樣確實(shí)解決了沖突問(wèn)題,但卻帶來(lái)了調(diào)試問(wèn)題,我們每次查看該對(duì)象屬性時(shí)都會(huì)看見(jiàn)一大堆垃圾命名。
于是為了解決沖突問(wèn)題,ES6提出了Symbol這樣的新類型。
Symbol是一種特殊的、不可變的數(shù)據(jù)類型,可以作為對(duì)象屬性的標(biāo)識(shí)符使用。我們看demo:
var sym1 = Symbol(); var sym2 = Symbol("foo"); var sym3 = Symbol("foo");
Symbol("foo")
不會(huì)強(qiáng)制字符串 "foo" 進(jìn)入一個(gè)Symbol,它每次都創(chuàng)建一個(gè)新的Symbol:
Symbol("foo") === Symbol("foo"); // false
所以可以利用這個(gè)特性來(lái)創(chuàng)建私有屬性:
(function() { // 創(chuàng)建symbol var key = Symbol("key"); function MyClass(privateData) { this[key] = privateData; } MyClass.prototype = { doStuff: function() { ... this[key] ... } }; })(); var c = new MyClass("hello") c["key"] === undefined//無(wú)法訪問(wèn)該屬性,因?yàn)槭撬接械?
也可以利用Symbol來(lái)解除上面所說(shuō)的沖突問(wèn)題:
// create a unique symbol var isMoving = Symbol("isMoving"); ... if (element[isMoving]) { smoothAnimations(element); } element[isMoving] = true;
當(dāng)然,也可以通過(guò)另外的調(diào)用方法來(lái)生成可以與外界共享的Symbol類型,就是Symbol.for方法。
Symbol.for(key)
方法會(huì)根據(jù)給定的鍵 key,來(lái)從 symbol 注冊(cè)表中找到對(duì)應(yīng)的 symbol,如果找到了,則返回它,否則,新建一個(gè)與該鍵關(guān)聯(lián)的 symbol,并放入 symbol 注冊(cè)表中。
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 自身的描述字符串
所以為了防止沖突,我們最好給symbol帶上前綴:
Symbol.for("mdn.foo"); Symbol.for("mdn.bar");
希望本文所述對(duì)大家ECMAScript程序設(shè)計(jì)有所幫助。