2021-03-21

一堡掏、Let和Const

let聲明變量,可變

const定義常量(實(shí)際指的是變量和的內(nèi)存地址)冗栗,不可變

只能在其聲明或定義的代碼塊內(nèi)有效

注:若區(qū)塊中存在let或者const命令王污,則這個(gè)區(qū)塊對(duì)這些變量和常量在一開始就行成封閉作用域,只要在聲明之前使用就會(huì)報(bào)錯(cuò)(可能會(huì)出現(xiàn)暫時(shí)性死區(qū))

不能重復(fù)聲明棒妨,否則報(bào)錯(cuò)

(一)塊級(jí)作用域

閉包:JS中的變量是沒有作用域時(shí)的一個(gè)臨時(shí)解決方案

塊級(jí)作用域可以任意嵌套

外層作用域不能訪問內(nèi)層作用域的變量

內(nèi)層作用域可以定義外層作用域的變量

函數(shù)中的塊級(jí)作用域

es6中在塊級(jí)作用域中可以聲明函數(shù)

函數(shù)聲明的語句和let的行為類似,在塊級(jí)作用域外不能訪問

函數(shù)聲明也會(huì)提到塊級(jí)作用域的頭部

(二)ES6聲明變量的6種方式

var

function

let

const

import

class

二含长、解構(gòu)賦值

按照一定模式從數(shù)組和對(duì)象中提取值券腔,然后賦值給變量

如果解構(gòu)不成功灾炭,則變量的值為undefined

不完全解構(gòu):等號(hào)左邊的模式值匹配一部分的等號(hào)右邊的數(shù)組,仍然可以解構(gòu)成功

解構(gòu)賦值允指定默認(rèn)值

默認(rèn)值可以引起解構(gòu)的其他變量颅眶,但是該變量必須已經(jīng)聲明

(一)對(duì)象的解構(gòu)賦值

數(shù)組的元素是按照次序排列的,變量的取值是按照他的位置決定的田弥,而對(duì)象沒有次序涛酗,變量必須與屬性同名才能取到正確的值

對(duì)象的解構(gòu)也可以指定默認(rèn)值,默認(rèn)值生效的條件是偷厦,對(duì)象的屬性嚴(yán)格的等于undefined

如果解構(gòu)失敗商叹,變量的值就等于undefined

如果解構(gòu)的模式是嵌套的對(duì)象,而且子對(duì)象所在的父屬性不存在只泼,則會(huì)報(bào)錯(cuò)

不會(huì)復(fù)制繼承自原對(duì)象的屬性

(二)字符串的解構(gòu)賦值

字符串解構(gòu)賦值時(shí)字符串被轉(zhuǎn)換成了一個(gè)類似于數(shù)組的對(duì)象(類似于數(shù)組的對(duì)象還有一個(gè)length屬性剖笙,也可對(duì)其賦值)

(三)數(shù)值和布爾的解構(gòu)賦值

解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值或者布爾值请唱,則會(huì)先轉(zhuǎn)換成為對(duì)象弥咪,在進(jìn)行賦值

解構(gòu)的規(guī)則:只要等號(hào)的右邊不是對(duì)象或者數(shù)組,都會(huì)先將其轉(zhuǎn)換成對(duì)象(注:undefined和null無法轉(zhuǎn)換成對(duì)象十绑,對(duì)其進(jìn)行賦值時(shí)都會(huì)報(bào)錯(cuò))

(四)函數(shù)的解構(gòu)賦值

函數(shù)參數(shù)也可以進(jìn)行解構(gòu)聚至,也可使用默認(rèn)值

(五)圓括號(hào)問題

變量聲明語句,模式不能使用圓括號(hào)(eg:函數(shù)的參數(shù))

賦值語句的非模式部分可以使用圓括號(hào)

三本橙、字符串的擴(kuò)展

JS允許使用\uxxxx的形式表示一個(gè)字符扳躬,xxxx:字符的Unicode碼點(diǎn)

在JS內(nèi)部,字符以UTF-16的格式存儲(chǔ)甚亭,每個(gè)字符固定為2個(gè)字節(jié)

codePointAt():能正確處理4個(gè)節(jié)點(diǎn)的字符贷币,并返回一個(gè)字符的碼點(diǎn)

參數(shù):字符在字符串中的位置

String.fromCharCode():可以識(shí)別大于0xFFFF的字符

參數(shù):大于0xFFFF的字符

at():可以識(shí)別Unicode編號(hào)大于0xFFFF的字符,返回正確的字符

參數(shù):

normalize():將字符的不同表示方法表示為同樣的形式

參數(shù):可以接受一個(gè)參數(shù)來決定normalize的形式亏狰,有4個(gè)可選值

NFC(默認(rèn)參數(shù)):標(biāo)準(zhǔn)等價(jià)合成役纹,指視覺和語義上的等價(jià)

