摘要:但是,前來(lái)提到的個(gè)方法都不支持屬性,為了保持原有的功能,新增了一個(gè)方法來(lái)檢索類型的屬性接下來(lái)看一下式例以上,就是關(guān)于的基本使用方法。
ES6新增了一個(gè)基本數(shù)據(jù)類型:Symbol,至此ECMAScript的基本數(shù)據(jù)類型就有了6種:
字符串,數(shù)字,布爾,null,undefined,Symbol。
關(guān)于Symbol,我打算寫(xiě)2篇文章來(lái)提取一下比較重要的知識(shí)點(diǎn),這篇是第一篇,主要講Symbol的基本特性和使用場(chǎng)景。下一篇主要講幾個(gè)比較重要的Symbol屬性。廢話不多說(shuō),先進(jìn)入第一篇的主題:
一:Symbol的分類和創(chuàng)建
Symbol有兩種類型:
1: 非全局(非共享)類型的Symbol 2: 全局(共享)類型的Symbol
接下來(lái)就看看怎樣創(chuàng)建以上兩種不同的Symbol:
1: 創(chuàng)建非全局(非共享)類型的Symbol
所有的原始值,都有其字面形式,比如一個(gè)數(shù)字:24,一個(gè)字符串:"javaScript"。但是,Symbol沒(méi)有。創(chuàng)建一個(gè)Symbol,必須使用Symbol函數(shù):
let color = Symbol();
Symbol()函數(shù)也接受一個(gè)可選的參數(shù),其為字符串類型,可以作為這個(gè)Symbol的描述:
let color = Symbol("color");
但是,這里的描述并沒(méi)有實(shí)際的用途,你也不能通過(guò)任何途徑訪問(wèn)到它,它僅僅是用作更好地理解代碼或者調(diào)試的時(shí)候給你一些context。
2: 創(chuàng)建全局(共享)類型的Symbol
在基于可能的需求場(chǎng)景,比如你想要在一個(gè)大的代碼庫(kù)中或者跨文件追蹤一個(gè)Symbol變量,ES6提供了一個(gè)可以創(chuàng)建全局的(共享的)Symbol變量的方法,這些全局的Symbol存在于全局的Symbol注冊(cè)表里。先來(lái)看一下創(chuàng)建一個(gè)全局的Symbol的方法:
let uid = Symbol.for("uid"); console.log(uid); // Symbol(uid)
全局的Symbol,需要使用到Symbol.for()方法,接受一個(gè)字符串類型的參數(shù),這個(gè)參數(shù)作為這個(gè)Symbol的key,唯一標(biāo)示,同時(shí)也作為其描述。為了更了解全局Symbol的特性,我們可以看下面一段代碼:
let uid = Symbol.for("uid"); let uid2 = Symbol.for("uid"); console.log(uid === uid2); // true
上面一段代碼,我們先創(chuàng)建了一個(gè)key為"uid"的全局Symbol,后面又創(chuàng)建了一個(gè)相同key的全局Symbol,最后證明這兩個(gè)Symbol全等,因?yàn)楫?dāng)調(diào)用Symbol.for("uid")方法的行為表現(xiàn)為:
1: 先在全局的Symbol注冊(cè)表中查找key為"uid"的Symbol,如果已經(jīng)存在,就直接返回 2: 如果不存在,則創(chuàng)建一個(gè)新的Symbol,并用這個(gè)key在全局注冊(cè),隨即返回新創(chuàng)建的Symbol
這里還有一個(gè)方法Symbol.keyFor()用來(lái)檢測(cè)一個(gè)特定的Symbol是否已經(jīng)在注冊(cè)表中存在:
let uid = Symbol.for("uid"); let uid2 = Symbol.for("uid"); let uid3 = Symbol("uid3"); console.log(Symbol.keyFor(uid));// uid console.log(Symbol.keyFor(uid2));// uid console.log(Symbol.keyFor(uid3));// undefined
變量uid和uid2的key都是"uid",所以"uid"既是uid也是uid2的key。但是uid3不是一個(gè)全局Symbol,所以調(diào)用Symbol.keyFor()得到的結(jié)果是undefined。
二:Symbol的使用場(chǎng)景
Symbol的使用場(chǎng)景只要有: 1: 所有使用可計(jì)算屬性名的地方 2: Object.defineProperty() 3: Object.defineProperties() 下面來(lái)看一個(gè)綜合了以上三種使用場(chǎng)景的代碼示例: let firstName = Symbol("first name"); let person = { [firstName]: "mike" //用在對(duì)象的可計(jì)算屬性 }; // 用在Object.defineProperty() Object.defineProperty(person, firstName, {writable: false}); //用在Object.defineProperties() let lastName = Symbol("last name"); Object.defineProperties(person, { [lastName]: { value: "deep", writable: true } });
三:Symbol的強(qiáng)制類型轉(zhuǎn)換
Symbol是比較特殊的原始類型,因?yàn)槠渌愋蜎](méi)有與其邏輯等價(jià)的值,所以在某些可能會(huì)發(fā)生強(qiáng)制類型轉(zhuǎn)換的場(chǎng)景,會(huì)因?yàn)槎鲥e(cuò),需要特別注意一下。這里先看一下2個(gè)會(huì)報(bào)錯(cuò)的場(chǎng)景:
1: 將Symbol與字符串相加 2: 將Symbol進(jìn)行數(shù)學(xué)運(yùn)算
1: 將Symbol與字符串相加
let firstName = Symbol("first name"); let desc = firstName + "!"; //Uncaught TypeError: Cannot convert a Symbol value to a string
2: 將Symbol進(jìn)行數(shù)學(xué)運(yùn)算
let firstName = Symbol("first name"); let desc = firstName + 1; //Uncaught TypeError: Cannot convert a Symbol value to a number
以上兩例代碼都是因?yàn)镾ymbol無(wú)法直接強(qiáng)制轉(zhuǎn)換為字符串類型和數(shù)字類型,從而報(bào)錯(cuò)。但是,在一下三種場(chǎng)景中,卻可以把Symbol轉(zhuǎn)換為字符串類型:
1: 調(diào)用console.log(symbol)時(shí),會(huì)自動(dòng)轉(zhuǎn)為字符串 2: Symbol主動(dòng)調(diào)用toString()方法 3: 直接調(diào)用String(symbol)方法
看一下示例:
let firstName = Symbol("first name"); let middleName = Symbol("middle name"); let lastName = Symbol("last name"); let firstNameDesc = firstName.toString(); let middleNameDesc = String(middleName); console.log(lastName); // Symbol(last name)
使用console.log()的時(shí)候,其實(shí)是因?yàn)闀?huì)默認(rèn)調(diào)用toString()方法,把Symbol轉(zhuǎn)換為String類型。
四:Symbol屬性檢索
在ES6之前,我們已經(jīng)有2個(gè)檢索對(duì)象屬性的方法:
1: Object.keys() 返回所有可枚舉的屬性名 2: Object.getOwnPropertyNames() 不考慮可枚舉性一律返回
ES6新增了Symbol類型,且我們現(xiàn)在知道了Symbol也可以被用作對(duì)象的屬性名。但是,前來(lái)提到的2個(gè)方法都不支持Symbol屬性,為了保持原有的功能,ES6新增了一個(gè)方法來(lái)檢索Symbol類型的屬性:Object.getOwnPropertySymbols()
接下來(lái)看一下式例:
let firstName = Symbol("first name"); let person = { [firstName]: "mike", "lastName": "deep" }; console.log(Object.keys(person));//["lastName"] console.log(Object.getOwnPropertyNames(person));//["lastName"] console.log(Object.getOwnPropertySymbols(person));//[Symbol(first name)]
以上,就是關(guān)于Symbol的基本使用方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105976.html
摘要:迭代器在原有的數(shù)據(jù)結(jié)構(gòu)類型上新增了兩種類型,我們?cè)谑褂玫臅r(shí)候還可以通過(guò)自由組合的形式使用這些結(jié)構(gòu)類型達(dá)到自己想要的數(shù)據(jù)結(jié)構(gòu),這就需要一種統(tǒng)一的接口機(jī)制供我們調(diào)用處理不同的數(shù)據(jù)結(jié)構(gòu)。 引言 萬(wàn)丈高樓平地起,欲練此功,必先打好基本功: ) 在了解 ES6 新增的變量類型前,我們必須先知道 JavaScript 在ES6之前,有如下六種基本數(shù)據(jù)類型:Null、Undefined、Number...
摘要:原文你真的會(huì)克隆對(duì)象嗎開(kāi)始之前在開(kāi)始聊克隆之前,我們還是先來(lái)看看數(shù)據(jù)類型。值通過(guò)函數(shù)生成,是獨(dú)一無(wú)二的。同時(shí),中規(guī)定了對(duì)象的屬性名有兩種類型,一種是字符串,另一種就是類型。返回一個(gè)數(shù)組,包含對(duì)象自身的所有屬性的鍵名。 原文:你真的會(huì)克隆對(duì)象嗎 開(kāi)始之前 在開(kāi)始聊克隆之前,我們還是先來(lái)看看js數(shù)據(jù)類型。js的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型。 基本數(shù)據(jù)類型:Number、Bool...
摘要:可以通過(guò)調(diào)用方法將創(chuàng)建一個(gè)新的類型的值,這個(gè)值獨(dú)一無(wú)二,不與任何值相等。還可以使可擴(kuò)展,在中,表達(dá)式被標(biāo)準(zhǔn)化為構(gòu)造函數(shù)的一個(gè)方法,這意味著它是可擴(kuò)展的。 前端發(fā)展的太快了,快到ES6,ES7出來(lái)之后,今年已經(jīng)是ES8了,但是縱然前端發(fā)展很快,我們除了馬不停蹄的學(xué)習(xí)新的技術(shù)之外,也要沉下心來(lái),好好的潛心磨礪自己,本文是整理了自己學(xué)習(xí)ES6之后相關(guān)的知識(shí)要點(diǎn),寄希望于書(shū)之于筆,一來(lái)自己可以...
摘要:可以使用來(lái)判斷類型語(yǔ)法與該相關(guān)連的一個(gè)名字,可以通過(guò)這個(gè)名字獲取實(shí)例。例子說(shuō)明和實(shí)例化的實(shí)例不同,使用實(shí)例化的實(shí)例在全局保存,相同的兩個(gè)返回的實(shí)例是一樣的。 0x000 概述 Symbol是es6新的基本數(shù)據(jù)類型,所以es之后的數(shù)據(jù)類型如下: 基本數(shù)據(jù)類型: Boolean Null Undefined Number String Symbol 引用類型 Object ...
摘要:是一個(gè)布爾值,用于確定當(dāng)調(diào)用數(shù)組的方法時(shí),如果傳入?yún)?shù)是一個(gè)數(shù)組,是否需要將這個(gè)數(shù)組拍平。與其他的屬性不同的是,并不默認(rèn)出現(xiàn)在標(biāo)準(zhǔn)對(duì)象中。 ECMAScript 6 通過(guò)在原型鏈上定義與Symbol相關(guān)的屬性來(lái)暴露語(yǔ)言內(nèi)部邏輯,使得開(kāi)發(fā)者可以對(duì)一些語(yǔ)言的默認(rèn)行為做配置。接下來(lái)我們來(lái)看看有哪些重要的Symbol屬性可供我們使用: 1: Symbol.hasInstance 一個(gè)在執(zhí)行 i...
閱讀 3372·2021-11-24 09:39
閱讀 3946·2021-11-22 09:34
閱讀 5006·2021-08-11 11:17
閱讀 1156·2019-08-29 13:58
閱讀 2652·2019-08-28 18:18
閱讀 613·2019-08-26 12:24
閱讀 903·2019-08-26 12:14
閱讀 819·2019-08-26 11:58