摘要:今天,我們先看看第七種。這就是引入的原因。實(shí)際用途當(dāng)你第一眼看到,你會(huì)在想,什么鬼,不想用。注冊表每個(gè)是唯一的,即使兩個(gè)描述一樣的也不相等。第一句和第二句都是創(chuàng)建一個(gè),不同的是,不再是每次創(chuàng)建不同的,它會(huì)從注冊表中找,找到了就會(huì)返回。
typeof Symbol(): symbol
Javascript 一共有6種數(shù)據(jù)類型:Undefined、Null、Number、String、Object、Boolean。今天,我們先看看第七種:Symbol。
為什么要產(chǎn)生新的類型ES5的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個(gè)他人提供的對象,但又想為這個(gè)對象添加新的方法(mixin模式),新方法的名字就有可能與現(xiàn)有方法產(chǎn)生沖突。如果有一種機(jī)制,保證每個(gè)屬性的名字都是獨(dú)一無二的就好了,這樣就從根本上防止屬性名的沖突。這就是ES6引入Symbol的原因。
可見,這個(gè)類型是提供了一個(gè)不可更新的特性,這樣可以保證別人不會(huì)覆蓋你的屬性。下面我們來看看它的樣子:
語法:Symbol([description]) let mySymbol = Symbol(); let mySymbol2 = Symbol("this is just a desction");
沒有new,里面的參數(shù)只是一個(gè)描述,這就是對這個(gè)構(gòu)造器的最簡單解釋了。
實(shí)際用途當(dāng)你第一眼看到Symbol,你會(huì)在想,什么鬼,不想用。當(dāng)你知道它的特性,會(huì)讓你不得不重視它。我們知道,對象的鍵可以用數(shù)字或字符串,但這樣的話就不能保證唯一性,當(dāng)我們知道symbol的特性,就可以拿它來做試驗(yàn)了。
可以作為鍵名:
let mySymbol = Symbol(); let obj = {}; obj[mySymbol] = "hello";
如此簡單的一句,obj對象就使用了mySymbol這個(gè)symbol作為鍵屬性,它是一個(gè)symbol,不是一個(gè)字符串。你不能用點(diǎn)去訪問它了,類似的,for-in去枚舉一個(gè)含有symbol鍵的對象,也不會(huì)打印出來(看例子)。既然它的作用就是保證唯一,我們就可以在這種需求下滿足了。
唯一性
let a = "hello"; let b = "hello"; console.log( a === b); // true let a = Symbol("hello"); let b = Symbol("hello"); console.log( a === b); // false
已有的數(shù)據(jù)類型,我們很熟悉。再來看看symbol,即使是一樣的描述,它們也是不相同的。
舉一個(gè)例子:
例1
const obj = { [Symbol("age")] : 20, [Symbol("name")] : "liya", ok: true } for( var i in obj) { console.log(obj[i]); }
運(yùn)行之后,你只會(huì)得到一個(gè)true。for-in 并不能訪問到symbol,想要訪問,你必須用到專用的api。
例2
log.levels = { DEBUG: Symbol("debug"), INFO: Symbol("info"), WARN: Symbol("warn"), }; log(log.levels.DEBUG, "debug message"); log(log.levels.INFO, "info message");
咋看也沒有什么Symbol的事,事實(shí)上在ES5時(shí)代,你必須這樣寫:
log.levels = { DEBUG: 1, INFO: 2, WARN: 3, };
這樣寫的壞處是,值不是唯一的,某天如果被人把DEBUG的值改成了3,那你不是頓時(shí)懵了。用Symbol的好處在于,你不用理會(huì)它的值是什么,它只是一個(gè)占位符,并且唯一。
注冊表每個(gè)symbol是唯一的,即使兩個(gè)描述一樣的symbol也不相等。symbol的弱封裝機(jī)制:模塊創(chuàng)建了幾個(gè)symbol,可以在任意對象上使用,無須擔(dān)心與其它代碼創(chuàng)建的屬性產(chǎn)生沖突。它只在當(dāng)前的作用域生效,如果要在全局中共享,就要在全局中注冊,使用Symbol.for()去注冊。
Symbol("ok"); Symbol.for("ok"); console.log(Symbol("ok") === Symbol("ok")); // false console.log(Symbol.for("ok") === Symbol.for("ok")); // true
第一句和第二句都是創(chuàng)建一個(gè)Symbol,不同的是,Symbol.for不再是每次創(chuàng)建不同的symbol,它會(huì)從注冊表中找,找到了就會(huì)返回。無論你訪問幾次,都不會(huì)創(chuàng)建新的symbol。全局的symbol可以跨域和在多個(gè)頁面中使用。
最后查了一些資料,但也不是太過清楚,畢竟用的人還不多。期待在ES6后面能夠讓更多人去使用,類似Symbol這種api,大家只是瞄一眼就不再關(guān)注了,除了文檔不夠,更多的是設(shè)計(jì)上的問題。ES6出了有一段時(shí)間,有多少api能夠深入人心,我想只有在坐的各位比較清楚。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80551.html
摘要:第五天到第六天的內(nèi)容沒有記筆記,不好不好。第七天到第八天的學(xué)習(xí)目標(biāo)是學(xué)習(xí)布局的各種方式。主要包含相關(guān)和相關(guān)。定位的元素應(yīng)該在文檔流中的間隙不再存在絕對定位的元素不再存在于正常文檔布局流程中。內(nèi)容較多,請參考學(xué)習(xí)了容器項(xiàng)第五天到第六天的內(nèi)容沒有記筆記,不好不好。 第七天到第八天的學(xué)習(xí)目標(biāo)是:學(xué)習(xí)布局的各種方式。主要包含position相關(guān)和Flexbox相關(guān)。 知識(shí)點(diǎn): 1、默認(rèn)情況下,塊級元...
摘要:精確控制表格列寬請注意,為了確保這個(gè)技巧奏效,需要為這些表格元素指定一個(gè)寬度哪怕是。同樣,為了讓發(fā)揮作用,我們還需要為那一列指定寬度。 自適應(yīng)內(nèi)部元素 figure{ max-width: 300px; max-width: min-content;//這個(gè)關(guān)鍵字將解析為這個(gè)容器內(nèi)部最大的不可斷行元素的寬度( 即最寬的單詞、 圖片或具有固定寬度的盒元素。 mar...
摘要:簡介全稱中文為塊級格式化上下文。特征總之記住一句話元素特征表現(xiàn)原則就是內(nèi)部元素?zé)o論怎么翻江倒海,都不會(huì)影響外部元素。如何觸發(fā),常見如下的值不為的值為,或。的值不為和需掌握自適應(yīng)模塊布局內(nèi)容很多,具體參考1、BFC簡介 BFC全稱block formatting context,中文為塊級格式化上下文。特征總之記住一句話: BFC元素特征表現(xiàn)原則就是:內(nèi)部元素?zé)o論怎么翻江倒海,都不會(huì)影響外部元...
摘要:正確使用并行流錯(cuò)用并行流而產(chǎn)生錯(cuò)誤的首要原因,就是使用的算法改變了某些共享狀態(tài)。高效使用并行流留意裝箱有些操作本身在并行流上的性能就比順序流差還要考慮流的操作流水線的總計(jì)算成本。 一、并行流 1.將順序流轉(zhuǎn)換為并行流 對順序流調(diào)用parallel方法: public static long parallelSum(long n) { return Stream.iterate(1L...
摘要:路徑一相對路徑同級路徑下級路徑上級路徑上一級路徑上兩級二絕對路徑列表列表特點(diǎn)整齊整潔有序一無序列表語法格式注里一般只放標(biāo)簽標(biāo)簽里可以容納所有元素?zé)o序列表會(huì)自帶樣式屬性,一般在中修改二有序列表語法格式注里一般只放標(biāo)簽標(biāo)簽里可以容納所有元素有序1、路徑 一、相對路徑1、同級路徑2、下級路徑 /3、上級路徑 ../上一級路徑 ../../上兩級二、絕對路徑 2、列表 列表特點(diǎn);整齊、整潔、...
閱讀 2013·2021-09-29 09:35
閱讀 1949·2019-08-30 14:15
閱讀 2973·2019-08-30 10:56
閱讀 954·2019-08-29 16:59
閱讀 571·2019-08-29 14:04
閱讀 1300·2019-08-29 12:30
閱讀 1020·2019-08-28 18:19
閱讀 509·2019-08-26 11:51