官术网_书友最值得收藏!

第5章 原生對(duì)象

本章主要內(nèi)容

● Object對(duì)象

● Math對(duì)象

● 字符串對(duì)象

● 數(shù)組對(duì)象

● 日期對(duì)象

● 正則

● Set數(shù)據(jù)結(jié)構(gòu)

● Map數(shù)據(jù)結(jié)構(gòu)

對(duì)象分為內(nèi)置對(duì)象(如Math)、本地對(duì)象(如String、Array)和宿主對(duì)象(BOM和DOM),本章將對(duì)這些內(nèi)容進(jìn)行詳細(xì)介紹。

5.1 Object對(duì)象

Object是JavaScript 中常用的一個(gè)數(shù)據(jù)類型,并且在JavaScript 中所有的對(duì)象都是繼承自 Object 對(duì)象。在對(duì)象一章中只是簡(jiǎn)單地用Object 結(jié)合new 構(gòu)造函數(shù)來(lái)創(chuàng)建一個(gè)對(duì)象,并沒(méi)有過(guò)多地使用。但是Object對(duì)象其實(shí)包含了很多有用的屬性和方法。因此,本節(jié)將從最基本的開(kāi)始詳細(xì)介紹Object對(duì)象常用的方法以及應(yīng)用。

5.1.1 Object的常用方法

1.Object.create()

在ECMAScript 5 中定義了名為Object.creat()的方法,該方法可以創(chuàng)建一個(gè)擁有指定原型和若干個(gè)指定屬性的對(duì)象。其中第一個(gè)參數(shù)是要繼承的原型,如果不是一個(gè)子函數(shù),則可以傳入一個(gè)null,第二個(gè)參數(shù)是對(duì)象的屬性描述符,這個(gè)參數(shù)是可選的。

Object.create()是一個(gè)靜態(tài)函數(shù),而不是提供給某個(gè)對(duì)象調(diào)用的方法,只需傳入所需的原型對(duì)象和屬性描述即可。

在JavaScript中,屬性有兩種類型,分別是數(shù)據(jù)屬性和訪問(wèn)器屬性。

(1)數(shù)據(jù)屬性

數(shù)據(jù)屬性可以理解為平時(shí)定義對(duì)象時(shí)賦予的屬性,它可以進(jìn)行讀和寫。但是,ES5中定義了一些特性,這些特性用來(lái)描述屬性的各種特征,特性是內(nèi)部值,不能直接訪問(wèn)到。屬性的特性會(huì)有一些默認(rèn)值,要修改特性的默認(rèn)值,必須使用ES5定義的新方法(Object.defineProperty方法)來(lái)修改。下面具體介紹每個(gè)特性。

1)writable:表示屬性值是否可修改,默認(rèn)為true。

2)value:表示屬性的值,默認(rèn)為undefined。

示例:

說(shuō)明:上述示例中,通過(guò)value 這個(gè)特性,可以設(shè)定對(duì)象的默認(rèn)值,且當(dāng)writable 屬性設(shè)置為false時(shí),對(duì)象的屬性值是不可以修改的。

3)configurable:該特性表示是否能夠通過(guò)delete操作符刪除屬性,默認(rèn)值為true。

示例:

說(shuō)明:在上述示例中,創(chuàng)建一個(gè)對(duì)象obj,并且給它添加屬性name,通過(guò)delete操作符刪除name屬性后,就訪問(wèn)不到name屬性了。

示例:

說(shuō)明:在上述示例中,創(chuàng)建了一個(gè)擁有指定原型 obj 的newObj 對(duì)象,并且設(shè)置configurable特性為false,最后發(fā)現(xiàn)依然能訪問(wèn)到name屬性。

4)enumerable:表示是否能用for in 枚舉出屬性,默認(rèn)值為true。

示例:

說(shuō)明:在上述示例中,可以通過(guò)for in 語(yǔ)句枚舉obj對(duì)象的屬性。

示例:

說(shuō)明:在上述示例中創(chuàng)建了一個(gè)擁有指定原型obj的newObj對(duì)象,并且設(shè)置enumerable特性為false,發(fā)現(xiàn)通過(guò)for in 語(yǔ)句不能枚舉newObj對(duì)象的屬性,但當(dāng)設(shè)置為true時(shí)則可以。

(2)訪問(wèn)屬性

1)get():表示訪問(wèn)。

2)set():表示設(shè)置。

示例:

說(shuō)明:在上述示例中通過(guò)方法Object.creat()創(chuàng)建了一個(gè)擁有指定原型 obj 的對(duì)象newObj,通過(guò)設(shè)置不同的屬性描述符,可以實(shí)現(xiàn)不同的操作,得到不同的結(jié)果。

2.Object.is()

它用來(lái)比較兩個(gè)值是否嚴(yán)格相等,與嚴(yán)格比較運(yùn)算符(===)的行為基本一致,不同之處只有兩個(gè):一是+0不等于-0,二是NaN等于自身。

示例:

3.Object.assign()

Object.assign 方法用于對(duì)象的合并,將原、源對(duì)象(source)的所有可枚舉屬性復(fù)制到目標(biāo)對(duì)象(target)上。

Object.assign方法的第一個(gè)參數(shù)是目標(biāo)對(duì)象,后面的參數(shù)都是源對(duì)象。

示例:

如果目標(biāo)對(duì)象與源對(duì)象具有同名屬性,或多個(gè)源對(duì)象具有同名屬性,則后面的屬性會(huì)覆蓋前面的屬性。

示例:

如果只有一個(gè)參數(shù),Object.assign方法會(huì)直接返回該參數(shù)。

示例:

如果該參數(shù)不是對(duì)象,則會(huì)先轉(zhuǎn)成對(duì)象,然后返回。