NFD:標(biāo)準(zhǔn)等價(jià)分解,在標(biāo)準(zhǔn)等價(jià)的前提下暇唾,返回合成字符分解出的多個(gè)簡(jiǎn)單字符

NFKC:兼容等價(jià)合成字管,返回合成字符。兼容等價(jià) 指語義上等價(jià)信不,直覺上不等價(jià)

NFKD:兼容等價(jià)分解:在兼容等價(jià)的前提下嘲叔,返回合成字符分解出的多個(gè)簡(jiǎn)單字符

(一)除indexOf()外來確定一個(gè)字符串中是否包含靈感字符串的3中方法

includes():返回布爾值,表是否找到了參數(shù)字符串

參數(shù):要查找的字符串

starsWith():返回布爾值抽活,表參數(shù)字符串是否在源字符串的頭部

參數(shù):要查找的字符串

endsWith():返回布爾值硫戈,表參數(shù)字符串是否在源字符串的尾部

參數(shù):要查找的字符串

其他一些方法

repeat():返回一個(gè)字符串,表示將原字符串重復(fù)n次

參數(shù):次數(shù)n

注:

參數(shù)是小數(shù)下硕,會(huì)被取整

參數(shù)是負(fù)數(shù)或者Infinity丁逝,會(huì)報(bào)錯(cuò)

參數(shù)在0-1之間汁胆,則等同于0

參數(shù)為NaN,則等同于0

padStar():頭部補(bǔ)全 而 padEnd():尾部補(bǔ)全

參數(shù)1:指定字符串的最小長(zhǎng)度

參數(shù)2:用于補(bǔ)全的字符串

注:

若原字符串的長(zhǎng)度等于或大于指定的最小長(zhǎng)度霜幼,返回原字符串

若用于補(bǔ)全的字符串與原字符串之和超出了指定的最小長(zhǎng)度嫩码,則會(huì)截去超出位數(shù)的補(bǔ)全字符串

如果省略了第二個(gè)參數(shù),會(huì)用空格補(bǔ)全

(二)模板字符串

``

可當(dāng)做普通字符串使用

可定義多行字符串

可嵌套變量(需將變量寫在${}中)

可調(diào)用函數(shù)

可嵌套模板字符串

String.raw():充當(dāng)模板字符串的處理函數(shù)罪既,返回一個(gè)反斜線都被轉(zhuǎn)義的字符串铸题,對(duì)應(yīng)于替換變量后的模板字符串

也可當(dāng)正常的函數(shù)使用,第一個(gè)從參數(shù)應(yīng)該是一個(gè)具有raw屬性的對(duì)象(應(yīng)該是一個(gè)數(shù)組)

四琢感、數(shù)值的擴(kuò)展

ES6 中八進(jìn)制要以前綴0o表示

(一)Number的擴(kuò)展

Number.isFinite():檢查一個(gè)數(shù)值是否為有限的

參數(shù):要檢查的數(shù)值

Number.isNaN():用于檢查一個(gè)數(shù)值是否為NaN

參數(shù):要檢查的數(shù)值

Number.isInteger():判斷一個(gè)數(shù)是否為整數(shù)

參數(shù):要檢查的數(shù)值

Number.isSafeInteger():判斷一個(gè)數(shù)是否摟在這個(gè)范圍之內(nèi)丢间,返回布爾值

參數(shù):要檢查的數(shù)值

(二)Math對(duì)象的擴(kuò)展

Math.trunc():用于除去一個(gè)數(shù)的小數(shù)部分,返回整數(shù)部分

對(duì)于非數(shù)值驹针,內(nèi)部將其先轉(zhuǎn)化為數(shù)值

對(duì)于空值和無法返回的值烘挫,返回NaN

參數(shù):要檢查的數(shù)值

Math.sign():判斷一個(gè)數(shù)到底是正數(shù),負(fù)數(shù)柬甥,還是0

參數(shù)有5中情況

參數(shù)為正數(shù)饮六,返回+1

參數(shù)為負(fù)數(shù),返回-1

參數(shù)為0苛蒲,返回0

參數(shù)為-0喜滨,返回-0

其他值,返回NaN

注:對(duì)于非數(shù)值撤防,會(huì)將其轉(zhuǎn)換為數(shù)值

Math.cbrt():用于計(jì)算一個(gè)數(shù)的立方根(對(duì)于非數(shù)值虽风,此案轉(zhuǎn)換為數(shù)值)

Math.clz32():返回一個(gè)數(shù)的32位無符號(hào)整數(shù)形式有多少個(gè)前導(dǎo)0

參數(shù):數(shù)值

對(duì)于小數(shù),只考慮整數(shù)部分

對(duì)于空值和其他類型的值寄月,先轉(zhuǎn)換成為數(shù)值辜膝,在計(jì)算

