国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

es6 symbol的實現方法示例

2024-05-06 15:41:09
字體:
來源:轉載
供稿:網友

背景

ES5 的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象添加新的方法(mixin 模式),新方法的名字就有可能與現有方法產生沖突。如果有一種機制,保證每個屬性的名字都是獨一無二的就好了,這樣就從根本上防止屬性名的沖突。這就是 ES6 引入Symbol的原因。
ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。
Symbol 值通過Symbol函數生成。這就是說,對象的屬性名現在可以有兩種類型,一種是原來就有的字符串,另一種就是新增的 Symbol 類型。凡是屬性名屬于 Symbol 類型,就都是獨一無二的,可以保證不會與其他屬性名產生沖突。

let s = Symbol();typeof s// "symbol"

上面代碼中,變量s就是一個獨一無二的值。typeof運算符的結果,表明變量s是 Symbol 數據類型,而不是字符串之類的其他類型。

注意,Symbol函數前不能使用new命令,否則會報錯。這是因為生成的 Symbol 是一個原始類型的值,不是對象。也就是說,由于 Symbol 值不是對象,所以不能添加屬性。基本上,它是一種類似于字符串的數據類型。
Symbol函數可以接受一個字符串作為參數,表示對 Symbol 實例的描述,主要是為了在控制臺顯示,或者轉為字符串時,比較容易區分。

let s1 = Symbol('foo');let s2 = Symbol('bar');s1 // Symbol(foo)s2 // Symbol(bar)s1.toString() // "Symbol(foo)"s2.toString() // "Symbol(bar)"

上面代碼中,s1和s2是兩個 Symbol 值。如果不加參數,它們在控制臺的輸出都是Symbol(),不利于區分。有了參數以后,就等于為它們加上了描述,輸出的時候就能夠分清,到底是哪一個值。

如果 Symbol 的參數是一個對象,就會調用該對象的toString方法,將其轉為字符串,然后才生成一個 Symbol 值。

const obj = { toString() {  return 'abc'; }};const sym = Symbol(obj);sym // Symbol(abc)

注意,Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。

// 沒有參數的情況let s1 = Symbol();let s2 = Symbol();s1 === s2 // false// 有參數的情況let s1 = Symbol('foo');let s2 = Symbol('foo');s1 === s2 // false

上面代碼中,s1和s2都是Symbol函數的返回值,而且參數相同,但是它們是不相等的。

Symbol 值不能與其他類型的值進行運算,會報錯。

let sym = Symbol('My symbol');"your symbol is " + sym// TypeError: can't convert symbol to string`your symbol is ${sym}`// TypeError: can't convert symbol to string            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长岛县| 龙海市| 扶沟县| 舞钢市| 达孜县| 平顶山市| 洛扎县| 汶川县| 集安市| 普宁市| 临澧县| 井研县| 灵台县| 辽源市| 德州市| 湖北省| 新绛县| 遵化市| 瓮安县| 洛阳市| 云阳县| 曲沃县| 炎陵县| 绥江县| 西藏| 鱼台县| 城市| 达尔| 大连市| 卢湾区| 余姚市| 霍山县| 逊克县| 镇宁| 黄陵县| 汝阳县| 余江县| 新源县| 乌兰浩特市| 上栗县| 万山特区|