示例:

由于undefined和null無(wú)法轉(zhuǎn)成對(duì)象,因此如果它們作為參數(shù),就會(huì)報(bào)錯(cuò)。

示例:

Object.assign方法執(zhí)行的是淺復(fù)制,而不是深復(fù)制。

示例:

4.Object.getOwnPropertyDescriptors()

此方法用于返回某個(gè)對(duì)象屬性的描述對(duì)象。

示例:

5.1.2 屬性的遍歷(Object對(duì)象方法的使用)

1. 屬性的可枚舉性

對(duì)象的每個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor)用來(lái)控制該屬性的行為。Object.getOwnPropertyDescriptor方法可以獲取該屬性的描述對(duì)象。

描述對(duì)象的enumerable 屬性,稱為“可枚舉性”,如果該屬性為false,則表示某些操作會(huì)忽略當(dāng)前屬性。

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

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

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

4)Object.assign():只復(fù)制對(duì)象自身的可枚舉的屬性。

2. 遍歷的方式

ES6中一共有5種方法可以遍歷對(duì)象的屬性。

(1)for...in

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

(2)Object.keys(obj)

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

(3)Object.getOwnPropertyNames(obj)

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

(4)Object.getOwnPropertySymbols(obj)

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

(5)Reflect.ownKeys(obj)

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

通過(guò)以上5種方法遍歷對(duì)象的屬性,都遵守同樣的屬性遍歷的次序規(guī)則,具體如下:

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

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

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

5.2 Math對(duì)象

JavaScript 自身有很多內(nèi)置的對(duì)象,Math 就是其中之一,但是相比較其他的內(nèi)置對(duì)象,Math對(duì)象可以用于執(zhí)行數(shù)學(xué)任務(wù),如獲取一個(gè)隨機(jī)數(shù)、畫一個(gè)圓等。

Math是JavaScript本來(lái)就存在的對(duì)象,即內(nèi)置對(duì)象,它具有數(shù)學(xué)常數(shù)和函數(shù)的屬性與方法。Math 對(duì)象不像Date 和String 是對(duì)象的類,因此沒(méi)有構(gòu)造函數(shù),也不需要實(shí)例化,它所有的屬性和方法都是靜態(tài)的,只需把Math作為對(duì)象使用即可。

5.2.1 Math對(duì)象的屬性

1)Math.PI:圓周率。

2)Math.E:返回歐拉常數(shù)e的值。

3)Math.LN2:返回2的自然數(shù)對(duì)數(shù)。

5.2.2 Math對(duì)象的方法

Math對(duì)象的方法具體見(jiàn)表5-1。

表5-1

(1)abs()

abs()用于返回一個(gè)數(shù)的絕對(duì)值。

示例:

(2)round()、floor()、ceil()和trunc()

1)round()用于對(duì)一個(gè)數(shù)進(jìn)行四舍五入。

2)floor()用于對(duì)一個(gè)數(shù)進(jìn)行向下取整。

3)ceil()用于對(duì)一個(gè)數(shù)進(jìn)行向上取整。

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

示例:

如果參數(shù)是一個(gè)正數(shù),則trunc()相當(dāng)于floor();否則trunc() 相當(dāng)于ceil()。

(3)max()和min()

max()和min()用于取一組數(shù)中的最大值和最小值。

示例:

(4)random()

random()用于取一個(gè)隨機(jī)數(shù)。

示例:

(5)pow(x,y)和sqrt()

pow(x,y)用于取x的y次冪,sqrt()用于獲取一個(gè)數(shù)的平方根。

示例:

(6)sin()、cos()、tan()、asin()、acos()和atan()

使用時(shí),需要將角度轉(zhuǎn)化為弧度才能進(jìn)行計(jì)算,在JavaScript中,用Math.PI表示π,轉(zhuǎn)換公式為1deg=Math.PI/180。

示例:

5.3 字符串對(duì)象

String 對(duì)象也是JavaScript 內(nèi)置對(duì)象之一。當(dāng)操作的數(shù)據(jù)是文本形式的數(shù)據(jù)時(shí),用字符串對(duì)象處理再合適不過(guò)了。下面介紹有關(guān)字符串對(duì)象的創(chuàng)建,以及其具有的屬性和方法。

5.3.1 創(chuàng)建String對(duì)象

創(chuàng)建String對(duì)象的語(yǔ)法格式如下:

通過(guò)構(gòu)造函數(shù)會(huì)返回一個(gè)新創(chuàng)建的String對(duì)象,用來(lái)存放字符串s:

不通過(guò)構(gòu)造函數(shù)調(diào)用String()時(shí),它只把s轉(zhuǎn)換成原始的字符串,并返回轉(zhuǎn)換后的值。

5.3.2 字符串對(duì)象的屬性

1)constructor:用于返回構(gòu)造函數(shù)的引用。

2)length:用于計(jì)算字符串的長(zhǎng)度。

示例:

說(shuō)明:在上述示例中,通過(guò)調(diào)用String對(duì)象的length屬性,可以很方便地獲得該字符串的長(zhǎng)度。

5.3.3 字符串對(duì)象的方法

字符串對(duì)象的方法可以大致分為獲取、查找、截取、轉(zhuǎn)換4種類型。接下來(lái)將一一進(jìn)行介紹。

獲取類型有以下3種:

(1)mystr.charAt(index);

charAt方法用來(lái)返回指定索引位置(index)的字符串,若是超出有效范圍的索引值,將返回空字符串。

示例:

說(shuō)明:需要注意index下標(biāo)的有效范圍是從0開(kāi)始到str.length-1。

(2)mystr.charCodeAt(index);

charCodeAt方法返回指定位置字符的Unicode編碼。

示例:

(3)String.fromCharCode(code1 [,code2...]);