Math.imul():返回兩個(gè)數(shù)以32位帶符號(hào)正數(shù)形式相乘的結(jié)果,返回的也是一個(gè)32位的帶符號(hào)整數(shù)

Math.fround():返回一個(gè)數(shù)的單精度浮點(diǎn)數(shù)形式

Math.hypot():返回所有參數(shù)的平方和的平方根

若參數(shù)不是數(shù)值漾肮,會(huì)先轉(zhuǎn)換成數(shù)值厂抖,在計(jì)算、

只要有一個(gè)參數(shù)無法轉(zhuǎn)換為數(shù)值克懊,就返回NaN

(1)對(duì)數(shù)

Math.expm1(x):返回e的x次方-1

Math.log1p(x):返回ln(1+x)忱辅,如果x小于-1,返回NaN

Math.log10(x):返回以10 為底x的對(duì)數(shù)谭溉,如果小于0墙懂,返回NaN

Math.log2(x):返回以2 為底x的對(duì)數(shù),如果小于0扮念,返回NaN

(2)雙曲函數(shù)

Math.sinh(x):返回x的雙曲正弦

Math.cosh(x):返回x的雙曲余弦

Math.tanh(x):返回x的雙曲正切

Math.asinh(x):返回x的反雙曲正弦

Math.acosh(x):返回x的反雙曲余弦

Math.atanh(x):返回x的反雙曲正切

(3)Math.signbit()

判斷一個(gè)數(shù)的正負(fù)

參數(shù)是NaN损搬,返回false

參數(shù)是-0,返回true

參數(shù)是負(fù)值,返回true

其他情況巧勤,返回false

(三)integer數(shù)據(jù)類型

必須要以后綴n來表示

二進(jìn)制嵌灰、八進(jìn)制、十六進(jìn)制都要以后綴n來表示

注:

幾乎所有的Number運(yùn)算都能用在integer中颅悉,除>>>和求證運(yùn)算符+

Integer類型與Number類型不能混合運(yùn)算沽瞭,會(huì)報(bào)錯(cuò)

相等運(yùn)算符(==)會(huì)改變數(shù)據(jù)類型,不能混合使用

精確相等運(yùn)算符(===)不會(huì)改變數(shù)據(jù)類型剩瓶,可以混合使用

五驹溃、函數(shù)的擴(kuò)展

ES6允許為函數(shù)設(shè)置默認(rèn)值,即直接寫在參數(shù)定義的后面

使用參數(shù)默認(rèn)值時(shí)儒搭,不能有同名的參數(shù)

注:參數(shù)默認(rèn)值不是傳值的,而是每次都重新計(jì)算默認(rèn)值表達(dá)式的值(參數(shù)默認(rèn)值是惰性求值)

通常情況下芙贫,定義了參數(shù)默認(rèn)值的參數(shù)是函數(shù)的尾參數(shù)

有參數(shù)的默認(rèn)值都是尾參數(shù)搂鲫,除非顯示輸入undefined,如果傳入的是undefined磺平,將觸發(fā)默認(rèn)值魂仍,null不行

設(shè)置了默認(rèn)值之后,或者默認(rèn)值不是尾參數(shù)拣挪,函數(shù)的length不在計(jì)入后面的參數(shù)(length屬性失真)

一旦設(shè)置了參數(shù)的默認(rèn)值擦酌,函數(shù)在進(jìn)行初始化的時(shí)候,參數(shù)會(huì)形成一個(gè)單獨(dú)的作用域菠劝,等到初始化結(jié)束的時(shí)候赊舶,這個(gè)作用域消失(不設(shè)置參數(shù)默認(rèn)值的時(shí)候不會(huì)出現(xiàn))

利用參數(shù)默認(rèn)值可以指定某一個(gè)參數(shù)不得省略,若省略則報(bào)錯(cuò)

可以將參數(shù)默認(rèn)值設(shè)置為undefined赶诊,表示這個(gè)參可以省略

rest參數(shù)(形為“…變量名”)笼平,用于獲取函數(shù)多余的參數(shù)

函數(shù)的name屬性返回函數(shù)的函數(shù)名

箭頭函數(shù)

ES6簡(jiǎn)明筆記中有

注:

箭頭函數(shù)可以嵌套箭頭函數(shù)

六、數(shù)組的擴(kuò)展

擴(kuò)展運(yùn)算符 ( . . . )

主要用于函數(shù)調(diào)用

擴(kuò)展運(yùn)算符 后可以放表達(dá)式

如果擴(kuò)展運(yùn)算符后面是一個(gè)空數(shù)組舔痪,則不產(chǎn)生任何效果

可以合并數(shù)組

可以與結(jié)構(gòu)賦值結(jié)合起來生成數(shù)組

若擴(kuò)展運(yùn)算符用于數(shù)組寓调,只能放在參數(shù)的最后一位,否則報(bào)錯(cuò)

