摘要:函數的參數只是表示對當前值的描述,因此相同參數的函數的返回值是不相等的。方法返回的是一個數組成員是當前對象中所有用作屬性名的值。
Symbol 概述
ES6引進了一種新的原始數據類型Symbol表示獨一無二的值。它是JavaScript語言的第七種類型。
Symbol值是通過Symbol函數生成。這就是說,對象的屬性名吸納在可以有兩種類型,一種是原來的字符串,另一種就是新增的Symbol類型。凡是屬性名屬于Symbol類型,就都是獨一無二的,可以保證不會與其他屬性名沖突。
let s = Symbol(); alert(typeof s) //Symbol
注意:
1.symbol函數不能使用new命令,否則會報錯 2.Symnol是一個原始類型的值,不是對象(不能添加屬性) 3.它是一種類似于字符串的數據類型
Symbol函數可以接收一個字符串作為參數,表示對Symbol實例的描述,主要是為了在控制臺顯示,或者轉為字符串時比較容易區分。
Symbol函數的參數只是表示對當前Symbol值的描述,因此相同參數的Symbol函數的返回值是不相等的。
// 沒有參數的情況 let s1 = Symbol(); let s2 = Symbol(); s1 === s2 // false //有參數的情況 let s1 = Symbol("foo") let s1 = Symbol("bar") s1 === s2 // false //如果參數是一個對象,就會調用改對象的toString方法,將其轉為字符串,然后才生成一個Symbol值 const obj = { toString() { return "abc"; } }; const sym = Symbol(obj); sym // Symbol(abc)作為屬性名的Symbol
let mySymbol = Symbol(); // 第一種寫法 let a = {}; a[mySymbol] = "Hello!"; // 第二種寫法 let a = { [mySymbol]: "Hello!" }; // 第三種寫法 let a = {}; Object.defineProperty(a, mySymbol, { value: "Hello!" }); // 以上寫法都得到同樣結果 a[mySymbol] // "Hello!" a.mySymbol // undefined //作為對象屬性名時,不能用點運算符。 a.mySymbol = "Hello!"; a[mySymbol] // undefined a["mySymbol"] // "Hello!" //因為點運算符后面是字符串,所以不會讀取mySymbol作為標識名所指代的那個值,導致a的屬性名實際上是一個字符串,而不是一個 Symbol 值。屬性名的遍歷
Symbol作為屬性名,該屬性不會出現在for...in、for...of也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()
返回。但是它也不是私有屬性。有一個Object。getOwnPropertySymbols方法,可以獲取指定對象的所有Symbol屬性名。
Object.getOwnPropertySymbol方法返回的是一個數組,成員是當前對象中所有用作屬性名的Symbol值。
const obj = {}; let foo = Symbol("foo"); Object.defineProperty(obj, foo, { value: "foobar", }); for (let i in obj) { console.log(i); // 無輸出 } Object.getOwnPropertyNames(obj) // [] Object.getOwnPropertySymbols(obj) // [Symbol(foo)]
另一個新的 API,Reflect.ownKeys方法可以返回所有類型的鍵名,包括常規鍵名和 Symbol 鍵名。
let obj = { [Symbol("my_key")]: 1, enum: 2, nonEnum: 3 }; Reflect.ownKeys(obj) // ["enum", "nonEnum", Symbol(my_key)]
由于以Symbol值作為名稱的屬性,不會被常規方法遍歷得到。我們可以利用這個特性,為對象定義一些非私有的,但又希望只用于內部的方法。
let size = Symbol("size"); class Collection{ constructor(){ this[size] = 0; } } add(item){ this[this[size]] = item; this[size]++; } static sizeOf(instance){ return instance[size]; } let x = new Collection(); Collection.sizeOf(x); //0 x.add("foo"); Collection.sizeOf(x) // 1 Object.keys(x) // ["0"] Object.getOwnPropertyNames(x) // ["0"] Object.getOwnPropertySymbols(x) // [Symbol(size)] //對象x的size屬性是一個Symbol值,所有Object.key(x)、object.getOwnPropertyName(x)symbol.for(),symbol.keyFor()
有時,我們希望重新使用同一個Symbol值,symbol.for()方法可以做到這一點。它接受一個字符串作為參數,然后搜索有沒有以該參數作為名稱的Symbol值。如果有,就返回這個Symbol值,否則就新建并返回一個以該字符串為名稱的Symbol值。
let s1 = Symbol.for("foo"); let s2 = Symbol.for("foo"); s1 === s2 //true
Symbol.for()與Symbol()這兩種寫法,都會生成新的Symbol,它們的區別是,前者會被登記在全局環境中供搜索,后者不會。Symbol.for()不會每次調用就返回一個新的Symbol類型的值,而是會先檢查給定的key是否已經存在,如果不存在才會新建一個值。
Symbol.for("bar") === Symbol.for("bar") // true Symbol("bar") === Symbol("bar") // false
Symbol.keyFor方法返回一個已登記的symbol類型的key
let s1 = Symbol.for("foo"); Symbol.keyFor(s1) //"foo" let 上 = Symbol("foo"); Symbol.keyFor(s2); //undefined
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/103785.html
摘要:使用新特性開發微信小程序國際化與本地化新特性國際化與本地化新增了很多對于國際化的支持,比如時間格式,貨幣格式,數字格式等。 ECMAScript 6(簡稱ES6)是JavaScript語言的最新標準。因為當前版本的ES6是在2015年發布的,所以又稱ECMAScript 2015。 微信小程序支持絕大部分ES6的新增特性。 使用ES6新特性開發微信小程序(1) ES6新特性:Cons...
摘要:更新了個版本,最新正式版是語言的下一代標準,早已在年月正式發布。基本不支持移動端瀏覽器對的支持情況版起便可以支持的新特性。比較通用的工具方案有,,,等。 1、ECMAScript是什么? 和 JavaScript 有著怎樣的關系? 1996 年 11 月,Netscape 創造了javascript并將其提交給了標準化組織 ECMA,次年,ECMA 發布 262 號標準文件(ECMA-...
摘要:但是在中,可以通過關鍵字來實現類的繼承的使用可以使得繼承意義更加明確并且值得一提的是,如果你使用來定義的組件,那么可以在類的構造器里面,用簡單的的聲明方式來替代方法。 原文:The 10 min ES6 course for the beginner React Developer譯者:Jim Xiao 著名的80/20定律可以用來解釋React和ES6的關系。因為ES6增加了超過75...
摘要:,正式名稱是,但是這個名稱更加簡潔。已經不再是最新的標準,但是它已經廣泛用于編程實踐中。而制定了模塊功能。自從年雙十一正式上線,累計處理了億錯誤事件,得到了金山軟件等眾多知名用戶的認可。 譯者按: 人生苦短,我用ES6。 原文: Top 10 ES6 Features Every Busy JavaScript Developer Must Know 譯者: Fundebug 為了保...
摘要:今天閑來無事,看見幾行小字。又說所有對象,繼承終是。強行押韻一波這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網上看到了任何對象都是從對象繼承而來的這句話。一時興起,便去驗證這句話。 今天閑來無事,看見幾行小字。又說所有對象,繼承終是Obj?!?強行押韻一波 這首詩的意思就是說的我今天沒有什么事情,然后無意中又在網上看到了任何對象都是從Object對象繼承而來的這句話。一時興...
閱讀 2495·2021-11-15 18:14
閱讀 1720·2021-10-14 09:42
閱讀 3760·2021-10-11 10:58
閱讀 3961·2021-10-09 09:44
閱讀 2421·2021-09-26 09:55
閱讀 2443·2021-09-24 10:38
閱讀 2035·2021-09-04 16:48
閱讀 3276·2021-09-02 15:21