fromCharCode是一個(gè)靜態(tài)方法,它存儲(chǔ)在內(nèi)存的靜態(tài)區(qū)中,一直存在,直接使用即可。

fromCharCode方法接收一個(gè)(或多個(gè))指定的Unicode 值,然后返回一個(gè)(或多個(gè))對(duì)應(yīng)的字符串。

示例:

查找類型有以下5種:

(1)mystr.indexOf(str [,startIndex]);

indexOf方法返回指定字符在字符串中第一次出現(xiàn)的位置。如果字符不存在,則返回-1。

示例:

說(shuō)明:當(dāng)指定startIndex 的值時(shí),會(huì)從指定位置開(kāi)始起查找指定的字符串,否則從字符串的開(kāi)始位置查找。

(2)mystr.lastIndexOf(str [,startIndex]);

lastIndexOf 方法返回指定字符在字符串中最后一次出現(xiàn)的位置。如果字符串不存在,則返回-1。

示例:

說(shuō)明:若指定了startIndex的值,則作用與indexOf方法一樣。

(3)mystr.match(str);

match 方法用于在字符串內(nèi)檢測(cè)指定的值,或查找一個(gè)或多個(gè)正則表達(dá)式的匹配,該方法類似于indexOf和lastIndexOf方法,但是返回指定的值,沒(méi)有則返回null,而不是返回字符串的位置。

示例:

(4)mystr.search(reExp);

search方法返回與正則表達(dá)式查找內(nèi)容相匹配的第一個(gè)字符串的位置,只能用于正則。

示例:

說(shuō)明:reExp包含正則表達(dá)式模式和可用標(biāo)志的正則表達(dá)式對(duì)象。

(5)mystr.replace(str/regExp,replacement);

replace方法用于將字符串中的一些字符替換成另外的字符,或替換一個(gè)與正則表達(dá)式匹配的字符串。返回結(jié)果為新字符串,不影響原字符串。

示例:

截取類型有以下3種:

(1)mystr.slice(start [,end]);

slice方法返回從指定位置開(kāi)始截取,到指定位置結(jié)束(不包括)的字符串;start下標(biāo)從0開(kāi)始;如果沒(méi)有指定結(jié)束位置,則從指定位置開(kāi)始截取,到末尾結(jié)束;它可以接收負(fù)值,-1表示字符串的結(jié)尾。

示例:

(2)mystr.substring(start,end);

substring 方法返回從指定位置開(kāi)始截取,到指定位置結(jié)束的字符串(不包括);如果沒(méi)有指定結(jié)束位置,則從指定位置開(kāi)始截取,到末尾結(jié)束;它接收到的負(fù)值會(huì)自動(dòng)轉(zhuǎn)換為0。

示例:

(3)mystr.substr(start [,length]);

substr方法返回從指定位置開(kāi)始截取指定長(zhǎng)度的字符串,如果沒(méi)有指定長(zhǎng)度,則從指定位置截取,到末尾結(jié)束;不支持負(fù)數(shù)。

示例:

說(shuō)明:在上述示例中,當(dāng)指定length字符個(gè)數(shù)時(shí),會(huì)從指定的位置開(kāi)始輸出一定個(gè)數(shù)的字符。

轉(zhuǎn)換類型有以下7種:

(1)mystr.split("以什么分割"[,limit]);

split方法將一個(gè)字符串分割成數(shù)組,limit用來(lái)限制返回?cái)?shù)組中元素的個(gè)數(shù)。

示例:

(2)toLowerCase();

toLowerCase方法用于把字符串中的字母轉(zhuǎn)換為小寫,并返回一個(gè)字符串。

示例:

(3)toUpperCase();

toUpperCase方法用于將字符串中的字母轉(zhuǎn)換為大寫,并返回一個(gè)字符串。

示例:

(4)trim();

trim方法用于刪除字符串兩邊的空格。

示例:

(5)charCodeAt();與codePointAt();

在JavaScript 內(nèi)部,字符以UTF-16 的格式儲(chǔ)存,每個(gè)字符固定為兩個(gè)字節(jié)。對(duì)于那些需要4 個(gè)字節(jié)儲(chǔ)存的字符(Unicode 碼點(diǎn)大于0xFFFF 的字符),JavaScript 會(huì)認(rèn)為它們是兩個(gè)字符。

示例:

說(shuō)明:上述示例中,漢字“吉”不是吉利的“吉”,是“吉”的異體字,碼點(diǎn)為0x20BB7。需要4 個(gè)字節(jié)的字符存儲(chǔ)。通過(guò)方法charCodeAt()分別返回了前兩個(gè)字節(jié)和后兩個(gè)字節(jié)的值。

ES6提供了codePointAt方法,能夠正確處理4個(gè)字節(jié)儲(chǔ)存的字符,返回一個(gè)字符的碼點(diǎn)。

上述示例中,codePointAt方法正確返回了漢字“吉”的碼點(diǎn)。

因此,對(duì)于32位的UTF-16字符的碼點(diǎn),通過(guò)codePointAt方法能夠正確返回。對(duì)于常規(guī)的兩個(gè)字節(jié)存儲(chǔ)的字符,codePointAt方法和charCodeAt方法相同。

(6)String.fromCharCode();與String.fromCodePoint();

ES6提供了String.fromCodePoint方法,它與ES5中的String.fromCharCode方法一樣,用于從碼點(diǎn)返回對(duì)應(yīng)的字符。不同之處在于,String.fromCodePoint 方法可以識(shí)別 0xFFFF 的字符,彌補(bǔ)了String.fromCharCode方法的不足。在作用上,正好與codePointAt方法相反。

示例:

示例輸出結(jié)果如圖5-1所示。

圖5-1