可以將字符串轉(zhuǎn)為真正的數(shù)組

Array.from():將偽數(shù)組(兩類對(duì)象:類似于數(shù)組的對(duì)象)轉(zhuǎn)換為真正的數(shù)組

Array.of(一組值):將一組數(shù)轉(zhuǎn)換為數(shù)組锄码,若沒有參數(shù)夺英,則返回空數(shù)組

copyWithin():在當(dāng)前數(shù)組內(nèi)部將指定位置的成員復(fù)制到其他地方,然后返回?cái)?shù)組(會(huì)修改數(shù)組)

接受3個(gè)參數(shù)

target(必選):從該位置開始替換數(shù)據(jù)

start(可選):從該位置開始讀取數(shù)據(jù)滋捶,默認(rèn)值為0痛悯,如果為負(fù)數(shù),表示倒數(shù)

end(可選):到該位置停止讀取數(shù)據(jù)重窟,默認(rèn)等于數(shù)組長(zhǎng)度灸蟆,若為負(fù),表示倒數(shù)

fill():用于填充數(shù)組

參數(shù)1(必填):用于填充的給定值

參數(shù)2(可選):填充的起始位置

參數(shù)3(可選):填充的結(jié)束位置

entries()、keys()炒考、value()用于遍歷數(shù)組

entries():對(duì)鍵值對(duì)的遍歷

keys():對(duì)鍵名的遍歷

values():對(duì)鍵值的遍歷

includes():表示某個(gè)數(shù)組是否包含給定的值可缚,返回一個(gè)布爾值

參數(shù)1:給定值

參數(shù)2:搜索的起始位置,默認(rèn)為0斋枢,若為負(fù)數(shù)帘靡,則表示倒數(shù)的位置,如果這時(shí)大于數(shù)組長(zhǎng)度,則會(huì)重置為從0開始

數(shù)組的空位

數(shù)組的空位值數(shù)組的某一個(gè)位置沒有任何值(空值不是undefined)

Array.from()會(huì)將數(shù)組的空位轉(zhuǎn)換成為undefined

擴(kuò)展運(yùn)算符也會(huì)將空位轉(zhuǎn)為undefined

copyWithin()會(huì)將空位一起復(fù)制

fill() 會(huì)將空位視為數(shù)組正常的位置

七砚偶、對(duì)象的擴(kuò)展

ES6允許直接寫入變量和函數(shù)作為對(duì)象的屬性和方法

在對(duì)象中可只寫屬性名栅屏,不寫屬性值

可直接用標(biāo)識(shí)符作為屬性名,也可將表達(dá)式放在方括號(hào)內(nèi)作為屬性名(字面量定義)

Object.is():比較兩個(gè)值是否嚴(yán)格相等轩勘,與嚴(yán)格相等運(yùn)算符(===)的行為基本一致(注:有兩個(gè)不同之處1:+0不等于 -0、2:NaN等于自身)

Object.assign():將源對(duì)象的所有可枚舉屬性復(fù)制到目標(biāo)對(duì)象

第一個(gè)參數(shù)是目標(biāo)對(duì)象怯邪,后面的參數(shù)是源對(duì)象

注:

只有一個(gè)參數(shù)绊寻,會(huì)返回改參數(shù)

若改參數(shù)不是對(duì)象,會(huì)先轉(zhuǎn)換為對(duì)象悬秉,然后返回

由于undefined和null無法轉(zhuǎn)換為對(duì)象澄步,所以人工將它們作為參數(shù)就會(huì)報(bào)錯(cuò)

其他類似的值(數(shù)值、布爾)不在首參也不會(huì)報(bào)錯(cuò)和泌,但是除了字符串會(huì)議數(shù)組的形式復(fù)制到目標(biāo)對(duì)象村缸,其他值都不會(huì)產(chǎn)生效果

Object.assign()是淺復(fù)制(即源對(duì)象的某個(gè)屬性的值是對(duì)象,name目標(biāo)對(duì)象復(fù)制得到的是這個(gè)對(duì)象的引用)

(一)對(duì)象的可枚舉性

for…in循環(huán):只遍歷對(duì)象自身和繼承的可枚舉屬性

Object.keys():返回對(duì)象自身的所有可枚舉屬性的鍵名

JSON.Stringify():只串化對(duì)象自身的可枚舉屬性

Object.assign():將源對(duì)象的所有可枚舉屬性復(fù)制到目標(biāo)對(duì)象

注:所有class的原型的方法時(shí)不可枚舉的

(二)屬性的遍歷

for…in:循環(huán)遍歷對(duì)象自身和繼承的可枚舉屬性(不包含Symbol屬性)

Object.keys(obj):返回一個(gè)數(shù)組武氓,包含對(duì)象自身的(不含繼承的)所有可枚舉屬性(不包含symbol屬性)

