真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ES6中Symbol類型用法實(shí)例詳解

本文實(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ì)有所幫助。


分享文章:ES6中Symbol類型用法實(shí)例詳解
網(wǎng)站URL:http://weahome.cn/article/gojssi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部