如果String.fromCodePoint方法有多個(gè)參數(shù),則它們會(huì)被合并成一個(gè)字符串返回。

(7)repeat();

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

示例:

5.4 數(shù)組對(duì)象

Array 數(shù)組對(duì)象也是JavaScript 的內(nèi)置對(duì)象之一,常用于在單個(gè)變量中存儲(chǔ)多個(gè)值,且允許數(shù)組中含有不同數(shù)據(jù)類型的元素,即數(shù)組元素可以是對(duì)象或其他的數(shù)組。

5.4.1 數(shù)組對(duì)象的屬性

1)length:返回或設(shè)置數(shù)組元素的個(gè)數(shù)。因?yàn)閿?shù)組的索引總是從0開(kāi)始,所以一個(gè)數(shù)組的下標(biāo)范圍是從0到length-1。再次注意,JavaScript數(shù)組的length屬性是可變的。

示例:

2)prototype屬性:返回對(duì)象類型原型的引用。

示例:

3)constructor屬性:表示創(chuàng)建對(duì)象的函數(shù)。

示例:

5.4.2 數(shù)組對(duì)象的方法

在數(shù)組中有很多預(yù)定義的方法,接下來(lái)按照分類一一進(jìn)行介紹。

添加或刪除類有以下5種:

(1)myarr.push(元素1,元素2,…);

push方法用來(lái)向數(shù)組的末尾添加元素,返回值為新數(shù)組的長(zhǎng)度;一次可以添加多個(gè)元素。

示例:

說(shuō)明:通過(guò)push 方法返回的是新數(shù)組的長(zhǎng)度,當(dāng)再次訪問(wèn)數(shù)組時(shí)返回的是添加后的結(jié)果,說(shuō)明push方法會(huì)影響原數(shù)組。

(2)myarr.unshift(元素1,元素2,…);

unshift 方法用來(lái)向數(shù)組的開(kāi)頭添加元素,返回值為新數(shù)組的長(zhǎng)度;一次可以添加多個(gè)元素。

示例:

說(shuō)明:在上述示例中,返回一個(gè)新的數(shù)組,說(shuō)明unshift方法也會(huì)影響原數(shù)組。

(3)myarr.pop();

pop方法用來(lái)刪除數(shù)組中的最后一個(gè)元素,返回值為刪除的元素。

示例:

說(shuō)明:在上述示例中,返回來(lái)一個(gè)新的數(shù)組,說(shuō)明pop方法也會(huì)影響原數(shù)組。

(4)myarr.shift();

shift方法用來(lái)刪除數(shù)組的第一個(gè)元素,返回值為刪除的元素。

示例:

說(shuō)明:在上述示例中,說(shuō)明shift方法也會(huì)影響原數(shù)組。

(5)myarr.splice(index,數(shù)量,item1,item2...);

splice方法用來(lái)刪除、添加或替換數(shù)組中的元素,是個(gè)“萬(wàn)能”的方法。

index:表示從哪里開(kāi)始刪除或添加,必須是數(shù)值類型的(從0開(kāi)始計(jì)算)。

數(shù)量:規(guī)定了刪除的個(gè)數(shù),如果為0,則表示不刪除,否則表示添加。

示例:

說(shuō)明:當(dāng)用splice 方法刪除或替換元素時(shí),會(huì)返回被刪除的元素;當(dāng)用splice 方法插入元素時(shí),會(huì)返回一個(gè)空數(shù)組。

數(shù)組的轉(zhuǎn)換方法如下:

join 方法用于將數(shù)組按照指定的分隔符轉(zhuǎn)換為字符串,如果沒(méi)有分隔符,則默認(rèn)為以“,”來(lái)分隔。返回值為組成的字符串。

示例:

說(shuō)明:在上述示例中,使用了不同的分隔符。

數(shù)組的截取方法如下:

slice 方法從已有的數(shù)組中返回選定的元素,即從指定位置開(kāi)始截取,到指定位置(不包括)結(jié)束。如果沒(méi)有指定結(jié)束位置,則從指定位置開(kāi)始,到末尾結(jié)束。支持負(fù)數(shù)(從-1 開(kāi)始),返回值為新數(shù)組,不會(huì)破壞原數(shù)組。

示例:

說(shuō)明:在上述示例中,當(dāng)操作后再次返回?cái)?shù)組arr時(shí),還是原數(shù)組,表明slice方法不會(huì)影響原數(shù)組。

數(shù)組的連接方法如下:

concat方法用于連接兩個(gè)或更多個(gè)數(shù)組,并返回新數(shù)組。該方法不會(huì)影響原數(shù)組。

示例:

數(shù)組的排序方法如下:

sort方法用于對(duì)數(shù)組中的元素進(jìn)行排序。排序順序可以按照字母順序或數(shù)字順序,并按升序或降序排列。如果沒(méi)有參數(shù),則從字符的編碼開(kāi)始按照順序排列。

如果有參數(shù),則這個(gè)參數(shù)必須是一個(gè)函數(shù)(回調(diào)函數(shù))。這個(gè)回調(diào)函數(shù)有兩個(gè)參數(shù),即a、b。

示例:

說(shuō)明:在上述示例中,sort 排序默認(rèn)為升序。當(dāng)元素為字符串時(shí),會(huì)比較每個(gè)元素對(duì)應(yīng)的Unicode編碼大小并進(jìn)行排序。

示例:

說(shuō)明:在上述示例中,通過(guò)回調(diào)函數(shù)來(lái)設(shè)置數(shù)組排序的規(guī)則是升序還是降序。

數(shù)組的過(guò)濾方法如下:

filter方法會(huì)創(chuàng)建一個(gè)新數(shù)組,新數(shù)組中的元素為通過(guò)檢查指定數(shù)組中符合條件的所有元素。在回調(diào)函數(shù)中定義判斷條件,返回值為所有判斷結(jié)果為真的值組成的新數(shù)組。

示例:

數(shù)組的映射方法如下:

map 方法會(huì)返回一個(gè)新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值,即在回調(diào)函數(shù)中返回新值。

示例:

說(shuō)明:在上述示例中,在回調(diào)函數(shù)中返回了新值,map 方法的返回值為回調(diào)函數(shù)中返回的新值組成的新數(shù)組。

數(shù)組的查找有以下兩種方法:

(1)indexOf(item)

indexOf 用來(lái)返回?cái)?shù)組中某個(gè)指定的字符串值第一次出現(xiàn)的位置,從指定位置起從前向后搜素。若沒(méi)有找到,則返回-1。

如果沒(méi)有指定起始位置,將從字符串的開(kāi)始位置查找。

indexOf 方法最基本的思想還是先循環(huán)整個(gè)數(shù)組,將每次循環(huán)出來(lái)的結(jié)果與要查找的元素進(jìn)行匹配,最終返回我們想要的結(jié)果。接下來(lái)先從for循環(huán)入手,實(shí)現(xiàn)元素的查找。

示例:

萬(wàn)變不離其宗,indexOf方法還是基于for循環(huán)的思想,只不過(guò)使用起來(lái)更加方便。下面再用indexOf方法實(shí)現(xiàn)上個(gè)示例。

示例:

說(shuō)明:在上述示例中,indexOf方法實(shí)現(xiàn)的原理機(jī)制和for循環(huán)機(jī)制一樣。

(2)lastIndexOf(item)

lastIndexOf 方法返回?cái)?shù)組中某個(gè)指定的字符串值最后一次出現(xiàn)的位置,和indexOf 方法正好相反。

示例:

說(shuō)明:在上述示例中,通過(guò)lastIndexOf方法從頭到尾地檢索,看數(shù)組中是否包含1,如果找到,則返回1在數(shù)組中最后一次出現(xiàn)的位置。

數(shù)組的判斷有以下兩種方法:

(1)every()

every 方法用來(lái)檢測(cè)數(shù)組中的每一項(xiàng)元素是否符合條件,即在回調(diào)函數(shù)中進(jìn)行判斷,如果有一個(gè)元素不滿足條件,則整個(gè)表達(dá)式返回false,且其他元素將不再進(jìn)行判斷;如果所有元素都滿足條件,則返回true。注意,every方法不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。

既然 every 方法是檢測(cè)數(shù)組中的每一個(gè)元素,那么此處還是先用for 循環(huán)來(lái)切入,方便大家理解記憶。

示例:

接下來(lái)再用every方法實(shí)現(xiàn)一下:

說(shuō)明:通過(guò)以上兩個(gè)示例可以發(fā)現(xiàn),every方法的實(shí)現(xiàn)原理還是for循環(huán)。

(2)some(function(item,index){})

some 方法用于檢測(cè)數(shù)組中的每一個(gè)元素是否滿足指定的條件,即在回調(diào)函數(shù)中對(duì)每個(gè)元素依次進(jìn)行判斷,如果有一個(gè)元素滿足條件,則表達(dá)式將返回true,且其他元素將不再進(jìn)行判斷;如果沒(méi)有滿足條件的元素,則返回false。注意,some 方法不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)。

同理,此處讀者也可以嘗試用for循環(huán)先實(shí)現(xiàn)一下。

用some方法實(shí)現(xiàn),示例如下:

說(shuō)明:在上述示例中,通過(guò)some 方法可以檢測(cè)數(shù)組中是否有元素小于3,并不會(huì)改變?cè)紨?shù)組。

數(shù)組的轉(zhuǎn)換有以下兩種方法:

(1)Array.from()

Array.from 方法用于將兩個(gè)類對(duì)象轉(zhuǎn)換為真正的數(shù)組,即類似數(shù)組的對(duì)象(array-like object)和可遍歷(iterable)的對(duì)象。

示例:

Array.from方法可以處理NodeList對(duì)象和arguments對(duì)象。

示例:

(2)Array.of()

Array.of方法用于將一組值轉(zhuǎn)換為數(shù)組。

示例:

這個(gè)方法的主要目的是彌補(bǔ)數(shù)組構(gòu)造函數(shù)Array()的不足。

示例:

5.4.3 數(shù)組對(duì)象的構(gòu)造函數(shù)的方法

1)Array.from 方法用于將兩類對(duì)象轉(zhuǎn)換為真正的數(shù)組,即類似數(shù)組的對(duì)象和可遍歷的對(duì)象。

示例:

2)Array.of 方法用于將一組值轉(zhuǎn)換為數(shù)組。Array.of 方法總是返回參數(shù)值組成的數(shù)組。如果沒(méi)有參數(shù),則返回一個(gè)空數(shù)組。

示例:

3)Array.isArray方法用于判斷某個(gè)值是否為數(shù)組,返回的值為布爾類型。

示例:

5.5 日期對(duì)象

現(xiàn)如今,無(wú)論是網(wǎng)頁(yè)中還是一個(gè)游戲中,都會(huì)涉及對(duì)時(shí)間的處理,JavaScript 專門提供了日期對(duì)象。

Date對(duì)象是JavaScript提供的日期和時(shí)間的接口操作,在JavaScript中DATE使用UTC(國(guó)際協(xié)調(diào)時(shí)間),它能夠表示的時(shí)間范圍是1970年1月1日00:00:00前后的各一億天,之前為負(fù),之后為正,取值范圍為285616年。

日期也是JavaScript 的一個(gè)內(nèi)置對(duì)象,若想對(duì)日期進(jìn)行獲取和操作,就必須實(shí)例化對(duì)象。