Object.getOwnPropertyNames(obj):返回一個(gè)數(shù)組梯皿,包含對(duì)象自身的所有屬性(不含Symbol,但是含有不可枚舉屬性)

Object.getOwnPropertySymbols(obj):返回一個(gè)數(shù)組县恕,包含對(duì)象自身的所有Symbol屬性

Reflect.ownKeys(obj):返回一個(gè)數(shù)組索烹,包含對(duì)象自身的所有屬性,不管屬性名是Symbol還是字符串弱睦,也不管是否可枚舉

以上5中均遵循屬性遍歷次序規(guī)則

首先遍歷所有屬性名為數(shù)值的屬性百姓,按照數(shù)字排序

其次遍歷所有屬性名為字符串的屬性,按照生成時(shí)間排序

最后遍歷所有屬性名為Symbol的屬性况木,按照生成時(shí)間排序

(三)_ _ proto _ _屬性

用于讀取或者設(shè)置當(dāng)前對(duì)象的prototype屬性

缺點(diǎn):兼容性和語義都不是很好

ES6使以下三種替換它

Object.setPrototypeOf(obj):用來設(shè)置一個(gè)對(duì)象的prototype屬性垒拢,返回參數(shù)對(duì)象本身

參數(shù):第一個(gè)參數(shù)若不是對(duì)象,則會(huì)自動(dòng)轉(zhuǎn)化為對(duì)象(undefined和null時(shí)會(huì)報(bào)錯(cuò))

Object.getPrototypeOf():用于讀取一個(gè)對(duì)象的prototype屬性

參數(shù):參數(shù)若不是對(duì)象火惊,則會(huì)自動(dòng)轉(zhuǎn)化為對(duì)象(undefined和null時(shí)會(huì)報(bào)錯(cuò))

Object.reate():生成對(duì)象

(四)對(duì)象的解構(gòu)賦值和擴(kuò)展運(yùn)算符混用

對(duì)象的解構(gòu)賦值會(huì)將所有的鍵值對(duì)都復(fù)制到新的對(duì)象上面

解構(gòu)賦值必須是最后一個(gè)參數(shù)求类,否則會(huì)報(bào)錯(cuò)

解構(gòu)賦值不會(huì)復(fù)制繼承自原型對(duì)象的屬性

擴(kuò)展運(yùn)算符可用于合并兩個(gè)對(duì)象

若自定義的屬性放在擴(kuò)展運(yùn)算符后面,則擴(kuò)展運(yùn)算符內(nèi)部有同名屬性會(huì)被覆蓋

若把自定義屬性放在擴(kuò)展運(yùn)算符前面屹耐,則變成了設(shè)置新對(duì)象的默認(rèn)屬性

若擴(kuò)展運(yùn)算符的參數(shù)是undefined或者null尸疆,則這兩個(gè)值會(huì)被忽略,不會(huì)報(bào)錯(cuò)

若擴(kuò)展運(yùn)算符的參數(shù)對(duì)象之中有取值函數(shù)get,則這個(gè)函數(shù)會(huì)被執(zhí)行

(四)Object.getOwnPropertyDescriptors(obj)

Object.getOwnPropertyDescriptor(obj):用于返回某個(gè)對(duì)象屬性的描述對(duì)象

Object.getOwnPropertyDescriptors(obj):返回指定對(duì)象所有自身屬性(非繼承屬性)的描述對(duì)象

主要是為了解決Object.assign()無法正確復(fù)制get屬性和set屬性

(五)Null傳導(dǎo)運(yùn)算符

四中用法

obj?.prop :讀取對(duì)象屬性

obj?.[expr]:讀取對(duì)象屬性

