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