5.5.1 定義日期對(duì)象

使用關(guān)鍵字new來(lái)定義一個(gè)Date對(duì)象,語(yǔ)法格式如下:

說(shuō)明:日期對(duì)象會(huì)自動(dòng)獲取當(dāng)前的日期和時(shí)間作為初始值,包括年、月、日、時(shí)、分、秒、星期、時(shí)區(qū)。

當(dāng)傳入?yún)?shù)時(shí),即得到時(shí)間參數(shù)。可傳入的參數(shù)格式如下:

"時(shí):分:秒 月/日/年"或"月/日/年時(shí):分:秒"或字符串。

年,月,日,時(shí),分,秒,不能加""。

不傳參會(huì)得到當(dāng)前時(shí)間的信息。

Date對(duì)象可以作為普通函數(shù)直接調(diào)用,返回一個(gè)代表當(dāng)前時(shí)間的字符串。

示例:

5.5.2 獲取日期信息的方法

一般在項(xiàng)目中會(huì)獲取一下時(shí)間相關(guān)的信息,表5-2所示是常用的獲取日期信息的方法。

表5-2

(續(xù))

5.5.3 設(shè)置日期的方法

設(shè)置日期的方法見(jiàn)表5-3。

表5-3

表5-2 和表5-3 列出了常用的操作日期的方法,通過(guò)Date 對(duì)象可以很方便地對(duì)日期進(jìn)行操作,下面通過(guò)示例深入理解日期對(duì)象的用法。

在下面的示例中,通過(guò)setFullYear方法設(shè)置一個(gè)日期對(duì)象為指定的日期。

示例:

日期是可以進(jìn)行比較的,下面獲取當(dāng)天的日期,與之前設(shè)置的日期進(jìn)行比較。

示例:

下面對(duì)于日期對(duì)象的獲取方法來(lái)展示一個(gè)示例:

對(duì)于日期對(duì)象的應(yīng)用,在后續(xù)章節(jié)中將通過(guò)一些示例來(lái)更好地闡述。

5.6 正則

本節(jié)將重點(diǎn)介紹正則表達(dá)式,簡(jiǎn)單地說(shuō),正則表達(dá)式就是一個(gè)文本模式的匹配工具,在JavaScript 中,正則表達(dá)式一般被用來(lái)匹配字符串中的字符組合。但是為什么非得用正則表達(dá)式呢?下面通過(guò)一個(gè)示例來(lái)了解正則表達(dá)式在實(shí)際項(xiàng)目中的應(yīng)用。

示例:

從上述示例中可知,如果不使用正則表達(dá)式,判斷會(huì)比較麻煩,使用正則表達(dá)式則簡(jiǎn)單很多。

正則表達(dá)式雖然用起來(lái)比較簡(jiǎn)單,但是它的規(guī)則很多。

5.6.1 正則表達(dá)式的概念

正則表達(dá)式是一個(gè)描述字符模式的對(duì)象。簡(jiǎn)單地說(shuō),是一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)語(yǔ)法規(guī)則的字符串的語(yǔ)言。在很多文本編輯器或其他工具里,正則表達(dá)式通常被用來(lái)檢索、替換或拆分那些符合某個(gè)模式的文本內(nèi)容。許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。

5.6.2 應(yīng)用場(chǎng)合

在實(shí)際項(xiàng)目開(kāi)發(fā)中有很多場(chǎng)合都需要使用正則表達(dá)式,那么哪些場(chǎng)合下會(huì)用到正則呢?

1)數(shù)據(jù)驗(yàn)證。

2)文本替換。

3)內(nèi)容檢索。

4)過(guò)濾內(nèi)容。執(zhí)行字符串函數(shù)無(wú)法完成的特殊的匹配、拆分、替換功能等。

5.6.3 創(chuàng)建正則表達(dá)式

在JavaScript中,正則表達(dá)式是通過(guò)對(duì)象的方式來(lái)創(chuàng)建的,它有自己的方法。

1. 通過(guò)構(gòu)造函數(shù)創(chuàng)建

通過(guò)構(gòu)造函數(shù)創(chuàng)建表達(dá)式又稱為顯示的創(chuàng)建,即通過(guò)構(gòu)造函數(shù)RegExp()來(lái)實(shí)現(xiàn)。語(yǔ)法格式如下:

構(gòu)造函數(shù)RegExp()有兩個(gè)參數(shù)要傳,第一個(gè)參數(shù)為正則表達(dá)式,第二個(gè)參數(shù)是一個(gè)可選項(xiàng),即模式修飾符。各個(gè)修飾符的含義如下:

1)g表示全局匹配,即匹配字符串中出現(xiàn)的所有模式。

2)i表示忽略字母大小寫,即在匹配字符串時(shí)不區(qū)分字母大小寫。

3)m表示進(jìn)行多行匹配。

如下示例中都是有效的正則表達(dá)式。

通常將正則表達(dá)式字符串放在/RegExp/中間,//稱為定界符。

匹配邊界有以下兩種情況:

(1)字符邊界

1)^ 匹配字符串的開(kāi)始。

2)$ 匹配字符串的結(jié)束,忽略換行符。

(2)單詞邊界限制

1)\b 匹配單詞的邊界。

2)\B 匹配除單詞邊界以外的部分。

2. 通過(guò)字面量方式創(chuàng)建

通過(guò)字面量方式創(chuàng)建又稱為隱式創(chuàng)建,即將文字量的正則表達(dá)式賦值給一個(gè)變量。語(yǔ)法格式如下:

其中,正則表達(dá)式為指定的匹配模式,模式修飾符是可選項(xiàng)。

5.6.4 正則表達(dá)式的模式

1. 原子