func.{…args}:函數(shù)或?qū)ο蠓椒ǖ恼{(diào)用

new C ?.{…args}:構(gòu)造函數(shù)的調(diào)用

八寿弱、Symbol

新的數(shù)據(jù)類型犯眠,表示獨(dú)一無二的值

通過symbol函數(shù)生成

let s=Symbol();


對(duì)象屬性名的兩種表示方法:1、原有字符串表示症革。2筐咧、Symbol表示

Symbol可接受一個(gè)字符串作為參數(shù),表示對(duì)Symbol實(shí)例的描述噪矛,主要是為了在控制臺(tái)輸出量蕊,或者是轉(zhuǎn)為字符串時(shí)比較容易區(qū)分

如果Symbol的參數(shù)是一個(gè)對(duì)象,則會(huì)調(diào)用toString方法將其轉(zhuǎn)換成為字符串艇挨,然后生成一個(gè)Symbol值

Symbol值不能與其他類型的值進(jìn)行運(yùn)算残炮,否則會(huì)報(bào)錯(cuò)

Symbol值可以顯式的轉(zhuǎn)為字符串

let sym=Symbol('My Symbol');

String(sym); //'Symbol(My Symbol)'

sym.toString(); //'Symbol(My Symbol)'


Symbol值也可以轉(zhuǎn)換成為布爾值,但是不能轉(zhuǎn)換為數(shù)值

let sym=Symbol();

Boolean(sym); //true

!sym; //false

Number(sym); //TypeError


Symbol值作為對(duì)象的屬性名時(shí)不能使用點(diǎn)運(yùn)算符缩滨,只能用方括號(hào)

在對(duì)象內(nèi)部使用Symbol值定義屬性時(shí)势就,也只能用方括號(hào)

let sym=Symbol();

let a={};

a.sym='Hello';

a[sym]; //undefined

s['sym']; //'Hello'


Symbol類型的值還可以定義一組常量,保證這些常量都是不相等的

(一)屬性名遍歷

Object.getOwnPropertySymbols():返回一個(gè)數(shù)組楷怒,成員是當(dāng)前對(duì)象的所有作用屬性名的Symbol值

Reflect.ownKeys():以數(shù)組的形式返回所有鍵名蛋勺,包括常規(guī)鍵名和S也Symbol鍵名

以Symbol值作為屬性名的屬性不會(huì)被常規(guī)方法遍歷得到(可為對(duì)象定義一些非私有但又希望只用于內(nèi)部的方法)

Symbol.for():可重新使用同一個(gè)Symbol值

參數(shù):一個(gè)字符串

作用:搜索有沒有以該參數(shù)作為名稱的Symbol值瓦灶,若有則返回這個(gè)Symbol值鸠删,否則就新建并返回一個(gè)以該字符串為名稱的Symbol值

Symbol.for()與Symbol都可以生成新的Symbol

區(qū)別:前者會(huì)被登記在全局環(huán)境中供搜索,后者不會(huì)

Singleton模式:調(diào)用一個(gè)類贼陶,并且在任何時(shí)候都返回同一個(gè)實(shí)例

(二)內(nèi)置的Symbol值

對(duì)象的Symbol.hasInstance屬性指向一個(gè)內(nèi)部方法刃泡,對(duì)象使用instanceof運(yùn)算符是會(huì)調(diào)用這個(gè)方法,判斷該對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例

class Myclass{

? ? [Symbol.hanInstance](foo){

? ? ? ? return foo instanceof Array;

? ? }

}

[1,2,3] instanceof new Myclass; //true


對(duì)象的Symbo.isConcatSpreadable屬性等于一個(gè)布爾值碉怔,表示該對(duì)象在使用Array.prototype.concat()時(shí)是否可以展開

let arr1=['c','d'];

['a','b'].concat(arr1,'e'); //['a','b','c','d','e']

arr1[Symvol.isConcatSpreadable] //undefined

let arr2=['c','d'];

arr2[Symbol.isConcatSpreadable]=false;

['a','b'].concat(arr2,'e'); //['a','b',['c','d'],'e']


數(shù)組的默認(rèn)行為是可以展開的烘贴,Symbol.isConcatSpreadable屬性等于undefined或者true,都可以

類似于數(shù)組的對(duì)象也可以展開撮胧,但它的Symbol.isConcatSpreadable屬性默認(rèn)為false桨踪,必須手動(dòng)打開、

let obj={length:2,0:'c',1:'d'};

['a','b'].concat(obj,'e'); //['a','b',obj,'e']

obj[Symbol,isConcatSpreadable]=true;

['a','b'].concat(obj,'e'); //['a','b','c','d','e']


對(duì)于一個(gè)類而言芹啥,Symbol.isConcatSpreadable屬性必須寫成實(shí)例的屬性

(1)Symbol.species

對(duì)象的Symbol.species屬性指向當(dāng)前對(duì)象的構(gòu)造函數(shù)锻离,使用這個(gè)函數(shù)返回的函數(shù)來創(chuàng)造新的實(shí)例對(duì)象

定義Symbol.species屬性要用get讀取數(shù)據(jù)

class Array extends Array{

? ? //覆蓋父類Array的構(gòu)造函數(shù)

? ? static get [Symbol.species](){return Array;}


(2)Symbol.match

對(duì)象的Symbol.match屬性指向一個(gè)函數(shù),當(dāng)執(zhí)行str.match(obj)時(shí)墓怀,如果該屬性存在汽纠,則會(huì)調(diào)用它的返回值

(3)Symbol.replace

對(duì)象的Symbol.replace屬性指向一個(gè)方法,當(dāng)對(duì)象被String.prototype.replace方法調(diào)用時(shí)會(huì)返回改方法的返回值

(4)Symbol.split

對(duì)象的Symbol.split屬性指向一個(gè)方法傀履,當(dāng)對(duì)象被String.prototype.split方法調(diào)用時(shí)會(huì)返回改方法的返回值

(5)Symbol.iterator

對(duì)象的Symbol.iterator屬性指向該對(duì)象默認(rèn)的遍歷方法

(6)Symbol.toPrimitive

對(duì)象的Symbol.toPrimitive屬性指向一個(gè)方法虱朵,對(duì)象在轉(zhuǎn)化為原始數(shù)據(jù)類型時(shí)會(huì)調(diào)用這個(gè)方法,返回該對(duì)象的原始數(shù)據(jù)類型

參數(shù):字符串,表示當(dāng)前運(yùn)算模式

Number:需要轉(zhuǎn)化為數(shù)值

String:需要轉(zhuǎn)化為字符串

Default:可轉(zhuǎn)化為數(shù)組碴犬,也可轉(zhuǎn)化為字符串

(7)Symbol.toStringTag

對(duì)象的Symbol.toStringTag屬性指向一個(gè)方法絮宁,在對(duì)象上調(diào)用Object.prototype.toString()時(shí),如果這個(gè)屬性存在翅敌,其返回值會(huì)出現(xiàn)在toString方法返回值的字符串中羞福,表示對(duì)象的類型

(8)Symbol.unscopables

對(duì)象的Symbol.unscopables屬性指向一個(gè)對(duì)象,指定了使用with關(guān)鍵字時(shí)蚯涮,那些屬性會(huì)被with環(huán)境排除

九治专、Set和Map

(一)Set

類似于數(shù)組,其成員唯一遭顶,不重復(fù)

Set本身是一個(gè)構(gòu)造函數(shù)张峰,用于生產(chǎn)Set數(shù)據(jù)結(jié)構(gòu)

let s=new Set();


Set函數(shù)可以接受一個(gè)數(shù)組,作為參數(shù)棒旗,用于初始化

向Set加入值時(shí)不會(huì)發(fā)生數(shù)據(jù)轉(zhuǎn)換喘批,即1和’1’為不同的值

在Set內(nèi)部,兩個(gè)NaN相等

(1)Set實(shí)例的屬性

Set.prototype.Constructor():構(gòu)造函數(shù)铣揉,就是Set()

Set.prototype.size():返回Set實(shí)例成員總數(shù)

add(value):添加值饶深,返回Set本身

delete(value):刪除值,返回一個(gè)布爾值逛拱,表刪除是否成功

has(value):返回布爾值敌厘,表參數(shù)是否為Set成員

clear():清除所有成員,無返回值

(2)遍歷

keys():返回鍵名的遍歷器

values():返回鍵值的遍歷器

entries():返回鍵值對(duì)的遍歷器

forEach(function(){}):使用回調(diào)函數(shù)遍歷每個(gè)成員朽合,無返回值(可加參2俱两,表示綁定的this對(duì)象)

Set的遍歷順序就是插入順序

若想同步的改變?cè)瓉淼腟et結(jié)構(gòu),可利用原Set映射出一個(gè)新的結(jié)構(gòu)再復(fù)制給原Set結(jié)構(gòu)曹步,或者使用Array.from()

(二)WeaKSet

與Set類似宪彩,表不重復(fù)的集合

與Set的區(qū)別

WeakSet的成員只能是對(duì)象,不能是其他值

WeakSet中的對(duì)象都是弱引用讲婚,即垃圾回收機(jī)制不考慮WeakSet對(duì)該對(duì)象的引用

WeakSet的成員不能引用尿孔,因?yàn)槠潆S時(shí)可能消失

