摘要:創(chuàng)建及辨別方法是原始值,因此調(diào)用會(huì)導(dǎo)致程序拋出錯(cuò)誤使用來辨別其類型可用于計(jì)算對象字面量屬性名如果想創(chuàng)建一個(gè)共享的,可使用方法方法在全局注冊表中檢索與有關(guān)的鍵全局注冊表是一個(gè)類似全局作用域的共享環(huán)境,也就是說你不能假設(shè)目前環(huán)境中存在哪些鍵與類
創(chuàng)建Symbol及辨別方法
Symbol是原始值,因此調(diào)用new Symbol會(huì)導(dǎo)致程序拋出錯(cuò)誤
let firstName = Symbol() let person = {} person[firstName] = "angela" console.log(person[firstName])
使用typeof來辨別其類型
let symbol=Symbol("this is test description") console.log(typeof symbol)//symbol
Symbol可用于計(jì)算對象字面量屬性名、Object.defineProperty、Object.defineProperties
如果想創(chuàng)建一個(gè)共享的Symbol,可使用Symbol.for方法
let uid = Symbol.for("uid") let object = { [uid]: "12345" } console.log(object[uid])//12345 console.log(uid)//Symbol(uid) let uid2 = Symbol.for("uid") console.log(uid === uid2)//true console.log(object[uid2])//12345 console.log(uid2)//Symbol(uid)
Symbol.keyFor方法在Symbol全局注冊表中檢索與Symbol有關(guān)的鍵
let uid = Symbol.for("uid") console.log(Symbol.keyFor(uid))//uid let uid2 = Symbol.for("uid") console.log(Symbol.keyFor(uid2))//uid let uid3=Symbol("uid") console.log(Symbol.keyFor(uid3))//undefined
Symbol全局注冊表是一個(gè)類似全局作用域的共享環(huán)境,也就是說你不能假設(shè)目前環(huán)境中存在哪些鍵
Symbol與類型強(qiáng)制轉(zhuǎn)換不能將Symbol強(qiáng)制轉(zhuǎn)換成數(shù)字類型,Symbol也不可以被轉(zhuǎn)換成字符串
let uid = Symbol.for("uid") let desc = uid + ""http://報(bào)錯(cuò) Uncaught TypeError: Cannot convert a Symbol value to a string
let uid = Symbol.for("uid") let desc = uid / 1//報(bào)錯(cuò) Uncaught TypeError: Cannot convert a Symbol value to a number
但是卻可以像下面這樣使用
let uid = Symbol.for("uid") let desc = String(uid) console.log(desc)//Symbol(uid)Symbol屬性檢索
Object.getOwnPropertySymbols
let uid = Symbol.for("uid") let object = { [uid]: "12345" } let symbols=Object.getOwnPropertySymbols(object)Symbol.hasInstance
Symbol.hasInstance只接受一個(gè)參數(shù),即要檢查的值
每個(gè)函數(shù)都有Symbol.hasInstance方法,用于確定對象是否為函數(shù)實(shí)例,該方法在Function.prototype中定義,該方法被定義不為可寫、不可配置、不可枚舉
let obj = [] //obj instanceof Array //下面一句代碼與此句功能等價(jià) Array[Symbol.hasInstance](obj)//true
我們可以通過Object.defineProperty方法改寫一個(gè)不可寫屬性
所以其實(shí)可以重寫所有內(nèi)建函數(shù)(如Date和Error)默認(rèn)的Symbol.hasInstance屬性
function SpecialNumber() { } Object.defineProperty(SpecialNumber, Symbol.hasInstance, { value: function (v) { return (v instanceof Number) && (v >= 1 && v <= 100) } }) var two = new Number(2), zero = new Number(0); console.log(two instanceof SpecialNumber)//true console.log(zero instanceof SpecialNumber)//falseSymbol.isConcatSpreadable
Symbol.isConcatSpreadable屬性值為true表明屬性值應(yīng)當(dāng)作為獨(dú)立元素添加到數(shù)組中
let c1 = ["red", "green"], c2 = c1.concat(["blue", "black"], "yellow") console.log(c2)//["red", "green", "blue", "black", "yellow"]
為什么上面一段代碼結(jié)果是["red", "green", "blue", "black", "yellow"]而不是["red", "green", ["blue", "black"], "yellow"]?
如果把上面的代碼稍微改一下,結(jié)果就完全不一樣了
let collection = { 0: "hello", 1: "world", 2: "demo", 3: "test", [Symbol.isConcatSpreadable]: true, length: 4 } let msg = ["Hi"].concat(collection) console.log(msg)//["Hi", "hello", "world", "demo", "test"]Symbol.match,Symbol.replace,Symbol.search,Symbol.split
let hasLenOf10 = { [Symbol.match](v) { return v.length === 10 ? [v.substring(0, 10)] : null }, [Symbol.replace](v, replacement) { return v.length === 10 ? replacement + v.substring(10) : v; }, [Symbol.search](v) { return v.length === 10 ? 0 : -1 }, [Symbol.split](v) { return v.length === 10 ? ["", ""] : [v] } } let msg1 = "Hello world", msg2 = "Hello John"; console.log(msg1.match(hasLenOf10))//null console.log(msg2.match(hasLenOf10))//[Hello John] console.log(msg1.replace(hasLenOf10))//Hello world console.log(msg2.replace(hasLenOf10))//undefined console.log(msg1.search(hasLenOf10))//-1 console.log(msg2.search(hasLenOf10))//0 console.log(msg1.split(hasLenOf10))//["Hello world"] console.log(msg2.split(hasLenOf10))//["",""]Symbol.toPrimitive
在執(zhí)行特定操作時(shí),經(jīng)常會(huì)嘗試將對象轉(zhuǎn)換到相應(yīng)的原始值
Symbol.toPrimitive被定義在每一個(gè)標(biāo)準(zhǔn)類型的原型上,并且規(guī)定了當(dāng)對象被轉(zhuǎn)換為原始值時(shí)應(yīng)該執(zhí)行的操作
每當(dāng)執(zhí)行類型轉(zhuǎn)換總會(huì)調(diào)用Symbol.toPrimitive方法并傳入一個(gè)值作為參數(shù),這個(gè)值在規(guī)范中被稱作類型提示hint,類型提示參數(shù)只有三種選擇number、string、default
function Temperature(degree) { this.degree = degree } Temperature.prototype[Symbol.toPrimitive] = function (hint) { switch (hint) { case "string": return this.degree + "u00b0"; case "number": return this.degree; case "default": return this.degree + " degrees" } } var freezing = new Temperature(32) console.log(freezing + "!")//32 degrees! console.log(freezing / 2)//16 console.log(String(freezing))//32°Symbol.toStringTag
以前判斷一個(gè)對象的類型一般都是這樣
function isArray(value) { return Object.prototype.toString.call(value) === "[object Array]" }
ES6中我們可以自定義對象字符串標(biāo)簽
function Person(name) { this.name = name } Person.prototype[Symbol.toStringTag] = "Person" Person.prototype.toString = function () { return this.name } var me = new Person("angela") console.log(me.toString())//angela console.log(Object.prototype.toString.call(me))//[object Person]
如果我們不重寫toString方法,則me.toString返回的值就是[object Person]
我們可以給Person.prototype[Symbol.toStringTag]賦任意值,當(dāng)然也可以修改原生對象的字符串標(biāo)簽
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/112443.html
摘要:創(chuàng)建及辨別方法是原始值,因此調(diào)用會(huì)導(dǎo)致程序拋出錯(cuò)誤使用來辨別其類型可用于計(jì)算對象字面量屬性名如果想創(chuàng)建一個(gè)共享的,可使用方法方法在全局注冊表中檢索與有關(guān)的鍵全局注冊表是一個(gè)類似全局作用域的共享環(huán)境,也就是說你不能假設(shè)目前環(huán)境中存在哪些鍵與類 創(chuàng)建Symbol及辨別方法 Symbol是原始值,因此調(diào)用new Symbol會(huì)導(dǎo)致程序拋出錯(cuò)誤 let firstName = Symbol()...
摘要:什么是迭代器中創(chuàng)建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數(shù)每當(dāng)招待完一條語句后函數(shù)就會(huì)自動(dòng)停止執(zhí)行關(guān)鍵字可返回任何值或表達(dá)式關(guān)鍵字只可在生成器內(nèi)部使用,在其它地方使用會(huì)導(dǎo)致程序拋出語法錯(cuò)誤所以下面例子是有錯(cuò)誤的可迭代對象具有屬 什么是迭代器 ES5中創(chuàng)建迭代器如下所示: function createIterator(items) { var i = 0 retu...
摘要:什么是迭代器中創(chuàng)建迭代器如下所示什么是生成器生成器是一種返回迭代器的函數(shù)每當(dāng)招待完一條語句后函數(shù)就會(huì)自動(dòng)停止執(zhí)行關(guān)鍵字可返回任何值或表達(dá)式關(guān)鍵字只可在生成器內(nèi)部使用,在其它地方使用會(huì)導(dǎo)致程序拋出語法錯(cuò)誤所以下面例子是有錯(cuò)誤的可迭代對象具有屬 什么是迭代器 ES5中創(chuàng)建迭代器如下所示: function createIterator(items) { var i = 0 retu...
閱讀 2058·2021-11-11 16:54
閱讀 1039·2021-10-12 10:12
閱讀 377·2019-08-30 15:43
閱讀 646·2019-08-29 13:15
閱讀 1075·2019-08-29 13:12
閱讀 1524·2019-08-26 12:09
閱讀 1655·2019-08-26 10:24
閱讀 2250·2019-08-26 10:15