原子是正則表達(dá)式中最小的元素,包括英文、標(biāo)點(diǎn)符號(hào)等。每個(gè)原子都有自己特殊的含義,具體如下:

\d——匹配任意一個(gè)數(shù)字。

\D——與除了數(shù)字以外的任何一個(gè)字符匹配。

\w——與任意一個(gè)英文字母,數(shù)字或下畫線匹配。

\W——除了字母,數(shù)字、下畫線外,與任何一個(gè)字符匹配。

\s——與任意一個(gè)空白字符匹配。

\n——換行字符。

\f——換頁(yè)字符。

\r——回車字符。

\t——制表符。

\v——垂直制表符。

\S——與除了空白符以外任意一個(gè)字符匹配。

2. 原子表

方括號(hào)可用于查找某個(gè)范圍內(nèi)的字符,具體如下:

[]——只匹配其中的一個(gè)原子。

[^]——匹配除了當(dāng)前原子表中定義的原子外的字符。

[0-9]——匹配0~9中的任意一個(gè)數(shù)字。

[a-z]——匹配小寫a~z中的任意一個(gè)字母。

[A-Z]——匹配大寫A~Z中的任意一個(gè)字母。

3. 元字符

在正則表達(dá)式中有一些特殊字符,代表著特殊意義,叫作元字符。

. 代表除換行符以外的任何一個(gè)字符。

| 代表或的意思,匹配其中一項(xiàng)就代表匹配。

4. 原子分組

匹配多個(gè)字符時(shí)用()分組,分組代表一個(gè)原子集合或一個(gè)大原子,并壓入堆棧(內(nèi)存)用于調(diào)用。組號(hào)是從左到右計(jì)數(shù)的,調(diào)用時(shí)如果是字面量形式,則用\1;如果是構(gòu)造函數(shù)方式,則用\1,這種方式稱為反向引用。

示例:

5. 取消反向引用

使用形如(?:pattern)的正則就可以避免保存括號(hào)內(nèi)的匹配結(jié)果,反向引用也將失效。

6. 量詞

可以使用一些元字符,重復(fù)表示一些元子或元字符,具體如下:

*——重復(fù)零次或更多次。

+——重復(fù)一次或更多次。

?——重復(fù)零次或一次。

{n}——重復(fù)n次。

{n,}——重復(fù)n次或更多次。

{n,m}——重復(fù)n到m次。

7. 貪婪和吝嗇

正則匹配是貪婪的,但并不意味著禁用,具體如下:

*?——重復(fù)任意次,但盡可能少重復(fù)。

+?——重復(fù)1次或更多次,但盡可能少重復(fù)。

??——重復(fù)0次或1次,但盡可能少重復(fù)。

{n,m}?——重復(fù)n到m次,但盡可能少重復(fù)。

{n,}?——重復(fù)n次以上,但盡可能少重復(fù)。

模式匹配的順序(從高到低)見(jiàn)表5-4。

表5-4

5.6.5 正則方法

正則表達(dá)式對(duì)象RegExp提供了兩個(gè)可用的方法:test()和exec()。

1.RegExp.test()

方法test()用來(lái)測(cè)試字符串中是否包含了匹配該正則表達(dá)式的子串,如果包含,則返回true,否則返回false。

示例:

說(shuō)明:在上述示例中,使用正則表達(dá)式/uek/i 來(lái)檢測(cè)str 字符串中是否包含匹配的子串,且匹配時(shí)不區(qū)分字母大小寫。最終得到的結(jié)果是true,所以會(huì)返回并顯示“找到了指定字符串”。

2.RegExp.exec()

方法exec()功能非常強(qiáng)大,是一個(gè)通用的方法,用來(lái)在字符串中匹配正則,并將結(jié)果保存在一個(gè)數(shù)組中即成功返回,失敗返回null。

返回的數(shù)組包含特殊屬性:

1)input表示被查找字符串。

2)index表示子字符串位置。

如果正則表達(dá)式?jīng)]有設(shè)置g,那么exec方法不會(huì)對(duì)正則表達(dá)式有任何的影響。如果設(shè)置了g,那么exec執(zhí)行后會(huì)更新正則表達(dá)式的lastIndex屬性,表示本次匹配后所匹配的字符串的下一個(gè)字符的索引,下一次再用這個(gè)正則表達(dá)式匹配字符串時(shí)就會(huì)從上次的lastIndex屬性開(kāi)始匹配。

示例:

說(shuō)明:方法exec()返回的數(shù)組對(duì)象還有一個(gè)擴(kuò)展的屬性,且這個(gè)屬性在普通的數(shù)組中是沒(méi)有的,這個(gè)屬性是index,它返回的是匹配字符串的開(kāi)始位置,除此之外,還有其他的擴(kuò)展屬性,示例如下:

說(shuō)明:在上述示例中,通過(guò)方法exec()返回的數(shù)組對(duì)象擴(kuò)展的屬性可以獲取更多詳細(xì)的信息,最終返回結(jié)果為:“字符串長(zhǎng)度為1;被搜索的字符串為abc de fg de;起始位置為4”。

5.6.6 字符串中用到正則的函數(shù)

在JavaScript中,正則表達(dá)式通常用于以下字符串方法:search()、replace()和split(),在字符串對(duì)象一節(jié)中也有提到過(guò)。

(1)search(regexp)

regexp 為正則表達(dá)式,返回索引位置,不支持全局索引(即g修飾符無(wú)效),找到即停止搜索。

示例:

說(shuō)明:使用正則表達(dá)式搜索字符串Regexp,且不區(qū)分字母大小寫。最終返回搜索字符串的起始位置7。

(2)replace(正則或字符串,替換內(nèi)容)