WeakSet本生是一個(gè)構(gòu)造函數(shù),使用生成WeakSet數(shù)據(jù)結(jié)構(gòu)

let w = new WeakSet();


可接受一個(gè)數(shù)組或者類似于數(shù)組的對(duì)象作為參數(shù)來初始化

WeakSet的方法

WeakSet.prototype.add(value ):添加新成員

WeakSet.prototype.delete(value):刪除指定成員

WeakSet.prototype.has(value):返回布爾值筹麸,表指定值是否在WeakSet實(shí)例中

WeakSet無size屬性活合,無法遍歷其成員

(三)Map

類似于對(duì)象,也是鍵值組合

其鍵的范圍不限于字符串竹捉,可為各種數(shù)據(jù)類型的值(包括對(duì)象)均可當(dāng)做鍵

使用Map()構(gòu)造函數(shù)生成

let m = new Map();


Map可接受一個(gè)數(shù)組作為參數(shù)芜辕,其數(shù)組成員為一個(gè)個(gè)表示鍵值對(duì)的數(shù)組

若一個(gè)鍵多次賦值,則后面的覆蓋前面的值

若讀取一個(gè)未知的鍵块差,則返回undefined

Map的鍵實(shí)際上綁定的是地址值侵续,只要地址不同倔丈,即視為兩個(gè)鍵(解決了同名屬性碰撞的問題)

(1)Map實(shí)例的屬性方法

1、size()

返回Map結(jié)構(gòu)的成員總數(shù)

2状蜗、set(key需五,value)