支持全局g修飾符,如果模式不是全局,則當(dāng)匹配到一個(gè)以后將不會(huì)繼續(xù)匹配,反之則會(huì)繼續(xù)往下匹配。

示例:

說(shuō)明:在上述示例中,使用正則表達(dá)式且不區(qū)分字母大小寫,將字符串中的Regexp 替換為UEK,最終返回的結(jié)果就是替換后的字符串“search UEK”。

(3)split 方法

split 方法用于拆分字符串,參數(shù)可以為字符串或正則表達(dá)式。

示例:

5.7 Set數(shù)據(jù)結(jié)構(gòu)

5.7.1 Set基本用法

Set數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組,但是它的成員都是唯一的。

示例:

在函數(shù)Set()中可以傳入一個(gè)數(shù)組類型的參數(shù)。

示例:

在Set 中判斷是否重復(fù),使用的是“Same-value equality”,類似于“===”,但是有例外,其中NaN不等于NaN。

示例:

5.7.2 Set屬性和方法

1. 屬性

1)Set.prototype.constructor:構(gòu)造函數(shù),默認(rèn)是Set 函數(shù)。

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

2. 方法

1)add(value):添加某個(gè)值,返回Set結(jié)構(gòu)本身。

2)delete(value):刪除某個(gè)值,返回一個(gè)布爾值,表示刪除是否成功。

3)has(value):返回一個(gè)布爾值,表示該值是否為Set的成員。

4)clear():清除所有成員,沒(méi)有返回值。

示例:

5.7.3 Set遍歷方法

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

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

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

由于Set 結(jié)構(gòu)沒(méi)有鍵名,只有鍵值(或者說(shuō)鍵名和鍵值是同一個(gè)值),因此keys 方法和values方法完全一致。

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

4)forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員。

示例:

5.7.4 WeakSet

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

WeakSet 中的對(duì)象都是弱引用,垃圾回收機(jī)制不考慮 WeakSet 對(duì)該對(duì)象的引用,也就是說(shuō),如果其他對(duì)象都不再引用該對(duì)象,那么垃圾回收機(jī)制會(huì)自動(dòng)回收該對(duì)象所占用的內(nèi)存,不考慮該對(duì)象是否還存在于WeakSet 中。這意味著,無(wú)法引用WeakSet 的成員,因此WeakSet是不可遍歷的。

5.8 Map數(shù)據(jù)結(jié)構(gòu)

JavaScript對(duì)象本質(zhì)上是鍵值對(duì)的集合。之前,只能用字符串當(dāng)作鍵。

Map 數(shù)據(jù)結(jié)構(gòu)類似于對(duì)象,也是鍵值對(duì)的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對(duì)象)都可以當(dāng)作鍵。

Object 結(jié)構(gòu)提供了“字符串—值”的對(duì)應(yīng),Map結(jié)構(gòu)提供了“值—值”的對(duì)應(yīng),是一種更完善的Hash結(jié)構(gòu)實(shí)現(xiàn)。

所以需要“鍵值對(duì)”的數(shù)據(jù)結(jié)構(gòu)時(shí),Map比Object更合適。

5.8.1 Map 基本用法

1)Map 作為一個(gè)構(gòu)造函數(shù),可以接受一個(gè)數(shù)組當(dāng)作參數(shù)。

2)Map 結(jié)構(gòu)中,字符串“true”和布爾值true 是兩個(gè)不同的鍵值。

示例:

只有對(duì)同一個(gè)對(duì)象的引用,Map結(jié)構(gòu)才將其視為同一個(gè)鍵。所以下例中,set和get中的[1]不是同一個(gè)鍵。

雖然NaN不嚴(yán)格相等于自身,但Map將其視為同一個(gè)鍵。

示例:

5.8.2 Map 屬性和方法

1. 屬性

size屬性用于返回Map結(jié)構(gòu)的成員個(gè)數(shù)。

示例:

2. 方法

1)方法set()返回的是Map本身,因此也可以采用鏈?zhǔn)綄懛ā?/p>

示例:

2)方法get()讀取對(duì)應(yīng)的鍵值,如果找不到傳入的鍵值,則返回undefined。

示例:

3)方法has()返回一個(gè)布爾值,表示該鍵值是否在Map 結(jié)構(gòu)中。

示例:

4)方法delete()用于刪除某個(gè)鍵,刪除成功,則返回true;如果刪除失敗,則返回false。

示例:

5)方法clear()用于清除所有成員,沒(méi)有返回值。

示例:

5.8.3 Map 遍歷方法

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

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

3)entries():返回所有成員的遍歷器。

示例:

5.8.4 Map與數(shù)組對(duì)象的轉(zhuǎn)換

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

示例:

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

示例:

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

如果所有Map的鍵都是字符串,則它可以轉(zhuǎn)換為對(duì)象。

示例:

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

示例:

5.8.5 WeakMap

WeakMap 結(jié)構(gòu)與Map 結(jié)構(gòu)基本類似,唯一的區(qū)別是它只接受對(duì)象作為鍵名(null 除外),不接受其他類型的值作為鍵名。

鍵名所指向的對(duì)象,不進(jìn)入垃圾回收機(jī)制。

示例:

主站蜘蛛池模板: 广州市| 梅河口市| 丰台区| 临潭县| 玉林市| 元谋县| 吴江市| 津南区| 定兴县| 靖西县| 宝山区| 侯马市| 平阳县| 南宫市| 安丘市| 东乡| 方城县| 开封县| 信宜市| 嘉禾县| 白朗县| 通化县| 秦安县| 钟山县| 建阳市| 博客| 儋州市| 朔州市| 长垣县| 陵水| 罗田县| 金秀| 登封市| 绥芬河市| 芷江| 通许县| 麦盖提县| 康马县| 柘荣县| 兴安县| 潼关县|