設(shè)置key值所對(duì)應(yīng)的鍵,然后返回Map結(jié)構(gòu)

若key已經(jīng)有值轧坎,則賦值更新宏邮,否則新生成該鍵值

3、get(key)

獲取key對(duì)應(yīng)的值缸血,若找不到key則返回undefined

4蜜氨、has(key)

返回一個(gè)布爾值,表示ley是否在Map結(jié)構(gòu)中

5捎泻、delete(key)

刪除某個(gè)鍵飒炎,刪除成功則返回true,反之返回false

6笆豁、clear()

清除所有成員郎汪,無返回值

(2)遍歷

keys():返回鍵名的遍歷器

values():返回鍵值的遍歷器

entries():返回鍵值對(duì)的遍歷器

forEach(function(){}):遍歷Map所有成員

Map的遍歷順序就是插入順序

(四)Map與其他數(shù)據(jù)類型的轉(zhuǎn)化

(1)Map轉(zhuǎn)數(shù)組

Map轉(zhuǎn)化為數(shù)組最快的方法時(shí)結(jié)合使用擴(kuò)展運(yùn)算符( . . . )

(2)數(shù)組轉(zhuǎn)Map

將數(shù)組傳入構(gòu)造函數(shù)即可

(3)Map轉(zhuǎn)對(duì)象

若Map所有鍵都是字符串,則可以轉(zhuǎn)為對(duì)象

function strMapToObj(strMap){

? ? let obj = Object.create(null);

? ? for (let [k,v] of strMap){

? ? ? ? obj[k]=v;

? ? }

? ? return obj;

}


(4)對(duì)象轉(zhuǎn)Map

function objToStrMap(obj){

? ? let strMap=new Map();

? ? for(let k of Object.keys(obj)){

? ? ? ? strMap.set(k.obj[k]);

? ? }

? ? return strMap;

}


(5)Map轉(zhuǎn)JSON

情況一:Map鍵名都是字符串闯狱,可以轉(zhuǎn)為對(duì)象JSON

function StrMapToJson(StrMap){

? ? reutrn JSON.stringify(strMapToObj(strMap));

}


情況二:Map鍵名中含有非字符串煞赢,轉(zhuǎn)為數(shù)組JSON

function mapToArrayJson(map){

? ? return JSON.stringify(...map);

}


(6)JSON轉(zhuǎn)Map

正常情況所有鍵名都是字符串

function jsonToStrMap(jsonStr){

? ? return objToStrMap(JSON.parse(jsonStr));

}


特殊情況:在整個(gè)JSON就是一個(gè)數(shù)組,且數(shù)組成員本身又是由一兩個(gè)成員的數(shù)組哄孤,此時(shí)應(yīng)該一一對(duì)應(yīng)的轉(zhuǎn)為Map(數(shù)組轉(zhuǎn)為JSON的逆操作)

function jsonToMap(jsonStr){

? ? return new Map(JSON.parse(jsonStr));

}


(五)WeakMap

與Map結(jié)構(gòu)類似照筑,也用于生成鍵值對(duì)的集合

通過WeakMap函數(shù)生成

let wMap = new weakMap();


可使用set方法添加成員

可接受一個(gè)數(shù)組,作為構(gòu)造函數(shù)的參數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末录豺,一起剝皮案震驚了整個(gè)濱河市朦肘,隨后出現(xiàn)的幾起案子饭弓,更是在濱河造成了極大的恐慌双饥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟断,死亡現(xiàn)場(chǎng)離奇詭異咏花,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阀趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門昏翰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刘急,你說我怎么就攤上這事棚菊。” “怎么了叔汁?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵统求,是天一觀的道長(zhǎng)检碗。 經(jīng)常有香客問我,道長(zhǎng)码邻,這世上最難降的妖魔是什么折剃? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮像屋,結(jié)果婚禮上怕犁,老公的妹妹穿的比我還像新娘。我一直安慰自己己莺,他們只是感情好奏甫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凌受,像睡著了一般扶檐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胁艰,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天款筑,我揣著相機(jī)與錄音,去河邊找鬼腾么。 笑死奈梳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的解虱。 我是一名探鬼主播攘须,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼殴泰!你這毒婦竟也來了于宙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤悍汛,失蹤者是張志新(化名)和其女友劉穎捞魁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體离咐,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谱俭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宵蛀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆著。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖术陶,靈堂內(nèi)的尸體忽然破棺而出凑懂,到底是詐尸還是另有隱情,我是刑警寧澤梧宫,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布接谨,位于F島的核電站杭攻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疤坝。R本人自食惡果不足惜兆解,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跑揉。 院中可真熱鬧锅睛,春花似錦、人聲如沸历谍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽望侈。三九已至印蔬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脱衙,已是汗流浹背侥猬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捐韩,地道東北人退唠。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像荤胁,于是被迫代替她去往敵國(guó)和親瞧预。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容